CMake嵌套项目和目标

时间:2015-11-04 12:55:55

标签: c++ visual-studio visual-studio-2012 cmake

我在从CMake源代码树构建特定的Visual Studio项目时遇到问题。我想我们在各个子目录中有多个目标。在一个子目录中,我们启动一个新项目(和解决方案)。此项目目标中的项目应该是ALL_BUILD的一部分,但不能在父ALL_BUILD中。

简而言之:

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应该构建,但依赖关系不应该或甚至应该可见。

有解决方案吗?

1 个答案:

答案 0 :(得分:3)

在一个CMakeLists.txt源树中找到的所有目标都将生成一个Visual Studio项目文件。而且 - 正如您已经发现的那样 - 每个目标/项目或目录都设置了EXCLUDE_FROM_ALLEXCLUDE_FROM_DEFAULT_BUILD

因此,您可以使用ExternalProject_Add()拆分/链接项目。由于Other_Related_Stuff取决于MainApplication,因此您应该在ExternalProject_Add()的CMake文件中致电Other_Related_Stuff

所以我的推荐看起来像这样:

<强>的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子目录中生成您的第二个解决方案文件。

<强>参考