天天看點

xmake v2.6.4 釋出,大量包管理特性改進

​​Xmake​​ 是一個基于 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​

​ 接口去繼承一個已有的包的全部配置,然後在此基礎上重寫部配置設定置。

這通常在使用者自己的項目中,修改 ​​xmake-repo​​ 官方倉庫的内置包比較有用,比如:修複改 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 程式,需要借助 ​​ASN.1 Compiler​​ 去生成相關的 .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:
        *;
};      

更新内容

新特性

  • ​​#2011​​: 支援繼承和局部修改官方包,例如對現有的包更換 urls 和 versions
  • 支援在 sparc, alpha, powerpc, s390x 和 sh4 上編譯運作 xmake
  • 為 package() 添加 on_download 自定義下載下傳
  • ​​#2021​​: 支援 Linux/Windows 下建構 Swift 程式
  • ​​#2024​​: 添加 asn1c 支援
  • ​​#2031​​: 為 add_files 增加 linker scripts 和 version scripts 支援
  • ​​#2033​​: 捕獲 ctrl-c 去列印目前運作棧,用于調試分析卡死問題
  • ​​#2059​​​: 添加​

    ​xmake update --integrate​

    ​ 指令去整合 shell
  • ​​#2070​​: 添加一些内置的 xrepo env 環境配置
  • ​​#2117​​: 支援為任意平台傳遞工具鍊到包
  • ​​#2121​​: 支援導出指定的符号清單,可用于減少動态庫的大小

改進

  • ​​#2036​​​: 改進 xrepo 支援從配置檔案批量安裝包,例如:​

    ​xrepo install xxx.lua​

  • ​​#2039​​: 改進 vs generator 的 filter 目錄展示
  • ​​#2025​​: 支援為 phony 和 headeronly 目标生成 vs 工程
  • 優化 vs 和 codesign 的探測速度
  • ​​#2077​​: 改進 vs 工程生成器去支援 cuda

Bugs 修複

  • ​​#2005​​: 修複 path.extension
  • ​​#2008​​: 修複 windows manifest 檔案編譯
  • ​​#2016​​: 修複 vs project generator 裡,對象檔案名沖突導緻的編譯失敗

繼續閱讀