xmake v2.6.3 發佈,支持 vcpkg 清單模式

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

新版本改動

這個版本主要新增下面幾個特性:

  1. 通過 vcpkg 的清單模式實現 vcpkg 包的版本選擇
  2. python 模塊構建支持
  3. 支持在 CMakeLists.txt 中集成 Xrepo/Xmake 包管理

剩下的主要是一些零散的功能改進和 Bugs 修復,可以看下文末的更新內容明細,一些比較大的改動,下面也會逐一說明。

新特性介紹

支持 Vcpkg 清單模式

新版本中,Xmake 新增了 vcpkg 清單模式支持,通過它,我們就能支持 vcpkg 包的版本選擇,例如:

add_requires("vcpkg::zlib 1.2.11+10")
add_requires("vcpkg::fmt >=8.0.1", {configs = {baseline = "50fd3d9957195575849a49fa591e645f1d8e7156"}})
add_requires("vcpkg::libpng", {configs = {features = {"apng"}}})

target("test")
    set_kind("binary")
    add_files("src/*.cpp")
    add_packages("vcpkg::zlib", "vcpkg::fmt", "vcpkg::libpng")

但是,vcpkg 的版本選擇限制還是不少,必須要硬編碼指定 baseline,而且還不支持 <=1.0, 1.x 等版本語義選擇,不過總比之前不能選擇版本好了不少。

在 CMake 中使用 Xrepo 的依賴包管理

我們新增了一個獨立項目 xrepo-cmake

它是一個基於 Xrepo/Xmake 的 C/C++ 包管理器的 CMake 包裝器。

這允許使用 CMake 來構建您的項目,同時使用 Xrepo 來管理依賴包。這個項目的部分靈感來自 cmake-conan

此項目的示例用例:

  • 想要使用 Xrepo 管理包的現有 CMake 項目。
  • 必須使用 CMake,但想使用 Xrepo 管理的新項目包。

使用來自官方存儲庫的包

Xrepo 官方倉庫:xmake-repo

xrepo.cmake 提供xrepo_package函數來管理包。

xrepo_package(
    "foo 1.2.3"
    [CONFIGS feature1=true,feature2=false]
    [MODE debug|release]
    [OUTPUT verbose|diagnosis|quiet]
    [DIRECTORY_SCOPE]
)

一些函數參數直接對應於 Xrepo 命令選項。

調用 xrepo_package(foo) 後,有兩種使用 foo 包的方法:

  • 如果包提供 cmake 模塊來查找它,則調用 find_package(foo), 參考 CMake find_package 文檔瞭解更多詳情
  • 如果包不提供 cmake 模塊,foo_INCLUDE_DIRfoo_LINK_DIR 變量將設置爲包包含和庫路徑。使用這些變量在 CMake 代碼中設置包含和庫路徑。
  • 如果指定了 DIRECTORY_SCOPE,則 xrepo_package 將運行以下代碼(這樣用戶只需要在 target_link_libraries 中指定庫名稱)
include_directories(foo_INCLUDE_DIR)
link_directories(foo_LINK_DIR)

這是一個使用 gflags 包版本 2.2.2 的示例 CMakeLists.txt 由 Xrepo 管理。

cmake_minimum_required(VERSION 3.13.0)

project(foo)

# Download xrepo.cmake if not exists in build directory.
if(NOT EXISTS "${CMAKE_BINARY_DIR}/xrepo.cmake")
    message(STATUS "Downloading xrepo.cmake from https://github.com/xmake-io/xrepo-cmake/")
    # mirror https://cdn.jsdelivr.net/gh/xmake-io/xrepo-cmake@main/xrepo.cmake
    file(DOWNLOAD "https://raw.githubusercontent.com/xmake-io/xrepo-cmake/main/xrepo.cmake"
                  "${CMAKE_BINARY_DIR}/xrepo.cmake"
                  TLS_VERIFY ON)
endif()

# Include xrepo.cmake so we can use xrepo_package function.
include(${CMAKE_BINARY_DIR}/xrepo.cmake)

