是一個基於 Lua 的輕量級跨平臺構建工具。
它非常的輕量,沒有任何依賴,因為它內建了 Lua 執行時。
它使用 xmake.lua 維護專案構建,相比 makefile/CMakeLists.txt,設定語法更加簡潔直觀,對新手非常友好,短時間內就能快速入門,能夠讓使用者把更多的精力集中在實際的專案開發上。
我們能夠使用它像 Make/Ninja 那樣可以直接編譯專案,也可以像 CMake/Meson 那樣生成工程檔案,另外它還有內建的包管理系統來幫助使用者解決 C/C++ 依賴庫的整合使用問題。
目前,Xmake 主要用於 C/C++ 專案的構建,但是同時也支援其他 native 語言的構建,可以實現跟 C/C++ 進行混合編譯,同時編譯速度也是非常的快,可以跟 Ninja 持平。
Xmake = Build backend + Project Generator + Package Manager
新特性介紹
更靈活的包擴充套件
現在,我們可以通過 set_base
介面去繼承一個已有的包的全部設定,然後在此基礎上重寫部分設定。
這通常在使用者自己的專案中,修改 官方倉庫的內建包比較有用,比如:修復改 urls,修改版本列表,安裝邏輯等等。
例如,修改內建 zlib 包的 url,切到自己的 zlib 原始碼地址。
package("myzlib")
set_base("zlib")
set_urls("https://github.com/madler/zlib.git")
package_end()
add_requires("myzlib", {system = false, alias = "zlib"})
target("test")
set_kind("binary")
add_files("src/*.c")
add_packages("zlib")
我們也可以用來單純新增一個別名包。
package("onetbb")
set_base("tbb")
我們可以通過 add_requires("onetbb")
整合安裝 tbb 包,只是包名不同而已。
包管理支援工具鏈切換
之前,我們限制了只能在 cross 平臺下切換包安裝的工具鏈,新版本中,我們可以支援更多平臺下,對工具鏈的切換。
例如:
$ xrepo install --toolchains=clang zlib
我們可以在 linux 等平臺上,快速切換到 clang 工具鏈編譯安裝 zlib 庫。
我們也可以在 xmake.lua 的組態檔中去切換他們。
add_requires("zlib", {configs = {toolchains = "gcc-11"}})
不同的工具鏈安裝的 zlib 包,會被分別儲存在不同目錄,互不干擾,不會存在編譯器差異導致的連結相容問題。
內建的包虛擬環境
Xrepo 命令之前已經很好的支援了包虛擬環境管理,xrepo env shell
,但是對於複雜的包環境,還是需要使用者自己設定一個 xmake.lua 檔案,用於管理自己的包環境。
例如,我們需要一個常用的開發環境 shell,預設帶有 cmake, python 和 vs/autoconf 等常用的開發工具鏈,我們需要自己起一個組態檔 devel.lua。
add_requires("cmake")
add_requires("python")
if is_host("linux", "bsd", "macosx") then
add_requires("pkg-config", "autoconf", "automake", "libtool")
elseif is_host("windows") then
set_toolchains("msvc")
end
然後,執行下面的命令去匯入到全域性設定。
$ xrepo env --add devel.lua
這樣,我們可以通過下面的命令,去載入 shell 繫結這個環境:
$ xrepo env -b devel shell
> cmake --version
cmake version 3.19.3
而在新版本中,我們內建了一些常用的環境,可以通過 xrepo env -l
檢視:
$ xrepo env -l
- msvc
- llvm-mingw
- llvm
- mingw-w64
- devel
- python3
- depot_tools
- python2
其中 devel 也在裡面,所以,我們只需要執行 xrepo env -b devel shell
就可以帶起一個 devel 開發環境,而不需要自己設定它們。
像 python, msvc 等也都是一些比較常用的環境,都可以直接使用。
當然,我們也支援臨時在本地建立一個 xmake.lua 來設定載入包環境,而不放置到全域性設定中去。
自定義安裝包下載
我們可以通過新增的 on_download
介面,自定義包的下載邏輯,通常用不到,使用 Xmake 的內建下載就足夠了。
如果使用者自建私有倉庫,對包的下載有更復雜的鑑權機制,特殊處理邏輯,那麼可以重寫內部的下載邏輯來實現。
on_download(function (package, opt)
-- download packages:urls() to opt.sourcedir
end)
opt 引數裡面,可以獲取到下載包的目的原始碼目錄 opt.sourcedir
,我們只需要從 package:urls()
獲取到包地址,下載下來就可以了。
然後,根據需要,新增一些自定義的處理邏輯。另外,自己可以新增下載快取處理等等。
ASN.1 程式構建支援
ASN.1 程式,需要藉助 去生成相關的 .c 檔案參與專案編譯。
而 Xmake 內建提供了 add_rules("asn1c")
規則去處理 .c
檔案生成,add_requires("asn1c")
自動拉取整合 ASN.1 編譯器工具。
下面是一個基礎的設定例子:
add_rules("mode.debug", "mode.release")
add_requires("asn1c")
target("test")
set_kind("binary")
add_files("src/*.c")
add_files("src/*.asn1")
add_rules("asn1c")
add_packages("asn1c")
具體見 。
支援全平臺構建 Swift 程式
之前,Xmake 僅支援 macOS 下藉助 Xcode 工具鏈實現對 Swift 程式的構建,新版本中,我們也進行了改進,可以獨立使用 swift 工具鏈,支援在 linux/windows 上構架 swift 程式,用法跟之前相同。
支援指定符號列表匯出
在之前的版本中,我們提供了 utils.symbols.export_all
對 windows 的 dll 庫實現自動的完整符號匯出。
這儘管很方便,但只能支援 windows 程式,並且全量匯出對生成的 dll 大小不好控制,有可能會存在不少根本不需要的內部符號被匯出。
而,我們新版本提供的 utils.symbols.export_list
規則,可以在 xmake.lua 裡面直接定義匯出的符號列表,例如:
target("foo")
set_kind("shared")
add_files("src/foo.c")
add_rules("utils.symbols.export_list", {symbols = {
"add",
"sub"}})
或者,在 *.export.txt
檔案中新增匯出的符號列表。
target("foo2")
set_kind("shared")
add_files("src/foo.c")
add_files("src/foo.export.txt")
add_rules("utils.symbols.export_list")
完整的工程例子見:
通過指定符號匯出,我們可以使得生成的動態庫儘可能的小,無關的內部符號完全不去匯出它們,另外這個規則支援 linux, macOS 和 windows,更加的通用。
它內部會自動使用 .def, version scripts 和 --exported_symbols_list
去處理符號匯出。
內建支援 linker scripts
新版中,我們也內建了 對 linker scripts 和 version scripts 檔案的支援,我們可以使用 add_files
直接新增它們,而不需要設定 add_ldflags("-Txxx.lds")
。
當前支援 .ld
和 .lds
作為 linker scripts 組態檔來新增:
add_rules("mode.debug", "mode.release")
target("test")
add_deps("foo")
set_kind("binary")
add_files("src/main.c")
add_files("src/main.lds")
我們也支援 .ver
, .map
字尾檔案作為 version script 來新增。
target("foo")
set_kind("shared")
add_files("src/foo.c")
add_files("src/foo.map")
foo.map 檔案內容如下:
{
global:
foo;
local:
*;
};
更新內容
新特性
- : 支援繼承和區域性修改官方包,例如對現有的包更換 urls 和 versions
- 支援在 sparc, alpha, powerpc, s390x 和 sh4 上編譯執行 xmake
- 為 package() 新增 on_download 自定義下載
- : 支援 Linux/Windows 下構建 Swift 程式
- : 新增 asn1c 支援
- : 為 add_files 增加 linker scripts 和 version scripts 支援
- : 捕獲 ctrl-c 去列印當前執行棧,用於偵錯分析卡死問題
- : 新增
xmake update --integrate
命令去整合 shell - : 新增一些內建的 xrepo env 環境設定
- : 支援為任意平臺傳遞工具鏈到包
- : 支援匯出指定的符號列表,可用於減少動態庫的大小
改進
- : 改進 xrepo 支援從組態檔批次安裝包,例如:
xrepo install xxx.lua
- : 改進 vs generator 的 filter 目錄展示
- : 支援為 phony 和 headeronly 目標生成 vs 工程
- 優化 vs 和 codesign 的探測速度
- : 改進 vs 工程生成器去支援 cuda
Bugs 修復
- : 修復 path.extension
- : 修復 windows manifest 檔案編譯
- : 修復 vs project generator 裡,物件檔名衝突導致的編譯失敗