我有一个关于CMake的问题,这似乎在这里经常被问到,但没有一个答案似乎解决了我的问题。cmake,add_custom_command来自不同目录的依赖关系
在details
子目录,有一个CMakeLists.txt
包含:
add_custom_command(OUTPUT part.out
COMMAND foo --input=part.src --output=part.out
DEPENDS part.src)
add_custom_target(part_out
DEPENDS part.out)
在主目录存在使用part.out
用于生成另一个文件中的CMakeLists.txt
:
add_custom_command(OUTPUT full.out
COMMAND bar --input=./details/part.out --output=full.out)
add_custom_target(full_out
DEPENDS full.out)
的问题是我想在这里发生3件事:
- 如果
part.out
不存在需要生成 - 如果
part.out
是过时的(part.src
较新,part.out
)我希望它是再生 - 如果
full.out
是过时的(part.out
比full.out
更新,或full.out
desn't存在),我希望它是产生
所以,如果我添加DEPENDS ./details/part.out
到add_custom_command(OUTPUT full.out)
我将实现分2和3,而不是1点,因为如果我删除part.out
,然后我(重新)请致电make full_out
我会收到一个错误,说明没有规则可以生成./details/part.out
(因为它是来自另一个目录的规则)。
如果我添加DEPENDS full_out
到add_custom_command(OUTPUT full.out)
或add_custom_target(full_out)
我会实现点1和2,而不是3,因为即使part.out
进行再生,一个full.out
不会再生,因为它不依赖于part.out
文件本身。
那么如何连接两种情况? 我在考虑添加两个DEPENDS
但我怎么知道这是否会始终工作?我的意思是在这种情况下,构建顺序在这里很重要。
好吧,我知道如何连接目标。问题是当我看到一个文件(这是来自另一个目录**的另一个自定义命令**的结果)发生更改时,如何使custom_command的输出得到重建 –
@MichałWalenciak嗯。看到我的解决方案的扩展答案。 –
thx,现在很好:) –