如何在不构建任何目标的情况下执行CMake自定义命令?
如何单独运行CMake中add_custom_command定义的命令
可以单独运行生成unit.cc的命令,无需构建依赖它的目标,下面是两种可行方案:
方案一:直接构建输出文件目标
CMake会为add_custom_command的OUTPUT项自动生成一个隐式目标,你可以直接指定这个输出文件作为构建目标来触发对应的命令:
在项目的build目录下执行:
cmake --build . --target unit.cc
这条命令只会运行生成unit.cc所需的步骤,不会触发任何依赖该文件的编译目标,完全跳过漫长的编译过程。
如果你的unit.cc不是在build根目录生成的(比如在子目录里),需要指定完整的相对路径,比如:
cmake --build . --target src/unit.cc
方案二:手动提取并执行命令
如果不想通过cmake --build触发,也可以直接提取add_custom_command里的命令,借助CMake来处理变量和生成器表达式后执行:
- 新建一个临时CMake脚本(比如
run_merge.cmake),把add_custom_command里的逻辑移进去:
# 导入项目的CMake缓存变量(需在build目录下运行) include(${CMAKE_CURRENT_LIST_DIR}/CMakeCache.txt) # 执行源文件合并命令 execute_process( COMMAND cat ${ALL_SOURCE_FILES} > ${CMAKE_CURRENT_LIST_DIR}/unit.cc RESULT_VARIABLE CMD_EXIT_CODE ) if(NOT CMD_EXIT_CODE EQUAL 0) message(FATAL_ERROR "合并源文件失败,退出码:${CMD_EXIT_CODE}") endif()
- 在build目录下运行这个脚本:
cmake -P run_merge.cmake
这种方式适合你需要自定义命令执行逻辑的场景,但如果原命令里用到了复杂的生成器表达式(比如$<CONFIG>),方案一更省心——CMake会自动处理这些表达式,无需你手动解析。
内容的提问来源于stack exchange,提问作者juce
相关产品推荐
相关产品推荐

