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 裏,對象文件名衝突導致的編譯失敗
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章