【问题标题】:Making all projects in CMake Visual Studio depend on one project使 CMake Visual Studio 中的所有项目都依赖于一个项目
【发布时间】:2016-11-02 07:36:30
【问题描述】:

在我的项目中,我有大约 250 个项目,其中一个主要项目使用了大部分项目。当主项目运行时,所有项目都是最新的,这一点很重要。所以基本上,Visual Studio 应该在 MainProject 编译(和运行)时检查所有 250 个项目的更改。我的 CMakeLists.txt 文件如下所示。

根/CMakeLists.txt

....
add_subdirectory (MainProject)
add_subdirectory (ProjectA)
add_subdirectory (ProjectB)
add_subdirectory (ProjectC)
add_subdirectory (ProjectD)
....

Root/MainProject/CMakeLists.txt

....
add_executable (MainProject a.cpp b.cpp)
add_dependencies (MainProject ProjectA ProjectB ...)
....

Root/ProjectA/CMakeLists.txt

....
add_executable (ProjectA a.cpp b.cpp)
....

显然,这是一个非常简化的示例,但希望这个想法存在。基本上,为了让 Visual Studio 检查所有 250 个左右项目的依赖项,我必须将主项目中的所有其他项目添加为依赖项。现在这根本不是一个优雅的解决方案,因为 MainProject 中的 add_dependencies 中有很多依赖项。它有效,但是对于这个问题还有什么更优雅的吗?

【问题讨论】:

  • MainProject 中是否包含其他项目库?或者您希望将所有库、可执行文件和自定义目标链接到 main?
  • 后者。我希望在 MainProject 运行时检查所有库、可执行文件和自定义目标(即链接到 main 作为依赖项)。
  • 那么请查看我的答案以及可能的解决方案here。在您的情况下,很可能覆盖add_executable()add_library()add_custom_target() 就可以了。目前(根据​​ CMake 版本 3.5.x),据我所知,CMake 本身没有提供全局目标列表。
  • 啊,真可惜,但覆盖听起来足以解决我的问题。
  • 我不建议重新定义现有函数,而是定义你自己的函数,比如my_add_library,这样很明显会发生一些神奇的事情。

标签: visual-studio cmake


【解决方案1】:

把我的 cmets 变成答案

目前(根据​​ CMake 版本 3.5.x),据我所知,CMake 本身没有提供全局目标列表(例如,作为全局属性)。

编辑:现在实现了:全局BUILDSYSTEM_TARGETS属性随CMake 3.7发布

可能的解决方案

  1. 在您的情况下 - 假设您不想修改所有 250 个子项目的 CMakeLists.txt 文件 - 覆盖 add_executable()add_library()add_custom_target() 就可以了:

    cmake_minimum_required(VERSION 2.8)
    
    project(DependsAllTest)
    
    macro(add_library _target)
        _add_library(${_target} ${ARGN})
        set_property(GLOBAL APPEND PROPERTY GlobalTargetList ${_target})
    endmacro()
    
    macro(add_executable _target)
        _add_executable(${_target} ${ARGN})
        set_property(GLOBAL APPEND PROPERTY GlobalTargetList ${_target})
    endmacro()
    
    macro(add_custom_target _target)
        _add_custom_target(${_target} ${ARGN})
        set_property(GLOBAL APPEND PROPERTY GlobalTargetList ${_target})
    endmacro()
    
    add_subdirectory(MainProject)
    add_subdirectory(ProjectA)
    add_subdirectory(ProjectB)
    add_subdirectory(ProjectC)
    add_subdirectory(ProjectD)
    
    get_property(_allTargets GLOBAL PROPERTY GlobalTargetList)
    message(STATUS "GlobalTargetList: ${_allTargets}")
    add_dependencies(MainProject ${_allTargets})
    

    果然,如果您要从头开始执行此操作,我会 - 正如 @Lindydancer 所建议的那样 - 使用您自己的这些命令版本来允许全局自定义。

  2. 如果您遵循MainProject 始终是第一的先决条件,您可以稍微简化一下:

    cmake_minimum_required(VERSION 2.8)
    
    project(DependsAllTest2)
    
    macro(add_library _target)
        _add_library(${_target} ${ARGN})
        add_dependencies(MainProject ${_target})
    endmacro()
    
    macro(add_executable _target)
        _add_executable(${_target} ${ARGN})
        add_dependencies(MainProject ${_target})
    endmacro()
    
    macro(add_custom_target _target)
        _add_custom_target(${_target} ${ARGN})
        add_dependencies(MainProject ${_target})
    endmacro()
    
    add_subdirectory(MainProject)
    add_subdirectory(ProjectA)
    add_subdirectory(ProjectB)
    add_subdirectory(ProjectC)
    add_subdirectory(ProjectD)
    

参考文献

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 2010-10-14
    • 2015-07-08
    • 2012-08-27
    相关资源
    最近更新 更多