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
新版本提供了远程编译支持,我们可以通过它可以远程服务器上编译代码,远程运行和调试。
服务器可以部署在 Linux/MacOS/Windows 上,实现跨平台编译,例如:在 Linux 上编译运行 Windows 程序,在 Windows 上编译运行 macOS/Linux 程序。
相比 ssh 远程登入编译,它更加的稳定,使用更加流畅,不会因为网络不稳定导致 ssh 终端输入卡顿,也可以实现本地快速编辑代码文件。
甚至我们可以在 vs/sublime/vscode/idea 等编辑器和IDE 中无缝实现远程编译,而不需要依赖 IDE 本身对远程编译的支持力度。
$ xmake service
<remote_build_server>: listening 0.0.0.0:9096 ..
我们也可以开启服务的同时,回显详细日志信息。
$ xmake service -vD
<remote_build_server>: listening 0.0.0.0:9096 ..
$ xmake service --start
$ xmake service --restart
$ xmake service --stop
我们首先,运行 xmake service
命令,它会自动生成一个默认的 service.conf
配置文件,存储到 ~/.xmake/service.conf
。
然后,我们编辑它,修复服务器的监听端口(可选)。
{
logfile = "/Users/ruki/.xmake/service/logs.txt",
remote_build = {
server = {
listen = "0.0.0.0:9096"
}
}
}
我们还是编辑这个文件 ~/.xmake/service.conf
,配置客户端需要连接的服务器地址。
{
logfile = "/Users/ruki/.xmake/service/logs.txt",
remote_build = {
client = {
connect = "192.168.56.101:9096",
}
}
}
我们也可以通过下面的命令,导入指定的配置文件。
$ xmake service --config=/tmp/service.conf
接下来,我们只需要进入需要远程编译的工程根目录,执行 xmake service --connect
命令,进行连接。
$ xmake create test
$ cd test
$ xmake service --connect
<remote_build_client>: connect 192.168.56.110:9096 ..
<remote_build_client>: connected!
<remote_build_client>: sync files in 192.168.56.110:9096 ..
Scanning files ..
Comparing 3 files ..
[+]: src/main.cpp
[+]: .gitignore
[+]: xmake.lua
3 files has been changed!
Archiving files ..
Uploading files with 1372 bytes ..
<remote_build_client>: sync files ok!
连接成功后,我们就可以像正常本地编译一样,进行远程编译。
$ xmake
<remote_build_client>: run xmake in 192.168.56.110:9096 ..
checking for platform ... macosx
checking for architecture ... x86_64
checking for Xcode directory ... /Applications/Xcode.app
checking for Codesign Identity of Xcode ... Apple Development: waruqi@gmail.com (T3NA4MRVPU)
checking for SDK version of Xcode for macosx (x86_64) ... 11.3
checking for Minimal target version of Xcode for macosx (x86_64) ... 11.4
[ 25%]: ccache compiling.release src/main.cpp
[ 50%]: linking.release test
[100%]: build ok!
<remote_build_client>: run command ok!
Xmake 是一个基于 Lua 的轻量级跨平台构建工具,关于 Xmake 与构建系统的介绍,我们已经在之前的文章中做了详细的介绍:C/C++ 构建系统,我用 xmake。
如果大家已经对 Xmake 已经有了大概的了解,就会知道,它不仅仅是一个构建工具,还内置了对 C/C++ 包管理的支持,我们也可以把 Xmake 理解为:
Xmake = Build backend + Project Generator + Package Manager
经过几年的持续迭代,Xmake 对 C/C++ 包管理的支持不断完善,也新增了不少实用的包管理特性,因此,在本文中,我们对其做一些总结,希望对大家有所帮助。
C++ 的生态比较繁杂,这其中也有一定历史原因,不管如何,官方没有提供原生的包管理支持,对我们开发者来说,使用第三方 C++ 依赖库多少存在很多不便。
其实,现在已经有很多强大的 C/C++ 包管理器,最知名,用的最多的有:vcpkg, conan, conda 等等,它们虽然很强大,但是有一个共同的问题:构建工具对它们没有提供原生的支持。
由于 CMake 对它们没有提供内置支持,想在 CMake 中使用它们集成依赖包非常繁琐,并且集成和使用的方式都不一致。
在 CMake 中使用 conan 集成 C/C++ 包,我们需要提供额外的 CMake Wrapper 脚本,以类似插件的方式注入进自己的工程中去。
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
现在,我们可以通过 set_base
接口去继承一个已有的包的全部配置,然后在此基础上重写部分配置。
这通常在用户自己的项目中,修改 xmake-repo 官方仓库的内置包比较有用,比如:修复改 urls,修改版本列表,安装逻辑等等。
例如,修改内置 zlib 包的 url,切到自己的 zlib 源码地址。
package("myzlib")
set_base("zlib")
set_urls("https://github.com/madler/zlib.git")
package_end()
add_requires("myzlib", {system = false, alias = "zlib"})
target("test")
set_kind("binary")
add_files("src/*.c")
add_packages("zlib")
我们也可以用来单纯添加一个别名包。
package("onetbb")
set_base("tbb")
我们可以通过 add_requires("onetbb")
集成安装 tbb 包,只是包名不同而已。
之前,我们限制了只能在 cross 平台下切换包安装的工具链,新版本中,我们可以支持更多平台下,对工具链的切换。
例如:
$ xrepo install --toolchains=clang zlib
我们可以在 linux 等平台上,快速切换到 clang 工具链编译安装 zlib 库。
我们也可以在 xmake.lua 的配置文件中去切换他们。
add_requires("zlib", {configs = {toolchains = "gcc-11"}})
不同的工具链安装的 zlib 包,会被分别存储在不同目录,互不干扰,不会存在编译器差异导致的链接兼容问题。
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
这个版本主要新增下面几个特性:
剩下的主要是一些零散的功能改进和 Bugs 修复,可以看下文末的更新内容明细,一些比较大的改动,下面也会逐一说明。
新版本中,Xmake 新增了 vcpkg 清单模式支持,通过它,我们就能支持 vcpkg 包的版本选择,例如:
add_requires("vcpkg::zlib 1.2.11+10")
add_requires("vcpkg::fmt >=8.0.1", {configs = {baseline = "50fd3d9957195575849a49fa591e645f1d8e7156"}})
add_requires("vcpkg::libpng", {configs = {features = {"apng"}}})
target("test")
set_kind("binary")
add_files("src/*.cpp")
add_packages("vcpkg::zlib", "vcpkg::fmt", "vcpkg::libpng")
但是,vcpkg 的版本选择限制还是不少,必须要硬编码指定 baseline,而且还不支持 <=1.0
, 1.x
等版本语义选择,不过总比之前不能选择版本好了不少。
我们新增了一个独立项目 xrepo-cmake。
它是一个基于 Xrepo/Xmake 的 C/C++ 包管理器的 CMake 包装器。
这允许使用 CMake 来构建您的项目,同时使用 Xrepo 来管理依赖包。这个项目的部分灵感来自 cmake-conan。
此项目的示例用例:
Xrepo 官方仓库:xmake-repo
xrepo.cmake 提供xrepo_package
函数来管理包。
xrepo_package(
"foo 1.2.3"
[CONFIGS feature1=true,feature2=false]
[MODE debug|release]
[OUTPUT verbose|diagnosis|quiet]
[DIRECTORY_SCOPE]
)
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
这个版本主要新增两大特性:
Run all tests
功能剩下的主要是一些零散的功能改进和 Bugs 修复,可以看下文末的更新内容明细,一些比较大的改动,下面也会逐一说明。
Xmake 也许是首个提供 Linux 内核驱动开发 内置支持的第三方构建工具了。
尽管网上也有介绍 CMake 如何去配置构建 linux 驱动,但是大都是通过 add_custom_command
方式自定义各种命令,然后执行 echo
去自己拼接生成 Linux 的 Makefile 文件。
也就是说,其实还是依赖 Linux 内核源码的 Makefile 来执行的构建,因此如果想自己追加一些编译配置和宏定义都会非常麻烦。
而使用 Xmake,我们可以提供更加灵活的可配置性,更加简单的配置文件,以及一键编译、自动依赖拉取集成、Linux kernel 源码自动下载集成,内核驱动交叉编译等特性。
我们通过一个最简单的字符驱动来直观感受下。
首先,我们准备一个 Hello World 驱动代码,例如:
add_requires("linux-headers", {configs = {driver_modules = true}})
target("hello")
add_rules("platform.linux.driver")
add_files("src/*.c")
add_packages("linux-headers")
set_license("GPL-2.0")
它的配置非常简单,只需要配置上支持模块的 linux-headers 包,然后应用 platform.linux.driver
构建规则就行了。
然后直接执行 xmake 命令,一键编译,生成内核驱动模块 hello.ko。
$ xmake
[ 20%]: ccache compiling.release src/add.c
[ 20%]: ccache compiling.release src/hello.c
[ 60%]: linking.release build/linux/x86_64/release/hello.ko
[100%]: build ok!