xmake是一个基于Lua的轻量级现代化c/c++的项目构建工具,主要特点是:语法简单易上手,提供更加可读的项目维护,实现跨平台行为一致的构建体验。
本文主要详细讲解如何编写一些常用的基础xmake.lua描述配置,来实现一些简单的C/C++项目构建管理。
对于大部分小项目,这些配置已经完全足够使用,本系列后期进阶教程中,我会深入详细讲解如果使用一些高级特性来更加灵活定制化地配置项目。
- 项目源码
- 官方文档
先来一段最简短的
一行描述即可编译src目录下所有c源文件,然后生成一个名为demo的可执行文件。
target("demo", {kind = "binary", files = "src/*.c"})
上面的写法是精简写法,通常我们更推荐使用下面展开式写法:
target("demo") set_kind("binary") add_files("src/*.c")
这两者完全等价,如果配置很简短,可以完全精简成一行,而拆分成多行更加方便灵活配置。
如果没有特殊目的,下文我们都会采用第二段的写法。
配置项目目标类型
通常的C/C++项目生成的目标文件主要有三大类:可执行程序,静态库,动态库。
我们可以通过set_kind()配置来设置,分别对应:binary, static, shared
例如,我们想要编译动态库,只需要修改kind:
target("demo") set_kind("shared") add_files("src/*.c")
添加宏定义
编译宏的设置,大多数c/c++项目都会用到,一般如果我们设置编译flags传给gcc/clang,都是要配置:-DXXX
而在xmake里面,提供了add_defines()内置接口来配置:
target("demo") set_kind("shared") add_files("src/*.c") add_defines("XXX")
条件配置
那如果我们想在不同编译平台,分别设置不同的宏开关呢?我们可以利用lua内置的if语句很方便的实现:
target("demo") set_kind("shared") add_files("src/*.c") add_defines("XXX") if is_plat("linux", "macosx") then add_defines("YYY") end
我们通过is_plat()判断,如果当前编译目标平台是linux或者macosx,那么target会额外增加-DYYY宏定义。
全局配置
我们在target("demo")下面的所有配置,都属于demo这个target子域,并不是全局的,所以你会看到通常配置上都加了缩进,就是为了凸显作用域的影响范围。
通常如果多个target连续定义,下一个target定义就会自动结束上个target的作用域,每个target的配置完全独立,互不干扰