2012-11-20 77 views
8

我有一個關於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件事:

  1. 如果part.out不存在需要生成
  2. 如果part.out是過時的(part.src較新,part.out)我希望它是再生
  3. 如果full.out是過時的(part.outfull.out更新,或full.out desn't存在),我希望它是產生

所以,如果我添加DEPENDS ./details/part.outadd_custom_command(OUTPUT full.out)我將實現分2和3,而不是1點,因爲如果我刪除part.out,然後我(重新)請致電make full_out我會收到一個錯誤,說明沒有規則可以生成./details/part.out(因爲它是來自另一個目錄的規則)。

如果我添加DEPENDS full_outadd_custom_command(OUTPUT full.out)add_custom_target(full_out)我會實現點1和2,而不是3,因爲即使part.out進行再生,一個full.out不會再生,因爲它不依賴於part.out文件本身。

那麼如何連接兩種情況? 我在考慮添加兩個DEPENDS但我怎麼知道這是否會始終工作?我的意思是在這種情況下,構建順序在這裏很重要。

回答

22

CMake docs for add_custom_target

默認情況下沒有什麼依賴於自定義的目標。使用ADD_DEPENDENCIES 向其他目標添加依賴關係。

所以我建議用

ADD_DEPENDENCIES(full_out part_out) 

編輯「連接」的目標: 工作實例

事實證明,你需要爲part.out

設置源文件屬性

這是我的工作示例(在VS2008下使用Windows):

CMakeLists。TXT:

cmake_minimum_required(VERSION 2.8) 
project(full) 

add_subdirectory(details) 

add_custom_command(OUTPUT full.out 
       COMMAND ${CMAKE_COMMAND} -E copy ./details/part.out full.out 
       DEPENDS details/part.out 
       ) 


add_custom_target(full_out 
       DEPENDS full.out details/part.out details/part.src 
      ) 


set_source_files_properties(details/part.out PROPERTIES GENERATED TRUE) 


add_dependencies(full_out part_out) 

細節/的CMakeLists.txt:

cmake_minimum_required(VERSION 2.8) 
project(part) 

add_custom_command(OUTPUT part.out 
       COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/part.src part.out 
       DEPENDS part.src) 

add_custom_target(part_out 
       DEPENDS part.out) 

此示例工作了所有的3說明的情況。

+1

好吧,我知道如何連接目標。問題是當我看到一個文件(這是來自另一個目錄**的另一個自定義命令**的結果)發生更改時,如何使custom_command的輸出得到重建 –

+1

@MichałWalenciak嗯。看到我的解決方案的擴展答案。 –

+0

thx,現在很好:) –