我有一個關於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,現在很好:) –