繁体   English   中英

使CMake Visual Studio中的所有项目都依赖一个项目

[英]Making all projects in CMake Visual Studio depend on one project

在我的项目中,我大约有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 ...)
....

根目录/ProjectA/CMakeLists.txt

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

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

把我的评论变成答案

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

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

可能的解决方案

  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) 

参考文献

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM