CMake嵌套项目和目标

CMake Nested Projects and Targets

本文关键字:目标 项目 嵌套 CMake      更新时间:2023-10-16

我在从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生成器,我们可以获得两个解决方案文件。这是正确的。在这两个解决方案中,我们都有这三个项目(因为OtherRelatedStuff取决于正在构建的MainApplication,而OtherRelatedtuff是主项目的一部分)。

现在:ALL_BUILD构建所有项目。

当我设置时

set_target_properties(OtherTarget PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1)

在两个解决方案中,OtherTarget都被禁用了。

我想做的是:

解决方案1:

Main.Sln中,不应存在其他目标。在OtherRelatedStuff.sln中,可能存在MainApplication,但不应生成。也许也不应该有一个MainApplication。

解决方案2:

Main.Sln中,不应生成OtherTarget(从生成中排除)。在OtherRelatedStuff.sln中,应该构建OtherTarget,但依赖项不可见,甚至应该可见。

有解决方案吗?

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

参考

  • 具有多个可执行文件的CMake共享库