xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能快速入门,能够让用户把更多的精力集中在实际的项目开发上。
这个版本,我们正式将默认的 Luajit 运行时切换到 Lua5.4 运行时,并且新增了 Rust 和 C++ 的混合编译支持,我们也集成了 Cargo 的包管理支持。
另外,我们新增了一个实用的 utils.glsl2spv
规则,用于实现对 glsl shader 的编译支持,并自动生成对应的 C 代码头文件,方便快速内嵌编译后的 .spv 文件数据到代码中。
历经几个版本的迭代测试,我们在 2.6.1 版本,正式切换到 Lua5.4 运行时。
不过,这对于用户来说是完全无感知的,基本上没有任何兼容性问题,因为 xmake 对大部分接口都是封装过的,完全消除了 Lua 版本间的兼容性问题。
对于构建性能方面,由于构建的性能瓶颈主要来自编译器,Lua 自身的性能损耗完全可以忽略,而且 xmake 用 c 重写了 lua 原生的所有 io 接口,并且对耗时的接口都用 c 实现了优化。
因此,通过对比测试,不管是使用 Lua 还是 Luajit,构建项目的耗时基本一致,没有明显差异。
因为 Luajit 对一些新架构基本不支持,例如:riscv, lonngarch,而且 luajit 作者基本已经不怎么维护它了,一些新架构支持和稳定性修复进展属于停滞状态。
为了能够更好的支持更多的平台,已经获取更快的迭代维护,我们选择使用 Lua 会带来非常多的好处。
我们在这个版本中,新增了 Cargo 包依赖管理器的支持,不过目前主要用于 Rust 项目。
例子: https://github.com/xmake-io/xmake/tree/dev/tests/projects/rust/cargo_deps
add_rules("mode.release", "mode.debug")
add_requires("cargo::base64 0.13.0")
add_requires("cargo::flate2 1.0.17", {configs = {features = "zlib"}})
target("test")
set_kind("binary")
add_files("src/main.rs")
add_packages("cargo::base64", "cargo::flate2")
xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能快速入门,能够让用户把更多的精力集中在实际的项目开发上。
这个版本,我们增加了大量重量级的新特性,例如:Nim 语言项目的构建支持,Keil MDK,Circle 和 Wasi 工具链支持。
另外,我们对 C++20 Modules 进行了大改进,不仅支持最新 gcc-11, clang 和 msvc 编译器,而且还得模块间依赖做了自动分析,实现最大程度的并行化编译支持。
最后,还有一个比较有用的特性就是 Unity Build 支持,通过它我们可以对 C++ 代码的编译速度做到很大程度的提升。
最近,我们新增了对 Nimlang 项目的构建支持,相关 issues 见:#1756
我们可以使用 xmake create
命令创建空工程。
xmake create -l nim -t console test
xmake create -l nim -t static test
xmake create -l nim -t shared test
add_rules("mode.debug", "mode.release")
target("test")
set_kind("binary")
add_files("src/main.nim")
$ xmake -v
[ 33%]: linking.release test
/usr/local/bin/nim c --opt:speed --nimcache:build/.gens/test/macosx/x86_64/release/nimcache -o:b
uild/macosx/x86_64/release/test src/main.nim
[100%]: build ok!
xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能快速入门,能够让用户把更多的精力集中在实际的项目开发上。
这个版本,我们主要增加了对 Pascal 语言项目和 Swig 模块的构建支持,而对于上个版本新增的 Vala 语言支持,我们也做了进一步改进,增加了对动态库和静态库的构建支持。
除此之外,xmake 现在也已经支持了可选的 Lua5.3 运行时,提供更好的跨平台支持能力,目前 xmake 已经能够在 LoongArch 架构上正常运行。
目前,我们可以使用跨平台的 Free pascal 工具链 fpc 去编译构建 Pascal 程序,例如:
add_rules("mode.debug", "mode.release")
target("test")
set_kind("binary")
add_files("src/*.pas")
add_rules("mode.debug", "mode.release")
target("foo")
set_kind("shared")
add_files("src/foo.pas")
target("test")
set_kind("binary")
add_deps("foo")
add_files("src/main.pas")
我们也可以通过 add_fcflags()
接口添加 Pascal 代码相关的编译选项。
更多例子见:Pascal examples
xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能快速入门,能够让用户把更多的精力集中在实际的项目开发上。
这个版本,我们新增了很多新特性,不仅增加了对 Vala 和 Metal 语言的编译支持,另外我们还改进了包依赖管理,能够像 npm/package.lock 那样支持对依赖包的锁定和更新,使得用户的项目不会受到上游包仓库的更新变动影响。
此外,我们还提供了一些比较实用的规则, 比如 utils.bin2c
可以让用户方便快速的内嵌一些二进制资源文件到代码中去,以头文件的方式获取相关数据。
这个版本,我们已经可以初步支持构建 Vala 程序,只需要应用 add_rules("vala")
规则。
同时,我们需要添加一些依赖包,其中 glib 包是必须的,因为 vala 自身也会用到它。
add_values("vala.packages")
用于告诉 valac,项目需要哪些包,它会引入相关包的 vala api,但是包的依赖集成,还是需要通过 add_requires("lua")
下载集成。
例如:
add_rules("mode.release", "mode.debug")
add_requires("lua", "glib")
target("test")
set_kind("binary")
add_rules("vala")
add_files("src/*.vala")
add_packages("lua", "glib")
add_values("vala.packages", "lua")
更多例子:Vala examples
这个特性类似 npm 的 package.lock, cargo 的 cargo.lock。
xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能快速入门,能够让用户把更多的精力集中在实际的项目开发上。
这是一个稳定性修复版本,主要修复和改进了一些跟预编译二进制包相关的兼容性问题。另外新增了一些实用的接口来设置默认的编译平台、架构和模式,以及允许的编译平台、架构列表等等。
上个版本对 Windows 下的 预编译包安装做了初步的支持,但是由于没有考虑 toolset 版本的兼容性问题,因此如果用户的 vs 版本过低,就会在集成包时候出现链接问题。
根据 ms 的官方描述,其实 msvc 的二进制库对于 toolset 的版本是向下兼容的。https://docs.microsoft.com/en-us/cpp/porting/binary-compat-2015-2017?view=msvc-160
You can mix binaries built by different versions of the v140, v141, and v142 toolsets. However, you must link by using a toolset at least as recent as the most recent binary in your app. Here’s an example: you can link an app compiled using any 2017 toolset (v141, versions 15.0 through 15.9) to a static library compiled using, say, Visual Studio 2019 version 16.2 (v142), if they’re linked using a version 16.2 or later toolset. You can link a version 16.2 library to a version 16.4 app as long as you use a 16.4 or later toolset.
也就是说,云端采用 v141 编译的库,用户的 msvc toolset 只要是 >=141 就可以兼容支持。
因此,我们改进了云端的预编译逻辑,针对 vs2015/14.16 和 vs2019/14.29 两个工具集分别进行预编译,然后 xmake 会根据用户 msvc 的 toolset 版本,优先选取最优的兼容版本库下载集成。