在我的项目中,我有大约250个项目,其中一个主项目使用了大部分项目。在主项目运行时,所有项目都是最新的非常重要。所以基本上,Visual Studio应该在编译(并运行)MainProject时检查所有250个项目的更改。我的CMakeLists.txt文件看起来像这样。
根/的CMakeLists.txt
....
add_subdirectory (MainProject)
add_subdirectory (ProjectA)
add_subdirectory (ProjectB)
add_subdirectory (ProjectC)
add_subdirectory (ProjectD)
....
根/ MainProject /的CMakeLists.txt
....
add_executable (MainProject a.cpp b.cpp)
add_dependencies (MainProject ProjectA ProjectB ...)
....
根/项目A /的CMakeLists.txt
....
add_executable (ProjectA a.cpp b.cpp)
....
显然这是一个非常简单的例子,但希望这个想法存在。基本上,为了使Visual Studio检查所有250个项目的依赖关系,我必须将主项目中的所有其他项目添加为依赖项。现在这根本不是一个优雅的解决方案,因为MainProject中的add_dependencies具有很多依赖性。它有效,但这个问题有什么更优雅的吗?
答案 0 :(得分:0)
将我的评论转化为答案
目前(根据CMake版本3.5.x),据我所知,没有CMake本身提供的全局目标列表(例如作为全局属性)。
修改:现已实施:全球BUILDSYSTEM_TARGETS
属性已与CMake 3.7一起发布
可行解决方案
在您的情况下 - 假设您不想修改所有250个子项目的CMakeLists.txt
文件 - 覆盖add_executable()
,add_library()
和{{1会做的伎俩:
add_custom_target()
果然,如果你从头开始这样做,我会 - 正如@Lindydancer建议的那样 - 使用你自己的那些命令版本来允许全局自定义。
如果您遵循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})
始终是第一位的先决条件,您可以稍微简化一下:
MainProject
<强>参考强>