xmake v2.3.9 發佈, 新增獨立 Xrepo C/C++ 包管理器

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

在這個新版本中,我們重點改進了 xmake 的依賴包管理,新增了 Archlinux 和 MSYS2/Mingw 下 的 pacman 包管理器支持,另外我們進一步豐富了 xmake 的官方包倉庫 xmake-repo,新增了 50 多個常用的 C/C++ 包。

此外,我們新增了一個基於 xmake 的獨立子命令:xrepo,一個完整獨立的跨平臺 C/C++ 包管理器,便於用戶更加方便的管理日常 C/C++ 包的安裝和集成使用。

同時,我們還上線了 xrepo 的相關站點 xrepo.xmake.io,我們可以在上面快速查看 xrepo 的使用方式,以及 xmake-repo 官方倉庫中每個包的支持情況和使用方式。

  • 項目源碼

  • 官方文檔

  • 入門課程

  • Xrepo 命令

入門課程

近期,我們也上線了官方的 xmake 入門課程,Xmake 帶你輕鬆構建 C/C++ 項目 以邊學邊做實驗的方式快速學習 xmake 的使用。

新特性介紹

Xrepo 包管理器

xrepo 是一個基於 Xmake 的跨平臺 C/C++ 包管理器。

它基於 xmake 提供的運行時,但卻是一個完整獨立的包管理程序,相比 vcpkg/homebrew 此類包管理器,xrepo 能夠同時提供更多平臺和架構的 C/C++ 包。

並且還支持多版本語義選擇,另外它還是一個去中心化的分佈式倉庫,不僅僅提供了官方的 xmake-repo 倉庫,還支持用戶自建多個私有倉庫。

同時,xrepo 也支持從 vcpkg/homebrew/conan 等第三方包管理器中安裝包,並提供統一一致的庫鏈接信息,方便與第三方項目的集成對接。

如果你想要了解更多,請參考:在線文檔, Github 以及 Gitee

獨立安裝 C/C++ 包

各種安裝方式一應俱全,支持語義版本、調試包、動態庫、可配置參數,也支持各種第三方包管理中的 C/C++ 包安裝。

$ xrepo install zlib tbox
$ xrepo install "zlib 1.2.x"
$ xrepo install "zlib >=1.2.0"
$ xrepo install -p iphoneos -a arm64 zlib
$ xrepo install -p android [--ndk=/xxx] zlib
$ xrepo install -p mingw [--mingw=/xxx] zlib
$ xrepo install -p cross --sdk=/xxx/arm-linux-musleabi-cross zlib
$ xrepo install -m debug zlib
$ xrepo install -k shared zlib
$ xrepo install -f "vs_runtime=MD" zlib
$ xrepo install -f "regex=true,thread=true" boost
$ xrepo install brew::zlib
$ xrepo install vcpkg::zlib
$ xrepo install conan::zlib/1.2.11
$ xrepo install pacman:libpng
$ xrepo install dub:log

支持安裝交叉編譯依賴包

新版本中,我們改進了 xmake 內部的依賴包安裝機制,增加了對交叉編譯工具鏈的 C/C++ 依賴包安裝支持,例如:

add_requires("zlib""openssl")
target("test")
    set_kind("binary")
    add_files("src/*.c")
    add_packages("zlib""openssl")

我們上面配置了兩個依賴包:zlib, openssl,然後我們切到交叉編譯環境,使用 musl.cc 上的編譯工具鏈進行編譯。

$ xmake f -p cross --sdk=/tmp/arm-linux-musleabi-cross
in xmake-repo:
  -> openssl 1.1.1h
please input: y (y/n)

  => http://zlib.net/zlib-1.2.11.tar.gz .. ok
  => download https://github.com/openssl/openssl/archive/OpenSSL_1_1_1h.zip .. ok
  => installing zlib .. ok
  => installing openssl .. ok
$ xmake
[ 50%]: ccache compiling.release src/main.cpp
[ 75%]: linking.release test
[100%]: build ok!

xmake 就會自動拉取 zlib/openssl 源碼包,然後使用 arm-linux-musleabi-cross 交叉工具鏈編譯安裝 zlib 和 openssl,安裝完成後,自動集成到 test 工程參與鏈接直到完全編譯通過。

當然,要讓 C/C++ 支持交叉編譯,首先需要維護 xmake-repo 官方倉庫,增加對交叉編譯的支持。目前倉庫中支持交叉的 C/C++ 包還不是很多,但也已經收錄了不少了,後期還會不斷擴充。

如果要看哪些包支持交叉編譯,可以直接到包倉庫站點查看:支持交叉編譯的C/C++包列表

我們也可以使用新版本中提供的 xrepo 命令,直接檢索指定平臺支持的包(支持模糊查詢):

$ xrepo search -p cross zli*

我們也歡迎大家幫忙貢獻更多的包進入 xmake-repo 官方倉庫,一起完善 C/C++ 包管理生態的建設,使用戶能夠更加方便的使用各種依賴包,不再爲各種繁瑣的移植工作所困擾。

依賴包的license檢測

考慮到倉庫中包各自的 license 不同,有些包也許使用後會跟用戶項目的 license 衝突,因此 xmake 在新版本中增加了包依賴 license 兼容性檢測機制。

並且新增了 set_license 接口,可以讓用戶設置每個 target 的 license 。

例如,我們集成了一個 LGPL-2.0 的包 libplist 庫,但是自身項目沒有任何 license 設置。

add_requires("libplist"-- LGPL-2.0
target("test")
    set_kind("binary")
    add_files("src/*.cpp")
    add_packages("libplist")

編譯的時候,就會有下面的提示,警告用戶使用 libplist 有可能代碼 license 衝突風險。

$ xmake
warning: target(test) maybe is not compatible with license(LGPL-2.1) of package(libplist),
we can use shared libraries with LGPL-2.1 or use set_license()/set_policy() to modify/disable license!

而如果我們把項目顯式通過 set_license("LGPL-2.0"),確保完全兼容,就不會再有警告信息,同樣對於 GPL 相關的 license,xmake也會有對應的檢測。

而相對比較寬鬆的 MIT, BSD 等 license 的包,直接集成使用,是不會有任何警告的。

另外,如果我們顯式設置的 set_license() 和包的 license 衝突,我們也會提示警告。

Pacman 包源支持

之前的版本,xmake 已經支持自動集成 vcpkg, conan, clib, homebrew 等第三方倉庫包源,而新版本中,我們新增加了對 pacman 管理的包進行集成支持。

我們既支持 archlinux 上的 pacman 包安裝和集成,也支持 msys2 上 pacman 的 mingw x86_64/i386 包安裝和集成。

add_requires("pacman::zlib", {alias = "zlib"})
add_requires("pacman::libpng", {alias = "libpng"})

target("test")
    set_kind("binary")
    add_files("src/*.c")
    add_packages("zlib""libpng")

archlinux 上只需要:

xmake

msys2 上安裝 mingw 包,需要指定到 mingw 平臺:

xmake f -p mingw -a [x86_64|i386]
xmake

強制安裝任意版本的包

由於 xmake-repo 倉庫中的包,有嚴格的 版本列表以及對應的 sha256 值用於下載的完整性校驗,這會保證包下載的可靠性和完整性。

但是,也導致沒法完全收錄一個包的所有版本,如果有需要的版本還沒被收錄,一種方式就是用戶自己提 pr 進 xmake-repo 倉庫來增加支持對應版本。

還有一種方式,就是用戶在 xmake.lua 配置 {verify = false} 強制跳過校驗機制,這樣就能夠選擇下載任意版本的包了。

add_requires("libcurl 7.73.0", {verify = false})

vcpkg 包集成改進

關於 vcpkg 包的依賴集成,新版本里面也做了不少的改進,不僅增加了對 windows-static-md 包的切換支持,另外我們還改進了 vcpkg 命令的自動探測機制,使得在更多的場景能夠自動檢測到它,而不是需要手動配置。

自定義交叉工具鏈改進

新版本中,我們繼續對自定義工具鏈做了改進,使得自動檢測更加的智能化,通常只需要指定 sdkdir,xmake就可以自動檢測其他的配置,比如 cross 等信息,例如:

toolchain("my_toolchain")
    set_kind("standalone")
    set_sdkdir("/tmp/arm-linux-musleabi-cross")
toolchain_end()

target("hello")
    set_kind("binary")
    add_files("apps/hello/*.c")

這是一個最精簡的交叉工具鏈配置,僅僅設置了對應的sdk路徑,然後通過 set_kind("standalone") 將其標記爲完整獨立的工具鏈。

這個時候,我們就可以通過命令行 --toolchain=my_toolchain 去手動切換到此工具鏈來使用。

xmake f --toolchain=my_toolchain
xmake

另外,我們還可以直接在 xmake.lua 中通過 set_toolchains 將其綁定到對應的 target 上去,那麼僅僅只在編譯此 target 時候,纔會切換到我們自定義的工具鏈。

toolchain("my_toolchain")
    set_kind("standalone")
    set_sdkdir("/tmp/arm-linux-musleabi-cross")
toolchain_end()

target("hello")
    set_kind("binary")
    add_files("apps/hello/*.c")
    set_toolchains("my_toolchain")

這樣,我們不再需要手動切換工具鏈了,只需要執行 xmake,就會默認自動切換到 my_toolchain 工具鏈。

這對於嵌入式開發來講尤其有用,因爲嵌入式平臺的交叉編譯工具鏈非常多,我們經常需要各種切換來完成不同平臺的編譯。

因此,我們可以將所有的工具鏈定義放置到獨立的 lua 文件中去定義,例如:

projectdir
    - xmake.lua
    - toolchains
      - my_toolchain1.lua
      - my_toolchain2.lua
      - ...

然後,我們只需要再 xmake.lua 中通過 includes 去引入它們,並根據不同的自定義平臺,綁定不同的工具鏈:

includes("toolchains/*.lua")
target("hello")
    set_kind("binary")
    add_files("apps/hello/*.c")
    if is_plat("myplat1"then
        set_toolchains("my_toolchain1")
    elseif is_plat("myplat2"then
        set_toolchains("my_toolchain2")
    end

這樣,我們就可以編譯的時候,直接快速切換指定平臺,來自動切換對應的工具鏈了。

xmake f -p myplat1
xmake

如果,有些交叉編譯工具鏈結構複雜,自動檢測還不足夠,那麼可以根據實際情況,使用 set_toolset, set_crossset_bindir 等接口,針對性的配置上其他的設置。

例如下面的例子,我們還額外添加了一些 cxflags/ldflags 以及內置的系統庫 links。

toolchain("my_toolchain")
    set_kind("standalone")
    set_sdkdir("/tmp/arm-linux-musleabi-cross")
    on_load(function (toolchain)
        -- add flags for arch
        if toolchain:is_arch("arm"then
            toolchain:add("cxflags""-march=armv7-a""-msoft-float", {force = true})
            toolchain:add("ldflags""-march=armv7-a""-msoft-float", {force = true})
        end
        toolchain:add("ldflags""--static", {force = true})
        toolchain:add("syslinks""gcc""c")
    end)

更多自定義工具鏈的例子,可以到 xmake 的源碼的目錄參考內置的工具鏈定義:內部工具鏈列表

菜單配置支持鼠標操作

還記得 xmake 還有提供終端圖形化的菜單配置麼?就是類似 linux kernel 的經典 menu config 圖形化配置界面。

xmake f --menu

新版本中,我們也對它做了進一步的改進,增加的跨平臺的鼠標操作,我們可以用鼠標來進行各種配置項的點擊和選擇操作,更加的方便。

更新內容

新特性

  • 添加新的 xrepo 命令去管理安裝 C/C++ 包

  • 支持安裝交叉編譯的依賴包

  • 新增musl.cc上的工具鏈支持

  • #1009: 支持忽略校驗去安裝任意版本的包,add_requires("libcurl 7.73.0", {verify = false})

  • #1016: 針對依賴包增加license兼容性檢測

  • #1017: 支持外部/系統頭文件支持 add_sysincludedirs,依賴包默認使用-isystem

  • #1020: 支持在 archlinux 和 msys2 上查找安裝 pacman 包

  • 改進 xmake f --menu 菜單配置,支持鼠標操作

改進

  • #997: xmake project -k cmake 插件增加對 set_languages 的支持

  • #998: 支持安裝 windows-static-md 類型的 vcpkg 包

  • #996: 改進 vcpkg 目錄查找

  • #1008: 改進交叉編譯工具鏈

  • #1030: 改進 xcode.framework and xcode.application 規則

  • #1051: 爲 msvc 編譯器添加 editembed 調試信息格式類型到 set_symbols()

  • #1062: 改進 xmake project -k vs 插件

關注公衆號

TBOOX開源工程

專注C跨平臺開發解決方案

長按二維碼關注




本文分享自微信公衆號 - TBOOX開源工程(tboox-os)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章