CMake如何在构建、安装场景下为configure_file设置不同值
CMake 安装阶段动态修改配置并恢复的实现方案
核心实现逻辑
通过拆分构建/安装双场景的路径配置,结合CMake的PRE_INSTALL/POST_INSTALL钩子、自定义目标实现配置的动态生成、重编译和事后恢复。
步骤1:定义路径变量与备份原始配置
在项目根目录的CMakeLists.txt中先声明双场景路径,默认生成构建用的配置文件并备份:
# 声明构建期、安装期的脚本路径 set(BUILD_SCRIPT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/src/scripts") set(INSTALL_SCRIPT_PATH "../scripts") # 配置模板、生成文件、备份文件路径定义 set(CONFIG_TEMPLATE "${CMAKE_CURRENT_SOURCE_DIR}/src/config.h.in") set(GENERATED_CONFIG "${CMAKE_CURRENT_BINARY_DIR}/src/config.h") set(ORIGINAL_CONFIG_BACKUP "${CMAKE_CURRENT_BINARY_DIR}/src/config.h.build.backup") # 模板文件示例(src/config.h.in): # #pragma once # #define SCRIPT_PATH "@SCRIPT_PATH@" # 首次生成构建用配置并备份 set(SCRIPT_PATH "${BUILD_SCRIPT_PATH}") configure_file("${CONFIG_TEMPLATE}" "${GENERATED_CONFIG}" @ONLY) file(COPY "${GENERATED_CONFIG}" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/src") file(RENAME "${CMAKE_CURRENT_BINARY_DIR}/src/config.h" "${ORIGINAL_CONFIG_BACKUP}") # 确保app目标依赖生成的配置头文件,修改配置后会自动重编 target_include_directories(app PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src)
步骤2:新增安装前置处理脚本
新建cmake/generate_install_config.cmake单独处理安装期配置生成,避免主逻辑污染:
# cmake/generate_install_config.cmake 内容 configure_file("${CONFIG_TEMPLATE}" "${GENERATED_CONFIG}" @ONLY)
步骤3:绑定安装钩子实现完整流程
在CMakeLists.txt中添加自定义目标和安装前后钩子:
# 自定义安装前置目标:生成安装用配置+重编可执行文件 add_custom_target(install_prepare COMMAND ${CMAKE_COMMAND} -DSCRIPT_PATH="${INSTALL_SCRIPT_PATH}" -DCONFIG_TEMPLATE="${CONFIG_TEMPLATE}" -DGENERATED_CONFIG="${GENERATED_CONFIG}" -P "${CMAKE_CURRENT_SOURCE_DIR}/cmake/generate_install_config.cmake" COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target app WORKING_DIRECTORY ${CMAKE_BINARY_DIR} DEPENDS "${CONFIG_TEMPLATE}" ) # 安装前置钩子:先执行安装准备逻辑 install(CODE " execute_process( COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target install_prepare WORKING_DIRECTORY ${CMAKE_BINARY_DIR} )" COMPONENT runtime PRE_INSTALL ) # 你的原有常规安装逻辑 install(TARGETS app RUNTIME DESTINATION bin) install(FILES "${BUILD_SCRIPT_PATH}/script.lua" DESTINATION scripts) # 安装后置钩子:恢复原始构建用配置 install(CODE " file(COPY \"${ORIGINAL_CONFIG_BACKUP}\" DESTINATION \"${CMAKE_CURRENT_BINARY_DIR}/src\") file(RENAME \"${CMAKE_CURRENT_BINARY_DIR}/src/config.h.build.backup\" \"${GENERATED_CONFIG}\") " COMPONENT runtime POST_INSTALL )
注意事项
- 如果你使用多组件安装/CPack打包,需确保所有涉及的组件都绑定了对应的
PRE_INSTALL/POST_INSTALL钩子 - 若配置文件有多个可变参数,只需在调用
generate_install_config.cmake时传入对应变量即可 - 该逻辑兼容
make install、ninja install以及CPack的打包流程,无需额外修改打包配置
内容的提问来源于stack exchange,提问作者Kamran
相关产品推荐
相关产品推荐

