Xmake 是一個基于 Lua 的輕量級跨平臺構(gòu)建工具。
它非常的輕量,沒有任何依賴,因為它內(nèi)置了 Lua 運行時。
它使用 xmake.lua 維護項目構(gòu)建,相比 makefile/CMakeLists.txt,配置語法更加簡潔直觀,對新手非常友好,短時間內(nèi)就能快速入門,能夠讓用戶把更多的精力集中在實際的項目開發(fā)上。
我們能夠使用它像 Make/Ninja 那樣可以直接編譯項目,也可以像 CMake/Meson 那樣生成工程文件,另外它還有內(nèi)置的包管理系統(tǒng)來幫助用戶解決 C/C++ 依賴庫的集成使用問題。
目前,Xmake 主要用于 C/C++ 項目的構(gòu)建,但是同時也支持其他 native 語言的構(gòu)建,可以實現(xiàn)跟 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
新版本中,我們新增了鴻蒙系統(tǒng)的 native 工具鏈支持,并且實現(xiàn)了一種新的 native 原生 lua 模塊的導入支持。另外,我們也對構(gòu)建速度做了很多的優(yōu)化,效果非常明顯。
我們新增了鴻蒙 OS 平臺的 native 工具鏈編譯支持:
$ xmake f -p harmony
xmake 也會自動探測默認的 SDK 路徑,當然我們也可以指定 Harmony SDK 路徑。
$ xmake f -p Harmony --sdk=/Users/ruki/Library/Huawei/Sdk/...
我們知道,在 xmake 中,可以通過 import 接口去導入一些 lua 模塊在腳本域中使用,但是如果一些模塊的操作比較耗時,那么 lua 實現(xiàn)并不是理想的選擇。 因此,新版本中,我們新增了 native lua 模塊的支持,可以通過 native 實現(xiàn),來達到提速優(yōu)化的效果,并且模塊導入和使用,還是跟 lua 模塊一樣簡單。
使用原生模塊時,xmake 會進行兩段編譯,先會自動編譯原生模塊,后將模塊導入 lua 作為庫或二進制,而對于用戶,僅僅只需要調(diào)用 import 導入即可。
動態(tài)庫模塊的好處是,不僅僅通過 native 實現(xiàn)了性能加速,另外避免了每次調(diào)用額外的子進程創(chuàng)建,因此更加的輕量,速度進一步得到提升。
我們可以先定義一個動態(tài)庫模塊,里面完全支持 lua 的所有 c API,因此我們也可以將一些第三方的開源 lua native 模塊直接引入進來使用。
這里我們也有一個完整的導入 lua-cjson 模塊的例子可以參考:native_module_cjson
首先,我們先實現(xiàn) shared 的 native 代碼,所以接口通過 lua API 導出。
./modules/foo/foo.c
#include <xmi.h>
static int c_add(lua_State* lua) {
int a = lua_tointeger(lua, 1);
int b = lua_tointeger(lua, 2);
lua_pushinteger(lua, a + b);
return 1;
}
static int c_sub(lua_State* lua) {
int a = lua_tointeger(lua, 1);
int b = lua_tointeger(lua, 2);
lua_pushinteger(lua, a - b);
return 1;
}
int luaopen(foo, lua_State* lua) {
// 收集add和sub
static const luaL_Reg funcs[] = {
{"add", c_add},
{"sub", c_sub},
{NULL, NULL}
};
lua_newtable(lua);
// 傳遞函數(shù)列表
luaL_setfuncs(lua, funcs, 0);
return 1;
}
注意到這里,我們 include 了一個 xmi.h
的接口頭文件,其實我們也可以直接引入 lua.h
,luaconf.h
,效果是一樣的,但是會提供更好的跨平臺性,內(nèi)部會自動處理 lua/luajit還有版本間的差異。
然后,我們配置 add_rules("modules.shared")
作為 shared native 模塊來編譯,不需要引入任何其他依賴。
甚至連 lua 的依賴也不需要引入,因為 xmake 主程序已經(jīng)對其導出了所有的 lua 接口,可直接使用,所以整個模塊是非常輕量的。
./modules/foo/xmake.lua
add_rules("mode.debug", "mode.release")
target("foo")
-- 指定目標為庫lua模塊
add_rules("module.shared")
add_files("foo.c")
Xmake 是一個基于 Lua 的輕量級跨平臺構(gòu)建工具。
它非常的輕量,沒有任何依賴,因為它內(nèi)置了 Lua 運行時。
它使用 xmake.lua 維護項目構(gòu)建,相比 makefile/CMakeLists.txt,配置語法更加簡潔直觀,對新手非常友好,短時間內(nèi)就能快速入門,能夠讓用戶把更多的精力集中在實際的項目開發(fā)上。
我們能夠使用它像 Make/Ninja 那樣可以直接編譯項目,也可以像 CMake/Meson 那樣生成工程文件,另外它還有內(nèi)置的包管理系統(tǒng)來幫助用戶解決 C/C++ 依賴庫的集成使用問題。
目前,Xmake 主要用于 C/C++ 項目的構(gòu)建,但是同時也支持其他 native 語言的構(gòu)建,可以實現(xiàn)跟 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
新版本中,我們新增了 cosmocc 工具鏈支持,使用它,我們可以實現(xiàn)一次編譯,到處運行。另外,我們還重構(gòu)了 C++ Modules 的實現(xiàn),解決了很多 C++ Modules 相關(guān)的問題。
cosmocc 工具鏈是 cosmopolitan 項目提供的編譯工具鏈,使用這個工具鏈編譯的程序可以實現(xiàn)一次編譯,到處運行。
而新版本中,我們對這個工具鏈也做了支持,可以實現(xiàn)在 macosx/linux/windows 下編譯程序,并且還能夠支持自動下載 cosmocc 工具鏈。
對于用戶,僅僅只需要配置 xmake.lua 工程文件,然后執(zhí)行 xmake
命令,即可實現(xiàn)一鍵編譯,到處運行。
xmake.lua 內(nèi)容如下,這是一個最基礎(chǔ)的 hello world 終端程序的構(gòu)建配置。
add_rules("mode.debug", "mode.release")
add_requires("cosmocc")
target("test")
set_kind("binary")
add_files("src/*.c")
set_toolchains("@cosmocc")
然后,我們執(zhí)行 xmake 命令,它會先下載集成 cosmocc 工具鏈,然后使用這個工具鏈去編譯程序。
ruki:console$ xmake
checking for platform ... linux
checking for architecture ... x86_64
note: install or modify (m) these packages (pass -y to skip confirm)?
in xmake-repo:
-> cosmocc 3.2.4
please input: y (y/n/m)
=> install cosmocc 3.2.4 .. ok
[ 25%]: cache compiling.release src/main.c
[ 50%]: linking.release test
[100%]: build ok, spent 1.548s
ruki:console$ xmake run
hello world
Xmake 是一個基于 Lua 的輕量級跨平臺構(gòu)建工具。
它非常的輕量,沒有任何依賴,因為它內(nèi)置了 Lua 運行時。
它使用 xmake.lua 維護項目構(gòu)建,相比 makefile/CMakeLists.txt,配置語法更加簡潔直觀,對新手非常友好,短時間內(nèi)就能快速入門,能夠讓用戶把更多的精力集中在實際的項目開發(fā)上。
我們能夠使用它像 Make/Ninja 那樣可以直接編譯項目,也可以像 CMake/Meson 那樣生成工程文件,另外它還有內(nèi)置的包管理系統(tǒng)來幫助用戶解決 C/C++ 依賴庫的集成使用問題。
目前,Xmake 主要用于 C/C++ 項目的構(gòu)建,但是同時也支持其他 native 語言的構(gòu)建,可以實現(xiàn)跟 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
在介紹新特性之前,還有個好消息告訴大家,上個版本 Xmake 被收入到了 debian 倉庫,而最近 Xmake 又進入了 Fedora 官方倉庫,大家可以在 Fedora 39 上,直接通過下面的命令安裝 Xmake。
$ sudo dnf install xmake
非常感謝 @topazus @mochaaP 對 Xmake 的貢獻,相關(guān)信息見:#941。
接下來,我們來介紹下,新版本帶來的重量級特性:XPack。
它類似于 CMake 的 CPack 命令,可以將用戶工程快速打包生成各種格式的安裝包。
目前 Xmake 的 XPack 已經(jīng)支持以下格式的打包:
除了上述已經(jīng)支持的打包格式,還有 deb 等包格式也在陸續(xù)支持中,并且用戶也可以配置生成自定義的包格式文件。
Xmake 是一個基于 Lua 的輕量級跨平臺構(gòu)建工具。
它非常的輕量,沒有任何依賴,因為它內(nèi)置了 Lua 運行時。
它使用 xmake.lua 維護項目構(gòu)建,相比 makefile/CMakeLists.txt,配置語法更加簡潔直觀,對新手非常友好,短時間內(nèi)就能快速入門,能夠讓用戶把更多的精力集中在實際的項目開發(fā)上。
我們能夠使用它像 Make/Ninja 那樣可以直接編譯項目,也可以像 CMake/Meson 那樣生成工程文件,另外它還有內(nèi)置的包管理系統(tǒng)來幫助用戶解決 C/C++ 依賴庫的集成使用問題。
目前,Xmake 主要用于 C/C++ 項目的構(gòu)建,但是同時也支持其他 native 語言的構(gòu)建,可以實現(xiàn)跟 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
在介紹新特性之前,我們有一個好消息要告訴大家,Xmake 最近進入了 Debian 的官方倉庫:https://packages.debian.org/sid/xmake,
等到明年4月份 Ubuntu 24.04 發(fā)布,我們應(yīng)該就能直接通過 apt install xmake
命令去快速安裝 Xmake 了。
同時也感謝 @Lance Lin 的幫助,他全程幫助我們維護并上傳 Xmake 包到 Debian 倉庫,真的非常感謝!
接下來,我們來介紹下 2.8.5 版本引入的一些改動,這個版本帶來了很多的新特性,尤其是對鏈接排序,鏈接組的支持,還有對 xmake test
內(nèi)置單元測試的支持。
另外,我們還新增了 Apple XROS 平臺的構(gòu)建支持,可以用于構(gòu)建蘋果新的 VisionOS 上的程序,還有我們還提供了更加靈活通用的 check_sizeof
檢測接口,用于快速檢測類型的大小。
這是一個存在了兩年多的需求,主要用于調(diào)整 target 內(nèi)部的鏈接順序。
由于 xmake 提供了 add_links
, add_deps
, add_packages
, add_options
接口,可以配置目標、依賴,包和選項中的鏈接,盡管 add_links
本身的鏈接順序可以根據(jù)添加順序來調(diào)整。
但是 links,deps 和 packages 之間的鏈接順序,只能按固定順序生成,無法靈活調(diào)整,這對于一些復雜的項目,就有點顯得力不從心了。
而我們在這個版本,徹底解決了這個問題,新增了 add_linkorders
接口,可用于配置目標、依賴、包、選項、鏈接組引入的各種鏈接順序。
更多詳情和背景,請見:#1452
為了更加靈活的調(diào)整 target 內(nèi)部的各種鏈接順序,我們可以通過 add_linkorders
這個新接口來實現(xiàn),例如:
add_links("a", "b", "c", "d", "e")
-- e -> b -> a
add_linkorders("e", "b", "a")
-- e -> d
add_linkorders("e", "d")
add_links 是配置的初始鏈接順序,然后我們通過 add_linkorders 配置了兩個局部鏈接依賴 e -> b -> a
和 e -> d
后。
xmake 內(nèi)部就會根據(jù)這些配置,生成 DAG 圖,通過拓撲排序的方式,生成最終的鏈接順序,提供給鏈接器。
當然,如果存在循環(huán)依賴,產(chǎn)生了環(huán),它也會提供警告信息。
另外,對于循環(huán)依賴,我們也可以通過 add_linkgroups
配置鏈接組的方式也解決。
并且 add_linkorders
也能夠?qū)︽溄咏M進行排序。
add_links("a", "b", "c", "d", "e")
add_linkgroups("c", "d", {name = "foo", group = true})
add_linkorders("e", "linkgroup::foo")
如果要排序鏈接組,我們需要對每個鏈接組取個名,{name = "foo"}
,然后就能在 add_linkorders
里面通過 linkgroup::foo
去引用配置了。
我們也可以排序鏈接和 macOS/iPhoneOS 的 frameworks。
add_links("a", "b", "c", "d", "e")
add_frameworks("Foundation", "CoreFoundation")
add_linkorders("e", "framework::CoreFoundation")
Xmake 是一個基于 Lua 的輕量級跨平臺構(gòu)建工具。
它非常的輕量,沒有任何依賴,因為它內(nèi)置了 Lua 運行時。
它使用 xmake.lua 維護項目構(gòu)建,相比 makefile/CMakeLists.txt,配置語法更加簡潔直觀,對新手非常友好,短時間內(nèi)就能快速入門,能夠讓用戶把更多的精力集中在實際的項目開發(fā)上。
我們能夠使用它像 Make/Ninja 那樣可以直接編譯項目,也可以像 CMake/Meson 那樣生成工程文件,另外它還有內(nèi)置的包管理系統(tǒng)來幫助用戶解決 C/C++ 依賴庫的集成使用問題。
目前,Xmake 主要用于 C/C++ 項目的構(gòu)建,但是同時也支持其他 native 語言的構(gòu)建,可以實現(xiàn)跟 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
新版本中,我們新增了 Xmake 自身源碼的斷點調(diào)試支持,這可以幫助貢獻者更加快速的熟悉 xmake 源碼,也可以幫助用戶去快速調(diào)試分析自身項目的配置腳本。
另外,我們 xmake-repo 官方倉庫包的數(shù)量也即將突破 1100,短短一個月的時間,就新增了 100 多個包,非常感謝 @star-hengxing 的貢獻。
同時,我們重點改進了 Wasm 的構(gòu)建支持,以及 Qt6 for wasm 的支持。
2.8.3 版本,我們新增了 Lua 斷點調(diào)試支持,配合 VSCode-EmmyLua 插件,我們可以很方便的在 VSCode 中斷點調(diào)試 Xmake 自身源碼。
首先,我們需要在 VSCode 的插件市場安裝 VSCode-EmmyLua 插件,然后執(zhí)行下面的命令更新下 xmake-repo 倉庫保持最新。
xrepo update-repo
!> Xmake 也需要保持最新版本。
然后,在自己的工程目錄下執(zhí)行以下命令:
$ xrepo env -b emmylua_debugger -- xmake build
其中 xrepo env -b emmylua_debugger
用于綁定 EmmyLua 調(diào)試器插件環(huán)境,而 --
后面的參數(shù),就是我們實際需要被調(diào)試的 xmake 命令。
通常我們僅僅調(diào)試 xmake build
構(gòu)建,如果想要調(diào)試其他命令,可以自己調(diào)整,比如想要調(diào)試 xmake install -o /tmp
安裝命令,那么可以改成:
$ xrepo env -b emmylua_debugger -- xmake install -o /tmp
執(zhí)行完上面的命令后,它不會立即退出,會一直處于等待調(diào)試狀態(tài),有可能沒有任何輸出。
這個時候,我們不要急著退出它,繼續(xù)打開 VSCode,并在 VSCode 中打開 Xmake 的 Lua 腳本源碼目錄。
也就是這個目錄:Xmake Lua Scripts,我們可以下載的本地,也可以直接打開 Xmake 安裝目錄中的 lua 腳本目錄。
然后切換到 VSCode 的調(diào)試 Tab 頁,點擊 RunDebug
-> Emmylua New Debug
就能連接到我們的 xmake build
命令調(diào)試端,開啟調(diào)試。
如下圖所示,默認的起始斷點會自動中斷到 debugger:_start_emmylua_debugger
內(nèi)部,我們可以點擊單步跳出當前函數(shù),就能進入 main 入口。
然后設(shè)置自己的斷點,點擊繼續(xù)運行,就能中斷到自己想要調(diào)試的代碼位置。
我們也可以在項目工程的配置腳本中設(shè)置斷點,也可以實現(xiàn)快速調(diào)試自己的配置腳本,而不僅僅是 Xmake 自身源碼。