CMake 嵌套项目和目标

8

我在从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的构建,而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个回答

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

参考资料


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接