XMake 速成笔记
虽然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 | demo |
其中xmake的核心配置文件xmake.lua
有效内容如下
1
2
3
4
5add_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
可以省略对应的target
,xmake run
还可以缩写为xmake r
。
项目配置
前面Demo项目中的target
对应的配置语句的语义是很显然的
1
2
3target("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
3target("foo")
set_kind("headeronly")
add_headerfiles("src/foo.h")
对于每一个目标,可以设置它是否被xmake
自动执行构建、安装、打包和运行
1
2
3
4
5target("test1")
set_default(false)
target("test2")
set_default(true)
如果打开选项,则xmake run
等命令在不指定target
时会依次作用于所有打开的target
,默认这个选项是打开的。
编译工具链
xmake在Windows上默认会使用msvc,包括在调试时也会启动VS。
可以使用下面的命令改为MingW-W64,修改对应的路径即可,此时调试器也会自动改用对应的gdb
1
2xmake 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
6demo
├── src
│ ├── xmake.lua
│ └── main.cpp
├── .gitignore
└── xmake.lua
xmake
会首先执行顶层的xmake.lua
,在末尾可以加上子文件夹所在目录
1
includes("src")
那么xmake
就会继续执行子目录中的xmake.lua
。