xmake v2.5.5 釋出,支援下載整合二進位制映象包
xmake 是一個基於 Lua 的輕量級跨平臺構建工具,使用 xmake.lua 維護專案構建,相比 makefile/CMakeLists.txt,配置語法更加簡潔直觀,對新手非常友好,短時間內就能快速入門,能夠讓使用者把更多的精力集中在實際的專案開發上。
2.5.5 版本中,我們繼續改進遠端包整合的體驗,實現在雲端預編譯包,然後直接下載整合預編譯的二進位制包。這對於一些編譯非常慢的包,可以極大的減少包的安裝時間。
另外,新版本中,我們還重新實現了新版的本地包生成方案,完全無縫支援 add_requires
和 add_packages
,從此遠端包和本地包可以使用統一的整合方式來維護。
新特性介紹
下載安裝預編譯包
之前 xmake 內建的包管理器每次安裝包,都必須下載對應的包原始碼,然後執行本地編譯安裝整合,這對於一些編譯非常慢的大包,以及一些依賴的編譯工具非常多的包,安裝起來會非常的慢。
尤其是在 windows 上,不僅三方包對編譯環境的依賴更加複雜,而且很多打包編譯非常慢,例如:boost, openssl 等等。
為此,我們基於 github action 實現對包的雲端預編譯,會將常用配置的包都去預編譯一遍,然後儲存到 build-artifacts 倉庫的 Releases 下。
然後,我們在安裝包的時候,會自動從二進位制映象包源下載,實現快速整合(目前僅支援預編譯 windows 包,後期會逐步放開到其他平臺)。
我們會預編譯每個包的 plat/arch/MT/MD/static/shared 等各種配置組合,根據唯一的 buildhash 來精確拉取使用者實際需要的包,所有的編譯產物都會用 7zip 壓縮打包,如下圖:
配置映象源加速下載
由於我們的預編譯產物都放置在 github 上,對於國內使用者,考慮到訪問 github 並不是很穩定,我們也可以藉助 xmake 映象代理功能,將實際的下載自動切換到 fastgit 等映象站點加速下載。
我們可以通過一個 pac.lua 檔案,配置映象代理規則,比如對所有 github.com 域名的訪問切到 hub.fastgit.org 域名,實現加速下載包。
pac.lua 配置:
function mirror(url)
return url:gsub("github.com", "hub.fastgit.org")
end
然後我們設定這個 pac.lua 檔案,預設路徑在 ~/.xmake/pac.lua
,也可以手動配置使用指定位置的 pac.lua 。
$ xmake g --proxy_pac=/tmp/pac.lua
然後,我們安裝包的時候,如果遇到 github.com 域名下的包源,下載時候會自動切到 fastgit 映象加速下載。
$ xrepo install libpng
> curl https://hub.fastgit.org/glennrp/libpng/archive/v1.6.37.zip -o v1.6.37.zip
因此,所有走預編譯產物的下載也會得到提速,當然國內提供 github 映象加速的不止 fastgit 一家,使用者也可以切換到其他映象源,比如 cnpmjs.org 等等。
如何觸發雲端預編譯
預設情況下,xmake 不會主動進行所有包的雲端預編譯快取,這樣太耗時耗力,目前僅僅只有提交 pr 到 xmake-repo 官方包倉庫,進行新包收錄或者包版本更新時候,才會自動觸發對應包的雲端預編譯行為。
所以,如果使用者想要貢獻包進我們的倉庫,基本上都是可以被預編譯快取的(除了 headeronly 庫),而如果使用者不想貢獻包,也想獲取對應包的預編譯加速,也是可以的。
只需要提交 pr 到 build-artifacts 倉庫的 build 分支,編輯 build.txt 檔案,修改裡面需要觸發預編譯的包名和版本列表就行了,例如:
build.txt
{
name = "asmjit",
versions = {
"2021.06.27"
}
}
只要 pr 被 merge 之後,就會自動觸發預編譯行為,然後生成最終的編譯產物到 releases 。
強制原始碼編譯安裝
儘管我們提供了預編譯下載安裝的方式,但是如果使用者還是想原始碼編譯安裝,我們也可以手動傳入 --build
引數給 xrepo 命令,來強制切換到原始碼編譯安裝模式。
$ xrepo install --build openssl
在 xmake.lua 中,我們也可以同樣支援原始碼編譯安裝。
add_requires("openssl", {build = true})
如果沒有指定,那麼 xmake 會自動優先嚐試走預編譯包的下載安裝。
新增私有預編譯包倉庫
我們的官方預編譯包倉庫在:build-artifacts。
同樣,我們也可以配置新增自有的預編譯倉庫,新增方式類似:
$ xmake repo --add local-repo [email protected]:xmake-mirror/myrepo-artifacts.git
也可以在 xmake.lua 中新增:
add_repositories("local-repo [email protected]:xmake-mirror/myrepo-artifacts.git")
新版本地包方案
預設打包格式
新版本中,我們提供了一種新的本地包打包方案,將會更加無縫的對接 add_requires
和 add_packages
。
我們執行 xmake package
命令就能夠生成預設的新版打包格式。
$ xmake package
package(foo): build/packages/f/foo generated
它將會產生 build/packages/f/foo/xmake.lua
檔案,內容如下:
package("foo")
set_description("The foo package")
set_license("Apache-2.0")
add_deps("add", "sub")
on_load(function (package)
package:set("installdir", path.join(os.scriptdir(), package:plat(), package:arch(), package:mode()))
end)
on_fetch(function (package)
local result = {}
result.links = "foo"
result.linkdirs = package:installdir("lib")
result.includedirs = package:installdir("include")
return result
end)
其實就是採用 package()
來定義描述本地包,就跟遠端包一樣。
而生成的目錄結構如下:
$ tree build/packages/f/foo/
build/packages/f/foo/
├── macosx
│ └── x86_64
│ └── release
│ ├── include
│ │ └── foo.h
│ └── lib
│ └── libfoo.a
└── xmake.lua
我們也能夠使用 add_requires
/add_repositories
介面來無縫整合這個包。
add_rules("mode.debug", "mode.release")
add_repositories("local-repo build")
add_requires("foo")
target("bar")
set_kind("binary")
add_files("src/*.cpp")
add_packages("foo")
其中,add_repositories
配置指定本地包的倉庫根目錄,然後就可以通過 add_requires
來引用這個包了。
另外,生成的本地包,還有一個特性,就是支援 target/add_deps
,會自動關聯多個包的依賴關係,整合時候,也會自動對接所有依賴連結。
這裡有完整的測試例子。
"/usr/bin/xcrun -sdk macosx clang++" -o build/macosx/x86_64/release/bar build/.objs/bar/macosx/x86_64/release/src/main.cpp.o -arch x86_64 -mmacosx-version-min=10.15 -isysroot
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.0.sdk -stdlib=libc++
-L/Users/ruki/projects/personal/xmake/tests/actions/package/localpkg/bar/build/packages/f/foo/macosx/x86_64/release/lib
-L/Users/ruki/projects/personal/xmake/tests/actions/package/localpkg/bar/build/packages/s/sub/macosx/x86_64/release/lib
-L/Users/ruki/projects/personal/xmake/tests/actions/package/localpkg/bar/build/packages/a/add/macosx/x86_64/release/lib
-Wl,-x -lfoo -lsub -ladd -lz
備註:之前的老版本本地打包格式屬於早期產物,還是會被保留,但是不推薦繼續使用,想要繼續使用,可以執行下面的命令打包:
$ xmake package -f oldpkg
生成遠端包
除了本地包格式,xmake package
現在也支援生成遠端包,便於使用者將他們快速提交到遠端倉庫。
我們只需要在打包時候,修改包格式。
$ xmake package -f remote
他也會產生 packages/f/foo/xmake.lua 檔案。
package("foo")
set_description("The foo package")
set_license("Apache-2.0")
add_deps("add", "sub")
add_urls("https://github.com/myrepo/foo.git")
add_versions("1.0", "<shasum256 or gitcommit>")
on_install(function (package)
local configs = {}
if package:config("shared") then
configs.kind = "shared"
end
import("package.tools.xmake").install(package, configs)
end)
on_test(function (package)
-- TODO check includes and interfaces
-- assert(package:has_cfuncs("foo", {includes = "foo.h"})
end)
包定義配置相比本地包,多了實際的安裝邏輯,以及 urls 和 versions 的設定,
我們也能夠通過附加引數,去修改 urls,versions 等配置值,例如:
$ xmake package -f remote --url=https://xxxx/xxx.tar.gz --shasum=xxxxx --homepage=xxxxx`
xmake 也會從 target 的 set_license
和 set_version
等配置中讀取相關配置資訊。
從第三方倉庫搜尋包
xmake 內建的 xrepo 包管理器命令,之前可以支援搜尋 xmake-repo 倉庫中的內建包。
$ xrepo search zlib "pcr*"
zlib:
-> zlib: A Massively Spiffy Yet Delicately Unobtrusive Compression Library (in xmake-repo)
pcr*:
-> pcre2: A Perl Compatible Regular Expressions Library (in xmake-repo)
-> pcre: A Perl Compatible Regular Expressions Library (in xmake-repo)
而現在,我們還可以從 vcpkg, conan, conda 以及 apt 等第三方包管理器中搜索它們的包,只需要加上對應的包名稱空間就行,例如:
$ xrepo search vcpkg::pcre
The package names:
vcpkg::pcre:
-> vcpkg::pcre-8.44#8: Perl Compatible Regular Expressions
-> vcpkg::pcre2-10.35#2: PCRE2 is a re-working of the original Perl Compatible Regular Expressions library
$ xrepo search conan::openssl
The package names:
conan::openssl:
-> conan::openssl/1.1.1g:
-> conan::openssl/1.1.1h:
修改目標檔名
我們知道,對於目標檔名的修改,我們可以使用 set_basename
或者使用 set_filename
介面來配置實現,前者修改 libxxx.so
中的 xxx
部分名字,後者可以修改完整的檔名。
但是有些情況,我們僅僅想要修改:副檔名 .so
,字首名 lib
,或者增加字尾名比如:libxxx-d.so
就會很麻煩,要麼使用 set_filename
進行完整修改。
現在,我們新提供了 set_prefixname
, set_suffixname
和 set_extension
三個獨立介面來更加靈活地配置它們。
設定目標檔案的前置名
例如將預設的:libtest.so
改成 test.so
target("test")
set_prefixname("")
設定目標檔案的後置名
例如將預設的:libtest.so
改成 libtest-d.so
target("test")
set_suffixname("-d")
設定目標檔案的副檔名
例如將預設的:libtest.so
改成 test.dll
target("test")
set_prefixname("")
set_extension(".dll")
預設的目標型別
新版本中,如果使用者沒有對 target 設定 set_kind
指定目標型別,那麼預設就是 binary 程式。
因此,我們可以實現更小的配置,例如:
target("test")
add_files("src/*.c")
只需兩行就可以完成一些小專案的編譯,甚至可以更加簡短:
target("test", {files = "src/*.c"})
新增 appletvos 編譯平臺
我們還新增了一個 appletvos 的編譯平臺,用於支援 Apple 的 TVOS 系統上程式的編譯,只需要:
$ xmake f -p appletvos
$ xmake
匯入匯出編譯配置
我們還可以匯入匯出已經配置好的配置集,方便配置的快速遷移。
匯出配置
$ xmake f --export=/tmp/config.txt
$ xmake f -m debug --xxx=y --export=/tmp/config.txt
匯入配置
$ xmake f --import=/tmp/config.txt
$ xmake f -m debug --xxx=y --import=/tmp/config.txt
匯出配置(帶選單)
$ xmake f --menu --export=/tmp/config.txt
$ xmake f --menu -m debug --xxx=y --export=/tmp/config.txt
匯入配置(帶選單)
$ xmake f --menu --import=/tmp/config.txt
$ xmake f --menu -m debug --xxx=y --import=/tmp/config.txt
vs2022 支援
另外,新版本中,我們也增加了對 vs2020 預覽版的支援。
改進 xrepo shell 環境
在上個版本,我們支援了通過在當前目錄下,新增 xmake.lua 檔案,來定製化一些包配置,然後進入特定的包 shell 環境。
add_requires("zlib 1.2.11")
add_requires("python 3.x", "luajit")
$ xrepo env shell
> python --version
> luajit --version
而現在,我們還可以在 xmake.lua 配置載入對應的工具鏈環境,比如載入 vs 的編譯環境。
set_toolchains("msvc")
更新內容
新特性
- #1421: 針對 target 目標,增加目標檔名的字首,字尾和副檔名設定介面。
- #1422: 支援從 vcpkg, conan 中搜索包
- #1424: 設定 binary 作為預設的 target 目標型別
- #1140: 支援安裝時候,手動選擇從第三包包管理器安裝包
- #1339: 改進
xmake package
去產生新的本地包格式,無縫整合add_requires
,並且新增生成遠端包支援 - 新增
appletvos
編譯平臺支援,xmake f -p appletvos
- #1437: 為包新增 headeronly 庫型別去忽略
vs_runtime
- #1351: 支援匯入匯出當前配置
- #1454: 支援下載安裝 windows 預編譯包
改進
- #1425: 改進 tools/meson 去載入 msvc 環境,並且增加一些內建配置。
- #1442: 支援從 git url 去下載包資原始檔
- #1389: 支援新增工具鏈環境到
xrepo env
- #1453: 支援 protobuf 規則匯出標頭檔案搜尋目錄
- 新增對 vs2022 的支援