虽然xmake的使用远没有cmake那么普及,cmake在可预见的将来都还是c++项目事实上的标准, 但是对于一些个人的小项目,直接使用xmake看起来还是更方便的,因此简单学习一下使用方式。

下载安装

虽然XMake支持了很多种安装方式,但是我还是选择了纯净版安装。 在Github仓库中选择xmake-[version]-win64.zip下载到本地解压,然后把对应路径添加到PATH环境变量即可。

Demo项目

xmake可以直接生成C++的HelloWorld项目

1
xmake create -l c++ -P ./demo

这个命令会在当前位置下创建./demo文件夹,在其中自动生成如下文件结构

1
2
3
4
5
demo
├── src
│ └── main.cpp
├── .gitignore
└── xmake.lua

其中xmake的核心配置文件xmake.lua有效内容如下

1
2
3
4
5
add_rules("mode.debug", "mode.release")

target("demo")
set_kind("binary")
add_files("src/*.cpp")

这里配置文件中的缩进是无意义的,所有的命令都是普通的lua函数,而且在配置文件中可使用的lua功能还是受限的。

主要的构建运行流程如下

1
2
3
4
5
# 构建与编译
xmake

# 运行demo项目
xmake run demo

默认使用的是release模式,可以改为debug模式以支持调试

1
2
3
4
5
6
7
8
# 切换到debug
xmake config -m debug

# 构建与编译
xmake

# 调试运行demo项目
xmake run -d demo

上面这两种就是最简单的xmake使用方式,其中很多命令都可以更加简略,例如xmake run可以省略对应的targetxmake run还可以缩写为xmake r

项目配置

前面Demo项目中的target对应的配置语句的语义是很显然的

1
2
3
target("demo")
set_kind("binary")
add_files("src/*.cpp")

在xmake的配置脚本中,target()命令代表一个生成目标,接下来进入这个目标的配置域,可以对这个目标进行具体配置。 配置域持续到下一个target()命令时自动结束,并切换到下一个生成目标进行配置。

可以使用target_end()命令手动关闭配置域,允许重复使用target()命令进入同一个目标的配置域进行补充配置。

按照生成目标进行分类,至少包括静态库、动态库和可执行文件,它们对应的配置模板为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- 静态库
target("library1")
set_kind("static")
add_files("src/library1/*.c")

-- 动态库
target("library2")
set_kind("shared")
add_files("src/library2/*.c")

-- 可执行文件
target("test")
set_kind("binary")
add_files("src/*c")
-- 使用上面的库
add_deps("library1")
add_deps("library2")

此外还支持纯头文件库目标

1
2
3
target("foo")
set_kind("headeronly")
add_headerfiles("src/foo.h")

对于每一个目标,可以设置它是否被xmake自动执行构建、安装、打包和运行

1
2
3
4
5
target("test1")
set_default(false)

target("test2")
set_default(true)

如果打开选项,则xmake run等命令在不指定target时会依次作用于所有打开的target,默认这个选项是打开的。

编译工具链

xmake在Windows上默认会使用msvc,包括在调试时也会启动VS。

可以使用下面的命令改为MingW-W64,修改对应的路径即可,此时调试器也会自动改用对应的gdb

1
2
xmake config --plat=mingw --sdk=path/to/mingw-w64
xmake

第一个命令也可以简写为

1
xmake f -p mingw --sdk=path/to/mingw-w64

可以使用下面的命令改为clang+llvm(基于msvc而非mingw的)

1
xmake f -p cross --toolchain=llvm --sdk=path/to/clang+llvm

补充

可以使用下面的命令清除缓存的配置项

1
xmake f -c

对于多层级的项目,可以将配置拆分到多个xmake.lua文件中,例如有如下的目录结构

1
2
3
4
5
6
demo
├── src
│ ├── xmake.lua
│ └── main.cpp
├── .gitignore
└── xmake.lua

xmake会首先执行顶层的xmake.lua,在末尾可以加上子文件夹所在目录

1
includes("src")

那么xmake就会继续执行子目录中的xmake.lua