2016-01-27 170 views
0

假設我有這樣的項目結構:項目依賴與cmake的

Root 
    + ProjA 
    + SubA.1 
    + SubA.2 
    + ProjB 
    + SubB.1 
    + SubB.2 

而且依賴我的設置是:

SubA.2 depends on SubA.1 
ProjA depends on SubA.1 and SubA.2 
ProjB depends on ProjA 

我想要做的建造順序是這樣的,當開始與make -jX

1. SubA.1 
2. SubA.2 
3. SubB.1 SubB.2 

但事實卻是:

1. SubA.1 SubB.1 SubB.2 
2. SubA.2 

看來ProjB => ProjA不能用來讓所有的SubB S編譯後SubA秒。

在所有SubA s完成後,如何才能使所有SubB都生成?

+0

你有哪一種依賴?如果處於鏈接時,依賴項目的所有對象都可以構建,並且只有鏈接階段可能必須等待依賴目標完成。 – Antonio

回答

2

在CMake依賴關係只能在每個目標的基礎上設置。

您應該決定是否ProjB取決於內部件是否爲ProjA。 「內部」是指目標的名稱,CMake變量的值等等。

  1. 如果ProjB實際需要的ProjA內部,你可以仔細地確定ProjA目標,這需要一個或另一個ProjB目標,並設置只需要依賴。 ProjA這樣的建築物可能與ProjBmake -j交錯,但建築是正確的。

例如,如果SubB.1是可執行的,這需要SubA.1庫用於與鏈接,然後

target_link_libraries(SubB.1 SubA.1) 

自動設置所需要的依賴關係。

如果SubB.2使用可執行SubA.2,然後使用

add_custom_command(OUTPUT <subB.2_file> 
    COMMAND SubA.2 <args> 
) 

將自動設置所需要的依賴關係生成。

  • 如果ProjB不知道有關內部的ProjA,它是唯一已知的是ProjB只能建立在ProjA已經建成,那麼你可以使用ExternalProject_Add用於構建兩個項目和相關性集合創建目標之間:
  • 的CMakeLists.txt

    ExternalProject_Add(ProjA ...) 
    ExternalProject_Add(ProjB ...) 
    # Now `ProjA` and `ProjB` are targets in top-level project. 
    add_dependencies(ProjB ProjA) 
    
    +0

    感謝您的回答。我已經弄清楚了我的問題。無論「ProjB」如何依賴於「ProjA」,它與內部的「SubB」無關。我不得不直接依賴'ProjA'來設置所有'SubB'。 – jayatubi