CMake给工程编写配置文件

本文介绍如何通过config_fileoption给工程进行额外配置。

首先把例子给出来:

目录结构

1
2
3
4
-include
-config
	- config.hpp.in
CMakeLists.txt

然后我们在config.hpp.in中编写:

1
2
3
#cmakedefine PROJECT_VERSION_MAJOR 1
#cmakedefine PROJECT_VERSION_MINOR 2
#cmakedefine PROJECT_ROOT_PATH @PROJECT_SOURCE_DIR@

然后我们在CMakeLists.txt中增加如下代码:

1
2
3
4
5
config_file(config/config.hpp.in
						include/config.hpp)
option(PROJECT_VERSION_MAJOR "major version" ON)
option(PROJECT_VERSION_MINOR "minor version" ON)
option(PROJECT_ROOT_PATH "project root path" ON)

然后我们cmake .,可以在include文件夹下看到出现了config.hpp:

1
2
3
#define PROJECT_VERSION_MAJOR 1
#define PROJECT_VERSION_MINOR 2
#define PROJECT_ROOT_PATH ~/Documents

产生了三个宏,分别表示工程的主版本,副版本和工程目录。这样我们就可以在源代码中#include "config.hpp"来得到这些量了。

实际上cmake给出了两个命令config_fileoption来像这样产生一些宏用于配置工程。首先config_file()命令常用格式如下:

1
config_file(srcfile dstfile)

srcfile用于指定你编写的配置文件的路径(这里是config/config.hpp.in),dstfile则是在cmake命令后,这个文件会被解析到哪个地方。

然后是配置文件的编写,使用#cmakedefine即可:

1
2
3
#cmakedefine VAR1 //不给初始值,这样产生之后是#define VAR1
#cmakedefine VAR2 2 //给初始值2,产生#define VAR2 2
#cmakedefine VAR3 @VAR2@	//给初始值VAR2也就是2,产生#define VAR3 2

这里要注意,如果你想要把变量赋值,使用@@而不是${},而且在CMakeLists.txt文件中存在的变量也可以赋值哦(就像例子里面的PROJECT_SOURCE_DIR一样)。

仅仅写完配置文件还不够,如果你不告诉cmake使用这些变量的话,cmake只会为你产出

1
/*#undef VAR1*/

这种代码。你需要使用option()命令告诉cmake启用哪一个:

1
2
3
4
5
6
option(VAR1 "这里是对变量的描述,必须有,不影响产生的文件" ON)	#使用ON表示启用,默认为OFF
if(VAR1)		#启用了之后cmake里面也可以使用哦
	option(VAR2 "this is var2" ON)
	set(VAR2 4)	#重新设置VAR2的值
endif(VAR1)
option(VAR3 "this is var3" ON)

这样就会产生

1
2
3
#define PROJECT_VERSION_MAJOR 1
#define PROJECT_VERSION_MINOR 4
#define PROJECT_ROOT_PATH ~/Documents

这种控制工程的方法很舒服,比如在我们制作游戏的时候,图像一般放在工程的resources目录下,但是在build的时候一般我们直接会cd build;cmake ..;./game这样执行,这样如果你在游戏中使用的路径是resources/xxx.png的话就会找不到文件,必须先退回工程根目录才能找到,很麻烦。我们这个时候就可以将图像路径写一个配置文件,然后改变源代码为相对路径,就可以不用返回上级目录直接run了。

updatedupdated2023-06-082023-06-08