1. 程式人生 > 其它 >xmake v2.5.5 釋出,支援下載整合二進位制映象包

xmake v2.5.5 釋出,支援下載整合二進位制映象包

xmake 是一個基於 Lua 的輕量級跨平臺構建工具,使用 xmake.lua 維護專案構建,相比 makefile/CMakeLists.txt,配置語法更加簡潔直觀,對新手非常友好,短時間內就能快速入門,能夠讓使用者把更多的精力集中在實際的專案開發上。

2.5.5 版本中,我們繼續改進遠端包整合的體驗,實現在雲端預編譯包,然後直接下載整合預編譯的二進位制包。這對於一些編譯非常慢的包,可以極大的減少包的安裝時間。

另外,新版本中,我們還重新實現了新版的本地包生成方案,完全無縫支援 add_requiresadd_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_requiresadd_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_licenseset_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_suffixnameset_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 的支援

Bugs 修復

  • #1413: 修復查詢包過程中出現的掛起卡死問題
  • #1420: 修復包檢測和配置快取
  • #1445: 修復 WDK 驅動簽名錯誤
  • #1465: 修復缺失的連結目錄