# Call `xrepo_package` function to use gflags 2.2.2 with specific configs.
xrepo_package("gflags 2.2.2" CONFIGS "shared=true,mt=true")

# `xrepo_package` sets `gflags_DIR` variable in parent scope because gflags
# provides cmake modules. So we can now call `find_package` to find gflags
# package.
find_package(gflags CONFIG COMPONENTS shared)

使用來自第三個存儲庫的包

除了從官方維護的存儲庫安裝軟件包之外,Xrepo 還可以安裝來自第三方包管理器的包,例如 vcpkg/conan/conda/pacman/homebrew/apt/dub/cargo。

關於命令行的使用,我們可以參考文檔:Xrepo命令用法

我們也可以直接在 cmake 中使用它來安裝來自第三方倉庫的包,只需將倉庫名稱添加爲命名空間即可。例如:vcpkg::zlib, conan::pcre2

Conan
xrepo_package("conan::gflags/2.2.2")
Conda
xrepo_package("conda::gflags 2.2.2")
Vcpkg
xrepo_package("vcpkg::gflags")
Homebrew
xrepo_package("brew::gflags")

Python 模塊構建支持

我們可以用這個規則,配合 pybind11 生成 python 庫模塊,它會調整 python 庫的模塊名。

add_rules("mode.release", "mode.debug")
add_requires("pybind11")

target("example")
    add_rules("python.library")
    add_files("src/*.cpp")
    add_packages("pybind11")
    set_languages("c++11")

帶有 soabi:

add_rules("mode.release", "mode.debug")
add_requires("pybind11")

target("example")
    add_rules("python.library", {soabi = true})
    add_files("src/*.cpp")
    add_packages("pybind11")
    set_languages("c++11")

新增刪除頭文件列表接口

通過此接口,可以從 add_headerfiles 接口添加的頭文件列表中,刪除指定的文件,例如:

target("test")
    add_headerfiles("src/*.h")
    remove_headerfiles("src/test.h")

上面的例子,可以從src目錄下添加除test.h以外的所有頭文件,當然這個也可以通過 add_headerfiles("src/*.h|test.h") 來達到相同的目的,但是這種方式更加靈活。

新增 on_config 配置腳本

xmake config 執行完成後,Build 之前會執行此腳本,通常用於編譯前的配置工作。它與 on_load 不同的是,on_load 只要 target 被加載就會執行,執行時機更早。

如果一些配置,無法在 on_load 中過早配置,那麼都可以在 on_config 中去配置它。

另外,它的執行時機比 before_build 還要早,大概的執行流程如下:

on_load -> after_load -> on_config -> before_build -> on_build -> after_build

內置 Github 代理鏡像配置

Xmake 提供了一些內置的鏡像配置可以直接使用,例如 github 的鏡像加速:

$ xmake g --proxy_pac=github_mirror.lua

我們不用自己編寫 pac.lua,就可以直接使用它來加速 github 源的下載。

更新內容

新特性

  • #1298: 支持 vcpkg 清單模式安裝包,實現安裝包的版本選擇
  • #1896: 添加 python.library 規則去構建 pybind 模塊,並且支持 soabi
  • #1939: 添加 remove_files, remove_headerfiles 並且標記 del_files 作爲廢棄接口
  • 將 on_config 作爲正式的公開接口,用於 target 和 rule
  • 添加 riscv32/64 支持
  • #1970: 添加 CMake wrapper 支持在 CMakelists 中去調用 xrepo 集成 C/C++ 包
  • 添加內置的 github 鏡像加速 pac 代理文件, xmake g --proxy_pac=github_mirror.lua

改進

  • #1923: 改進構建 linux 驅動,支持設置自定義 linux-headers 路徑
  • #1962: 改進 armclang 工具鏈去支持構建 asm
  • #1959: 改進 vstudio 工程生成器
  • #1969: 添加默認的 option 描述

Bugs 修復

  • #1875: 修復部署生成 Android Qt 程序包失敗問題
  • #1973: 修復合併靜態庫
  • #1982: 修復 clang 下對 c++20 子模塊的依賴構建
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章