如何让CMake add_custom_target的COMMAND参数动态刷新?
解决CMake自定义目标COMMAND参数动态刷新的问题
你的问题核心是file(GLOB_RECURSE)在CMake配置阶段就会执行并缓存结果,后续新增文件不会自动更新。要让COMMAND的参数动态刷新,需要把文件查找的逻辑放到目标运行阶段,而非配置阶段,以下是几种可行方案:
方案1:直接用Shell命令动态查找文件
跳过CMake的file(GLOB),直接在COMMAND里调用Shell的文件查找命令,每次执行目标时都会实时扫描文件:
add_custom_target( echo_files # 递归查找所有txt文件并输出(需bash开启globstar特性) COMMAND bash -c 'echo **/*.txt' # 更可靠的跨平台递归查找方式,用find命令 # COMMAND find ${CMAKE_CURRENT_SOURCE_DIR} -name "*.txt" -print0 | xargs -0 echo WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} )
方案2:运行时调用CMake脚本动态查找
编写独立的CMake脚本,在目标执行时调用它,让脚本在运行阶段重新查找文件:
- 新建
find_and_echo.cmake脚本(放在项目源码目录):
file(GLOB_RECURSE myTxtFiles "*.txt") execute_process( COMMAND /usr/bin/echo ${myTxtFiles} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} )
- 在主CMakeLists.txt中调用该脚本:
add_custom_target( echo_files COMMAND ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_SOURCE_DIR}/find_and_echo.cmake" WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} )
这种方法完全利用CMake自身语法,不依赖特定Shell特性,跨平台性更好。
方案3:内嵌CMake代码动态执行
直接在COMMAND里内嵌一段CMake代码,避免额外脚本文件:
add_custom_target( echo_files COMMAND ${CMAKE_COMMAND} -E env CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} bash -c ' ${CMAKE_COMMAND} -D DIR=$CMAKE_CURRENT_SOURCE_DIR -P - << "EOF" file(GLOB_RECURSE myTxtFiles "\${DIR}/*.txt") execute_process(COMMAND /usr/bin/echo \${myTxtFiles}) EOF ' )
这种方式通过Here Document传递CMake代码,在运行时动态执行文件查找逻辑,同样不会缓存结果。
内容的提问来源于stack exchange,提问作者JamesThomasMoon
相关产品推荐
相关产品推荐

