注意
本文最后更新于 2024-01-31,文中内容可能已过时。
一、导言
导言
add_custom_command 是 CMake 中用于添加自定义构建规则的命令,通常用于在编译项目时执行一些自定义操作,例如生成文件、运行脚本等。
二、项目结构
1
2
3
4
| .
├── CMakeLists.txt
├── generate_config.cmake
└── main.cpp
|
项目地址:
https://gitee.com/jiangli01/tutorials/tree/master/cmake-tutorial/chapter5/03
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| cmake_minimum_required(VERSION 3.10)
project(test_command)
# 设置需要生成的头文件的路径
set(CONFIG_HEADER ${CMAKE_BINARY_DIR}/config.h)
# 添加一个自定义命令来生成头文件
add_custom_command(
OUTPUT ${CONFIG_HEADER}
COMMAND ${CMAKE_COMMAND}
-DOUTPUT_FILE=${CONFIG_HEADER}
-P ${CMAKE_CURRENT_SOURCE_DIR}/generate_config.cmake
COMMENT "Generating config.h"
)
# 将生成的头文件的路径添加到包含目录
include_directories(${CMAKE_BINARY_DIR})
# 添加可执行文件
add_executable(test_app main.cpp)
# 将自定义命令的输出文件添加为依赖项
add_dependencies(test_app config_h_target)
# 定义一个自定义目标以便其他目标可以依赖它
add_custom_target(config_h_target DEPENDS ${CONFIG_HEADER})
# 将自定义目标添加到 ALL 阶段,以确保在每次构建时都生成 config.h
add_dependencies(test_app config_h_target)
|
generate_config.cmake
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| # 你可以在这里定义所需的宏
set(APP_NAME "TJUApp")
set(APP_VERSION "1.0.0")
set(DEBUG_MODE 1)
# 生成 config.h 头文件
file(WRITE ${OUTPUT_FILE} "#ifndef CONFIG_H\n")
file(APPEND ${OUTPUT_FILE} "#define CONFIG_H\n")
file(APPEND ${OUTPUT_FILE} "\n")
# 添加宏定义
file(APPEND ${OUTPUT_FILE} "#define APP_NAME \"${APP_NAME}\"\n")
file(APPEND ${OUTPUT_FILE} "#define APP_VERSION \"${APP_VERSION}\"\n")
if (DEBUG_MODE)
file(APPEND ${OUTPUT_FILE} "#define DEBUG_MODE 1\n")
else ()
file(APPEND ${OUTPUT_FILE} "#define DEBUG_MODE 0\n")
endif ()
# 结束文件
file(APPEND ${OUTPUT_FILE} "\n#endif\n")
#include <iostream>
#include "config.h"
int main() {
#ifdef DEBUG_MODE
std::cout << "DEBUG_MODE: " << DEBUG_MODE << std::endl;
#endif
return 0;
}
|
结果
1
2
3
| mkdir build & cd build
cmake ..
make
|
生成config.h文件
```
DEBUG_MODE: 1
```