You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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脚本,在目标执行时调用它,让脚本在运行阶段重新查找文件:

  1. 新建find_and_echo.cmake脚本(放在项目源码目录):
file(GLOB_RECURSE myTxtFiles "*.txt")
execute_process(
    COMMAND /usr/bin/echo ${myTxtFiles}
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
  1. 在主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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 11:25:58