先决条件更改后,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})