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_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_pmheader
和 set_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