xmake 是一個基於 Lua 的輕量級跨平臺構建工具,使用 xmake.lua 維護項目構建,相比 makefile/CMakeLists.txt,配置語法更加簡潔直觀,對新手很是友好,短期內就能快速入門,可以讓用戶把更多的精力集中在實際的項目開發上。python
2.5.5 版本中,咱們繼續改進遠程包集成的體驗,實如今雲端預編譯包,而後直接下載集成預編譯的二進制包。這對於一些編譯很是慢的包,能夠極大的減小包的安裝時間。c++
另外,新版本中,咱們還從新實現了新版的本地包生成方案,徹底無縫支持 add_requires
和 add_packages
,今後遠程包和本地包可使用統一的集成方式來維護。git
以前 xmake 內置的包管理器每次安裝包,都必須下載對應的包源碼,而後執行本地編譯安裝集成,這對於一些編譯很是慢的大包,以及一些依賴的編譯工具很是多的包,安裝起來會很是的慢。github
尤爲是在 windows 上,不只三方包對編譯環境的依賴更加複雜,並且不少打包編譯很是慢,例如:boost, openssl 等等。shell
爲此,咱們基於 github action 實現對包的雲端預編譯,會將經常使用配置的包都去預編譯一遍,而後存儲到 build-artifacts 倉庫的 Releases 下。macos
而後,咱們在安裝包的時候,會自動從二進制鏡像包源下載,實現快速集成(目前僅支持預編譯 windows 包,後期會逐步放開到其餘平臺)。npm
咱們會預編譯每一個包的 plat/arch/MT/MD/static/shared 等各類配置組合,根據惟一的 buildhash 來精確拉取用戶實際須要的包,全部的編譯產物都會用 7zip 壓縮打包,以下圖:windows
因爲咱們的預編譯產物都放置在 github 上,對於國內用戶,考慮到訪問 github 並非很穩定,咱們也能夠藉助 xmake 鏡像代理功能,將實際的下載自動切換到 fastgit 等鏡像站點加速下載。緩存
咱們能夠經過一個 pac.lua 文件,配置鏡像代理規則,好比對全部 github.com 域名的訪問切到 hub.fastgit.org 域名,實現加速下載包。bash
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 git@github.com:xmake-mirror/myrepo-artifacts.git
複製代碼
也能夠在 xmake.lua 中添加:
add_repositories("local-repo git@github.com: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 的編譯平臺,用於支持 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
複製代碼
另外,新版本中,咱們也增長了對 vs2020 預覽版的支持。
在上個版本,咱們支持了經過在當前目錄下,添加 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")
複製代碼
xmake package
去產生新的本地包格式,無縫集成 add_requires
,而且新增生成遠程包支持appletvos
編譯平臺支持, xmake f -p appletvos
vs_runtime
xrepo env