CMake:构建时为特定目标运行自定义命令

本文介绍了如何在CMake项目中使用`add_custom_command`创建自定义构建规则,如生成`config.h`文件,并将其作为依赖项。通过`generate_config.cmake`脚本设置宏并动态编译配置。
摘要由CSDN通过智能技术生成

CMake:构建时为特定目标运行自定义命令

导言

add_custom_command 是 CMake 中用于添加自定义构建规则的命令,通常用于在编译项目时执行一些自定义操作,例如生成文件、运行脚本等。

项目结构

.
├── CMakeLists.txt
├── generate_config.cmake
└── main.cpp

项目地址:

https://gitee.com/jiangli01/tutorials/tree/master/cmake-tutorial/chapter5/03

相关源码

CMakeLists.txt

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

# 你可以在这里定义所需的宏
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;
}

结果

mkdir build & cd build
cmake ..
make

在这里插入图片描述

DEBUG_MODE: 1

最后,祝大家变得更强!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值