2015-11-04 71 views
3

我有一個從CMake源代碼樹建設特定的Visual Studio項目的問題。 Immagine我們在各個子目錄中有多個目標。在一個子目錄中,我們啓動一個新項目(和解決方案)。此項目目標中的項目應該是ALL_BUILD的一部分,但不在父項ALL_BUILD中。CMake嵌套項目和目標

簡而言之:

project(Main) 

add_executable(MainApplication ...) 
target_link_libraries(MainApplication PRIVATE Library_A) 

add_subdirectory(Library_A) 
    add_library(Library_A STATIC ...) 

add_subdirectory(Other_Related_Stuff_Using_MainApplication) 
    project(OtherRelatedStuff) 
    add_custom_target(OtherTarget ... DEPENDS MainApplication) 

現在有了一個Visual Studio生成我們得到兩個解決方案文件。這是正確的和正確的。在這兩個解決方案中,我們都有這三個項目(因爲OtherReleatedStuff依賴於MainApplication beeing構建而OtherRelatedStuff是Main-Project的一部分)。

現在:ALL_BUILD構建所有項目。

當我設置

set_target_properties(OtherTarget PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1) 

...在這兩種解決方案OtherTarget是禁用

我想要做的是:

解決方案1: 在Main.Sln不存在應OtherTarget。在OtherRelatedStuff.sln可能有MainApplication,但不應該建立。也許不應該有MainApplication。

解決方案2: 在Main.Sln,OtherTarget不應該建立(從生成除外)。在OtherRelatedStuff.sln中,OtherTarget應該生成,但依賴關係不應該或甚至不可見。

是否有解決方案?

回答

3

在一個CMakeLists.txt源樹中發現的所有目標都將生成一個Visual Studio項目文件。而且 - 正如您發現的那樣 - 每個目標/項目或目錄設置了EXCLUDE_FROM_ALLEXCLUDE_FROM_DEFAULT_BUILD

因此,您可以使用ExternalProject_Add()拆分/鏈接您的項目。並且由於Other_Related_Stuff取決於MainApplication,因此您應該在Other_Related_Stuff的CMake文件中調用ExternalProject_Add()

所以我的建議是這樣的:

的CMakeLists.txt

project(Main) 

add_subdirectory(Library_A) 

add_executable(MainApplication ...) 
target_link_libraries(MainApplication PRIVATE Library_A) 

Other_Related_Stuff /的CMakeLists.txt

project(OtherRelatedStuff) 

ExternalProject_Add(
    MainApplication 
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/.. 
    PREFIX MainApplication 
) 
add_custom_target(OtherTarget ... DEPENDS MainApplication) 

所以,現在你的主要CMakeLists.txtOther_Related_Stuff/CMakeLists.txt和它確實會產生你的第二個解決方案文件在MainApplication子目錄中。

參考