我有一个关于 CMake 的问题,这里似乎经常被问到,但似乎没有一个答案能解决我的问题。
在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)
在主目录中有一个CMakeLists.txt
用于part.out
生成另一个文件的文件:
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
不存在)我希望它被(重新)生成
因此,如果我添加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
重新生成,afull.out
也不会重新生成,因为它不依赖于part.out
文件本身。
那么如何连接这两种场景呢?我正在考虑同时添加两者DEPENDS
,但我怎么知道这是否总是有效?我的意思是在这种情况下,构建顺序在这里很重要。