CMake:如何更改子目录项目目标的属性?
我正在尝试组织我的子项目中的目标(在本例中为poco),但我发现不能修改别名目标的属性。我希望我的外部项目中的目标位于它们自己的文件夹中,而不是分散在项目树中的任何地方(比如Visual Studio生成器)。是否有更简单的方法来添加具有我自己的属性的项目?
SO而不是:
- CMakePredefinedTargets
- ALL_BUILD
- INSTALL
- ...
- MyTargets
- SomeLibrary
- SomeExe
- CppUnit
- Crypto
- Data
- ...
我想:
- CMakePredefinedTargets
- ALL_BUILD
- INSTALL
- ...
- MyTargets
- SomeLibrary
- SomeExe
- Poco
- CppUnit
- Crypto
- Data
- ...
我的尝试:
function(add_subdirectory_with_folder folder_name)
function(add_library name type)
_add_library(${ARGV})
set_target_properties(${name}
PROPERTIES
FOLDER "${folder_name}"
)
endfunction()
add_subdirectory(${ARGN})
endfunction()
# External Libs
add_subdirectory_with_folder("Poco" libs/poco)
POCO库中的目标示例:
add_library( "${LIBNAME}" ${LIB_MODE} ${SRCS} )
add_library( "${POCO_LIBNAME}" ALIAS "${LIBNAME}")
set_target_properties( "${LIBNAME}"
PROPERTIES
VERSION ${SHARED_LIBRARY_VERSION} SOVERSION ${SHARED_LIBRARY_VERSION}
OUTPUT_NAME ${POCO_LIBNAME}
DEFINE_SYMBOL JSON_EXPORTS
)
我的目标是制作它,这样我就不必派生和维护我自己的库版本,我只想用这些库来调整生活质量。有没有其他方法可以用来组织IDE的项目树?我知道外部Project_Add的存在,但我不认为它具有我所寻找的设施。我将在未来以git子模块的形式添加其他项目,但根据是否有更简单的方法,我将探索其他方法。
编辑:
为了澄清,我已经为我自己项目的每个模块使用了一个单独的CMakeLists.txt,加上一个将它们捆绑在一起的顶级CMakeLists.txt,以及收集我的目标依赖的外部库。我想修改外部库的目标,而不必自己派生和维护它们,这样我就可以在Visual Studio、Xcode或其他程序中拥有良好的文件夹结构。Linux显然无关紧要,因为大多数编辑工具已经是基于文件夹的。
解决方案
我尝试了一下您的示例,下面是我的两个变体:
使用
BUILDSYSTEM_TARGETS
和SUBDIRECTORIES
目录属性评估目录中"不包括任何导入的目标或别名目标"的目标名称列表:cmake_minimum_required(VERSION 3.7) project(AliasFolderSub) set_property(GLOBAL PROPERTY USE_FOLDERS TRUE) function(get_all_targets _result _dir) get_property(_subdirs DIRECTORY "${_dir}" PROPERTY SUBDIRECTORIES) foreach(_subdir IN LISTS _subdirs) get_all_targets(${_result} "${_subdir}") endforeach() get_property(_sub_targets DIRECTORY "${_dir}" PROPERTY BUILDSYSTEM_TARGETS) set(${_result} ${${_result}} ${_sub_targets} PARENT_SCOPE) endfunction() function(add_subdirectory_with_folder _folder_name _folder) add_subdirectory(${_folder} ${ARGN}) get_all_targets(_targets "${_folder}") foreach(_target IN LISTS _targets) set_target_properties( ${_target} PROPERTIES FOLDER "${_folder_name}" ) endforeach() endfunction() # External Libs add_subdirectory_with_folder("Poco" libs/poco)
将
来完成FOLDER
目标属性转换为从同名目录属性继承的内容。这可以使用define_property()
将FOLDER
属性重新定义为INHERITED
:使用
INHERITED
选项,当所请求的属性未在指定给该命令的作用域中设置时,Get_Property()命令将链接到下一个更高的作用域。DIRECTORY
作用域链到GLOBAL
。TARGET
、SOURCE
和TEST
链接到DIRECTORY
。cmake_minimum_required(VERSION 2.6) project(AliasFolderSub) set_property(GLOBAL PROPERTY USE_FOLDERS TRUE) define_property( TARGET PROPERTY FOLDER INHERITED BRIEF_DOCS "Set the folder name." FULL_DOCS "Use to organize targets in an IDE." ) function(add_subdirectory_with_folder _folder_name _folder) add_subdirectory(${_folder} ${ARGN}) set_property(DIRECTORY "${_folder}" PROPERTY FOLDER "${_folder_name}") endfunction() # External Libs add_subdirectory_with_folder("Poco" libs/poco)
????????:使用
define_property()
重新定义现有属性的作用域是CMake的未记录行为。
参考资料
- Directory properties and subdirectories
- "make dist" equivalent in CMake
- How to set Visual Studio Filters for nested sub directory using cmake
相关文章