xmake 是一个基于 lua 的轻量级跨平台构建工具,使用 xmake.lua 文件维护项目构建。相比 makefile/cmakelists.txt,xmake 的配置语法更加简洁直观,对新手非常友好,短时间内即可快速上手,让用户能够将更多精力集中在实际的项目开发上。
在 2.5.2 版本中,xmake 增加了一个重量级的新特性:自动拉取远程交叉编译工具链。这个功能对于有过交叉编译和 C/C++ 项目移植经验的开发者来说尤为重要,因为配置和下载交叉编译工具链是一个复杂且容易出错的过程。现在,xmake 可以自动下载项目所需的工具链,并使用这些工具链直接编译项目,用户无需关心如何配置工具链,只需执行
xmake

不仅如此,对于 C/C++ 依赖包的集成,xmake 也可以自动切换到对应工具链进行编译和安装,整个过程完全自动化,用户无需手动干预。
除了交叉编译工具链,xmake 还可以自动拉取其他工具链,例如特定版本的 llvm、llvm-mingw 和 zig 等,用于参与 C/C++/Zig 项目的编译。即使是 cmake 也不支持工具链的自动拉取,顶多只能配合 vcpkg/conan 等第三方包管理工具对 C/C++ 依赖包进行集成,而 xmake 则内置了自己的包管理工具,无需任何外部依赖。
从 2.5.2 版本开始,xmake 支持拉取指定的工具链来集成编译项目,并且可以将依赖包切换到对应的远程工具链进行编译后集成。目前,xmake-repo 仓库中已经收录了以下工具链包:llvm、llvm-mingw、gnu-rm、muslcc 和 zig。虽然目前支持的工具链包数量有限,但整体架构已经打通,后续将收录更多的工具链,如 gcc、tinyc 和 vs-buildtools 等。
由于 xmake 的包支持语义版本,如果项目依赖特定版本的 gcc/clang 编译器,xmake 会自动检测当前系统的 gcc/clang 版本是否满足需求。如果版本不满足,xmake 会自动拉取并安装特定版本的 gcc/clang,然后再进行项目编译。
以下是使用特定版本的 llvm 工具链(例如 llvm-10)编译项目的示例代码:
add_requires("llvm 10.x", {alias = "llvm-10"})
target("test")
set_kind("binary")
add_files("src/*.c")
set_toolchains("llvm@llvm-10")其中,
llvm@llvm-10
llvm-10
后续还将增加 gcc 工具链包到 xmake-repo,使得用户可以自由切换到 gcc-10、gcc-11 等特定版本的 gcc 编译器,而无需手动安装。
以下是拉取指定的交叉编译工具链(例如 muslcc)来编译项目的示例代码:
add_requires("muslcc")
target("test")
set_kind("binary")
add_files("src/*.c")
set_toolchains("@muslcc")muslcc 是 https://www.php.cn/link/3f54e27d6a63e1397fe94938013a9161 提供的一款交叉编译工具链,默认 xmake 会自动集成编译
x86_64-linux-musl-
xmake f -a arm64
aarch64-linux-musl-
使用指定的 muslcc 交叉编译工具链去编译和集成所有的依赖包的示例代码如下:
add_requires("muslcc")
add_requires("zlib", "libogg", {system = false})
set_toolchains("@muslcc")
target("test")
set_kind("binary")
add_files("src/*.c")
add_packages("zlib", "libogg")此时,工程中配置的 zlib、libogg 等依赖包会切换使用 muslcc 工具链,自动下载编译然后集成进来。也可以通过
set_plat/set_arch
拉取并集成特定版本的 zig 工具链的示例代码如下:
add_rules("mode.debug", "mode.release")
add_requires("zig 0.7.x")
target("test")
set_kind("binary")
add_files("src/*.zig")
set_toolchains("@zig")xmake 会先下载特定版本的 zig 工具链,然后使用此工具链编译 zig 项目。如果用户已经自行安装了 zig 工具链,xmake 会自动检测对应版本是否满足需求,如果满足则直接使用,无需重复下载安装。
zig cc
zig cc
$ xmake f --toolchain=zig $ xmake [ 25%]: compiling.release src/main.c "zig cc" -c -arch x86_64 -fvisibility=hidden -O3 -DNDEBUG -o build/.objs/xmake_test/macosx/x86_64/release/src/main.c.o src/main.c [ 50%]: linking.release test "zig c++" -o build/macosx/x86_64/release/test build/.objs/xmake_test/macosx/x86_64/release/src/main.c.o -arch x86_64 -stdlib=libc++ -Wl,-x -lz [100%]: build ok!
zig cc
$ xmake f -p windows -a x64 --toolchain=zig $ xmake
xmake 还提供了类似于 cmake 中
WINDOWS_EXPORT_ALL_SYMBOLS
utils.symbols.export_all
target("foo")
set_kind("shared")
add_files("src/foo.c")
add_rules("utils.symbols.export_all")
target("test")
set_kind("binary")
add_deps("foo")
add_files("src/main.c")xmake 还提供了将 MinGW 生成的动态库(xxx.dll & xxx.dll.a)转换成 Visual Studio 可以识别的格式(xxx.dll & xxx.lib)的功能,参考自 CMAKE_GNUtoMS 功能。这一功能对 Fortran & C++ 混合项目特别有帮助,可以使用如下辅助模块接口:
import("utils.platform.gnu2mslib")
gnu2mslib("xxx.lib", "xxx.dll.a")
gnu2mslib("xxx.lib", "xxx.def")
gnu2mslib("xxx.lib", "xxx.dll.a", {dllname = "xxx.dll", arch = "x64"})为了简化用户自定义 rule 的配置,xmake 新提供了
on_buildcmd_file
on_buildcmd_files
xmake project
on_build_files
以下是使用
on_buildcmd_file
rule("foo")
set_extensions(".xxx")
on_buildcmd_file(function (target, batchcmds, sourcefile, opt)
batchcmds:vrunv("gcc", {"-o", objectfile, "-c", sourcefile})
end)除了
batchcmds:vrunv
batchcmds:show("hello %s", "xmake")
batchcmds:vrunv("gcc", {"-o", objectfile, "-c", sourcefile}, {envs = {LD_LIBRARY_PATH="/xxx"}})
batchcmds:mkdir("/xxx") -- and cp, mv, rm, ln ..
batchcmds:compile(sourcefile_cx, objectfile, {configs = {includedirs = sourcefile_dir, languages = (sourcekind == "cxx" and "c++11")}})
batchcmds:link(objectfiles, targetfile, {configs = {linkdirs = ""}})以下是一个完整的示例,展示了如何使用
on_buildcmd_file
rule("lex")
set_extensions(".l", ".ll")
on_buildcmd_file(function (target, batchcmds, sourcefile_lex, opt)
-- imports
import("lib.detect.find_tool")
-- get lex
local lex = assert(find_tool("flex") or find_tool("lex"), "lex not found!")
-- get c/c++ source file for lex
local extension = path.extension(sourcefile_lex)
local sourcefile_cx = path.join(target:autogendir(), "rules", "lex_yacc", path.basename(sourcefile_lex) .. (extension == ".ll" and ".cpp" or ".c"))
-- add objectfile
local objectfile = target:objectfile(sourcefile_cx)
table.insert(target:objectfiles(), objectfile)
-- add commands
batchcmds:show_progress(opt.progress, "${color.build.object}compiling.lex %s", sourcefile_lex)
batchcmds:mkdir(path.directory(sourcefile_cx))
batchcmds:vrunv(lex.program, {"-o", sourcefile_cx, sourcefile_lex})
batchcmds:compile(sourcefile_cx, objectfile)
-- add deps
batchcmds:add_depfiles(sourcefile_lex)
batchcmds:set_depmtime(os.mtime(objectfile))
batchcmds:set_depcache(target:dependfile(objectfile))
end)关于依赖包配置的改进,xmake 新增了
add_extsources
on_fetch
add_extsources("pkgconfig::libusb-1.0")apt install libusb-1.0
package("libusb")
add_extsources("pkgconfig::libusb-1.0")
on_install(function (package)
-- ...
end)如果需要更复杂的查找逻辑,可以使用
on_fetch
package("libusb")
on_fetch("linux", function(package, opt)
if opt.system then
return find_package("pkgconfig::libusb-1.0")
end
end)在新版本中,xmake 还新增了对 windows
.manifest
add_files
add_rules("mode.debug", "mode.release")
target("test")
set_kind("binary")
add_files("src/*.cpp")
add_files("src/*.manifest")关于 xrepo 命令的改进,现在可以通过
xrepo remove --all
$ xrepo remove --all $ xrepo remove --all zlib pcr*
最后,xmake 改进了
add_packages
{public = true}add_rules("mode.debug", "mode.release")
add_requires("pcre2")
target("test")
set_kind("shared")
add_packages("pcre2", {public = true})
add_files("src/test.cpp")
target("demo")
add_deps("test")
set_kind("binary")
add_files("src/main.cpp")
-- 我们可以在这里使用被 test 目标导出的 pcre2 库具体导出的配置如下:
-- 默认私有,但是 links/linkdirs 还是会自动导出
add_packages("pcre2")
-- 全部导出,包括 includedirs, defines
add_packages("pcre2", {public = true})更新内容包括以下新特性:
zig cc
zig c++
rule("utils.symbols.export_all")utils.platform.gnu2mslib(mslib, gnulib)
add_extsources
xrepo remove --all
改进包括:
add_defines_h_if_ok
add_defines_h
Bugs 修复包括:
关注公众号 TBOOX 开源工程,专注于 C 跨平台开发解决方案。
以上就是xmake v2.5.2 发布, 支持自动拉取交叉工具链和依赖包集成的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号