xmake v2.5.5 發佈,支持下載集成二進制鏡像包

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

2.5.5 版本中,咱們繼續改進遠程包集成的體驗,實如今雲端預編譯包,而後直接下載集成預編譯的二進制包。這對於一些編譯很是慢的包,能夠極大的減小包的安裝時間。c++

另外,新版本中,咱們還從新實現了新版的本地包生成方案,徹底無縫支持 add_requiresadd_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_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: 修復缺失的連接目錄
相關文章
相關標籤/搜索