Xmake v2.8.1 發佈,大量細節特性改進

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 + [Remote|Distributed] Build + Cache

儘管不是很準確,但我們還是可以把 Xmake 按下面的方式來理解:

Xmake ≈ Make/Ninja + CMake/Meson + Vcpkg/Conan + distcc + ccache/sccache

新特性介紹

Windows 長路徑問題改進

windows 的長路徑限制一直是一個大問題,嵌套層級太深的工程,在讀寫文件的時候,都有可能失敗,這會影響 xmake 的可用性和體驗。

儘管,xmake 已經提供各種措施也避免這個問題,但是偶爾還是會受到一些限制。而在這個版本中,我們改進了安裝器,提供一個安裝選項,讓用戶選擇性開啓長路徑支持。

這需要管理員權限,因爲它需要寫註冊表。

WriteRegDWORD ${HKLM} "SYSTEM\CurrentControlSet\Control\FileSystem" "LongPathsEnabled" 1

用戶可以自己決定,是否需要開啓它。

感謝 @A2va 的貢獻。

zypper 包管理器支持

新增 OpenSUSE 的 zypper 包管理器支持,可以直接通過 zypper 自動下載安裝,並集成它提供的包。

感謝 @iphelf 的貢獻。

add_requires("zypper::libsfml2 2.5")

改進 msbuild 包安裝

一些第三方包,沒有使用 cmake 維護,僅僅提供了 vcproj 的工程文件,如果我們把它做成包,需要使用 tools.msbuild 模塊去編譯安裝它。

但是 vcproj 的 vs 版本如果很老,就需要升級它,否則編譯會失敗。

因此我們改進了 tools.msbuild 模塊,提供自動升級 vcproj 的功能,只需要指定下需要升級的 vcproj/sln 文件即可。

package("test")
    on_install(function (package)
        import("package.tools.msbuild").build(package, configs, {upgrade={"wolfssl64.sln", "wolfssl.vcxproj"}})
    end)

改進 protobuf 支持 grpc

我們改進了對 protobuf 的支持,可以同時支持上 grpc_cpp_plugin。

add_rules("mode.debug", "mode.release")
add_requires("protobuf-cpp")
add_requires("grpc", {system = false})

target("test")
    set_kind("binary")
    set_languages("c++17")
    add_packages("protobuf-cpp")
    add_packages("grpc")
    add_rules("protobuf.cpp")
    add_files("src/*.cpp")
    add_files("src/test.proto", {proto_rootdir = "src", proto_grpc_cpp_plugin = true})
    add_files("src/subdir/test2.proto", {proto_rootdir = "src"})

完整例子見:protobuf_grpc_cpp_plugin

通常 add_links 需要配合 add_linkdirs 使用,才能讓鏈接器找到指定目錄下的庫文件。

但是有時候配置不對,或者不同路徑下庫重名,就容易找錯庫文件。而現在 add_links 可以支持直接設置庫文件路徑,避免隱式搜索。

也可以用於顯式指定鏈接 so/a 庫。

下面的幾種寫法都是支持的:

add_links("foo")
add_links("libfoo.a")
add_links("libfoo.so")
add_links("/tmp/libfoo.a")
add_links("/tmp/libfoo.so")
add_links("foo.lib")

Objc/Objc++ 頭文件預編譯支持

之前的版本,我們如果使用 set_pcxxheader 設置 c++ 頭文件預編譯,會同時影響 objc 代碼。

因此如果 C++/ObjC++ 代碼混合編譯,用了預編譯頭,就會遇到編譯問題。

Objective-C was disabled in PCH file but is currently enabled

這是因爲,預編譯頭的編譯,也是需要指定語言的 -x c++-header, -x objective-c++-header,pch 文件不能混用。

因此,我們新增了 set_pmheaderset_pmxxheader 接口,單獨設置 objc/objc++ 的預編譯頭文件,跟 C/C++ 預編譯頭互不衝突。

但用法完全一樣。

target("test")
    set_pmxxheader("header.h")

完整例子見:Objc Precompiled Header Example

改進 Conan 2.0 支持

上個版本,我們初步支持了 Conan 2.0,但是還遇到了一些細節問題,這個版本我們持續做了改進,比如改進對 vs_runtime 設置問題。

更新 lua 運行時

最近 Lua 已經發布了 5.4.6 版本,我們對 xmake 中內置的 Lua 運行時也做了升級,跟上游保持同步。

更新日誌

新特性

  • #3821: windows 安裝器添加長路徑支持選項
  • #3828: 添加 zypper 包管理器支持
  • #3871: 改進 tools.msbuild 支持對 vsproj 進行自動升級
  • #3148: 改進 protobuf 支持 grpc
  • #3889: add_links 支持庫路徑添加
  • #3912: 添加 set_pmxxheader 去支持 objc 預編譯頭
  • add_links 支持庫文件路徑

改進

  • #3752: 改進 windows 上 os.getenvs 的獲取
  • #3371: 改進 tools.cmake 支持使用 ninja 去構建 wasm 包
  • #3777: 改進從 pkg-config 中查找包
  • #3815: 改進 tools.xmake 支持爲 windows 平臺傳遞工具鏈
  • #3857: 改進生成 compile_commands.json
  • #3892: 改進包搜索,支持從描述中找包
  • #3916: 改進構建 swift 程序,支持模塊間符號調用
  • 更新 lua 運行時到 5.4.6

Bugs 修復

  • #3755: 修復 find_tool 從 xmake/packages 中查找程序
  • #3787: 修復從 conan 2.x 中使用包
  • #3839: 修復 conan 2.x 包的 vs_runtime 設置
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章