Visual studio 使CMake Visual Studio中的所有项目都依赖于一个项目
在我的项目中,我有大约250个项目,其中一个主要项目使用了大部分项目。当主项目运行时,所有项目都是最新的,这一点很重要。所以基本上,VisualStudio应该在编译(并运行)MainProject时检查所有250个项目的更改。我的CMakeLists.txt文件如下所示 Root/CMakeLists.txtVisual studio 使CMake Visual Studio中的所有项目都依赖于一个项目,visual-studio,cmake,Visual Studio,Cmake,在我的项目中,我有大约250个项目,其中一个主要项目使用了大部分项目。当主项目运行时,所有项目都是最新的,这一点很重要。所以基本上,VisualStudio应该在编译(并运行)MainProject时检查所有250个项目的更改。我的CMakeLists.txt文件如下所示 Root/CMakeLists.txt .... add_subdirectory (MainProject) add_subdirectory (ProjectA) add_subdirectory (ProjectB) a
....
add_subdirectory (MainProject)
add_subdirectory (ProjectA)
add_subdirectory (ProjectB)
add_subdirectory (ProjectC)
add_subdirectory (ProjectD)
....
....
add_executable (MainProject a.cpp b.cpp)
add_dependencies (MainProject ProjectA ProjectB ...)
....
....
add_executable (ProjectA a.cpp b.cpp)
....
Root/MainProject/CMakeLists.txt
....
add_subdirectory (MainProject)
add_subdirectory (ProjectA)
add_subdirectory (ProjectB)
add_subdirectory (ProjectC)
add_subdirectory (ProjectD)
....
....
add_executable (MainProject a.cpp b.cpp)
add_dependencies (MainProject ProjectA ProjectB ...)
....
....
add_executable (ProjectA a.cpp b.cpp)
....
Root/ProjectA/CMakeLists.txt
....
add_subdirectory (MainProject)
add_subdirectory (ProjectA)
add_subdirectory (ProjectB)
add_subdirectory (ProjectC)
add_subdirectory (ProjectD)
....
....
add_executable (MainProject a.cpp b.cpp)
add_dependencies (MainProject ProjectA ProjectB ...)
....
....
add_executable (ProjectA a.cpp b.cpp)
....
显然,这是一个非常简单的例子,但希望这个想法是存在的。基本上,为了让VisualStudio检查所有250个左右项目的依赖关系,我必须将主项目中的所有其他项目添加为依赖关系。现在这根本不是一个优雅的解决方案,因为MainProject中的add_依赖项有很多依赖项。它是有效的,但是有什么比这个问题更优雅的吗?将我的评论转化为答案
目前(根据CMake版本3.5.x),据我所知,CMake本身没有提供全局目标列表(例如作为全局属性)
编辑:现在已实现:全局属性随CMake 3.7发布
可行的解决方案
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所建议的那样——使用你自己版本的那些命令来允许全局定制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)
main项目中?还是希望所有库、可执行文件和自定义目标都链接到main?后者。我希望在MainProject运行时检查所有库、可执行文件和自定义目标(即作为依赖项链接到main)。然后请查看我的答案和可能的解决方案。在您的情况下,覆盖add_executable()
,add_library()
和add_custom_target()
很可能就可以了。目前(根据CMake版本3.5.x),据我所知,CMake本身没有提供全局目标列表。啊,这是一个遗憾,但覆盖听起来足以解决我的问题。我不建议重新定义现有函数,而是定义自己的函数,比如说my_add_library
,这样就可以清楚地看到神奇的事情发生了。