先决条件更改后,Cmake不会重建依赖项

先决条件更改后,Cmake不会重建依赖项,cmake,dependencies,rules,Cmake,Dependencies,Rules,我有下面的依赖关系图 a.txt <- prereq <- stamp <- dest 最初,我有以下文件 $ ls a.txt CMakeLists.txt 在第一次运行cmake和make之后,我们获得了预期的行为 $ cmake . $ make [ 0%] Built target prereq [100%] Generating stamp Update stamp. [100%] Built target dest 但是,在触摸了a.txt之后,我希望st

我有下面的依赖关系图

a.txt <- prereq <- stamp <- dest
最初,我有以下文件

$ ls
a.txt
CMakeLists.txt
在第一次运行cmake和make之后,我们获得了预期的行为

$ cmake .
$  make
[  0%] Built target prereq
[100%] Generating stamp
Update stamp.
[100%] Built target dest
但是,在触摸了
a.txt
之后,我希望
stamp
会得到更新,但它不会

$ touch a.txt
$ make
[  0%] Built target prereq
[100%] Built target dest

这是cmake中的错误还是预期的行为?如何在每次
prereq
更改时强制cmake运行touch命令?

取决于
add\u custom\u target()
add\u custom\u command()
调用的行为不同

只需将
ATXT
作为
add_custom_命令(OUTPUT${STAMP}…
调用的依赖项移动即可解决问题,因为在
add_custom_target()中命名非输出文件将不起作用

见:

依赖
:指定命令依赖的文件。如果任何依赖项是同一目录(
CMakeLists.txt
文件)中另一个自定义命令的
输出
,则CMake会自动将另一个自定义命令带到生成此命令的目标中。如果未指定
dependens
,则在输出丢失时将运行该命令

见:

依赖
:在同一目录(
CMakeLists.txt
文件)中使用
add_custom_command()
命令调用创建的自定义命令的参考文件和输出

add_custom_target()
中的
dependens
参数仅用于确定目标/自定义调用依赖关系

编辑:“后期依赖项注入”的备选方案

  • 如果您在相同的
    CMakeLists.txt
    文件中,则可以
    将依赖项附加到以前的自定义命令
    输出

    add_custom_command(
        OUTPUT ${STAMP}
        COMMAND ${CMAKE_COMMAND} -E echo "Update stamp."
        COMMAND ${CMAKE_COMMAND} -E touch ${STAMP}
    )
    
    add_custom_target(dest ALL DEPENDS ${STAMP})
    
    add_custom_command(
        OUTPUT ${STAMP}
        DEPENDS ${ATXT}
        APPEND
    )
    
  • 您可以添加一些虚拟输出来为您的
    prereq
    目标定制命令,但要重新触发
    dest
    的构建,您需要触摸一些输入或删除
    dest
    的输出(
    添加依赖项()
    本身不会重新触发自定义目标,它只是确保在调用另一个目标之前先调用一个目标):

  • 参考资料


    谢谢你的建议。确实,您的建议是可行的,但我之所以以这种方式构建cmake,首先是因为我想通过使用
    add\u dependencies
    命令动态添加依赖项,而这只适用于
    目标
    ,而不适用于
    输出文件
    。如果我在
    add_custom_命令
    中使用
    dependens
    命令,那么我将无法使用该命令,必须显式指定依赖项。@Dzellil不客气。您始终可以添加用于分组或依赖项注入的自定义目标,只需在其他自定义命令中移动源文件依赖项即可。明天我会相应地更新我的答案。
    add_custom_command(
        OUTPUT ${STAMP}
        COMMAND ${CMAKE_COMMAND} -E echo "Update stamp."
        COMMAND ${CMAKE_COMMAND} -E touch ${STAMP}
    )
    
    add_custom_target(dest ALL DEPENDS ${STAMP})
    
    add_custom_command(
        OUTPUT ${STAMP}
        DEPENDS ${ATXT}
        APPEND
    )
    
    add_custom_command(
        OUTPUT ATxtCheck
        COMMAND ${CMAKE_COMMAND} -E remove ${STAMP}
        COMMAND ${CMAKE_COMMAND} -E touch ATxtCheck
        DEPENDS ${ATXT}
    )
    
    add_custom_target(prereq DEPENDS ATxtCheck)
    
    add_custom_command(
        OUTPUT ${STAMP}
        COMMAND ${CMAKE_COMMAND} -E echo "Update stamp."
        COMMAND ${CMAKE_COMMAND} -E touch ${STAMP}
        DEPENDS prereq
    )
    
    add_custom_target(dest ALL DEPENDS ${STAMP})