Ble*_*mer 6 c++ cmake build-tools poco-libraries
我正在尝试在子项目中组织目标(在本例中为poco),但是我发现无法为ALIAS目标修改属性。我希望外部项目中的目标位于它们自己的文件夹中,而不是扩展到项目树中的所有位置(例如Visual Studio生成器)。有没有更简单的方法来添加具有自己属性的项目?
所以代替:
- CMakePredefinedTargets
- ALL_BUILD
- INSTALL
- ...
- MyTargets
- SomeLibrary
- SomeExe
- CppUnit
- Crypto
- Data
- ...
Run Code Online (Sandbox Code Playgroud)
我想要:
- CMakePredefinedTargets
- ALL_BUILD
- INSTALL
- ...
- MyTargets
- SomeLibrary
- SomeExe
- Poco
- CppUnit
- Crypto
- Data
- ...
Run Code Online (Sandbox Code Playgroud)
我的尝试:
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)
Run Code Online (Sandbox Code Playgroud)
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
)
Run Code Online (Sandbox Code Playgroud)
我的目标是做到这一点,这样我就不必派生和维护自己的版本库,而这些版本库仅用于生活质量调整。我可以使用其他方法来组织IDE的项目树吗?我知道externalproject_add存在,但是我不认为这具有我想要的功能。将来,我将以git-submodules的形式添加其他项目,但是取决于是否有更简便的方法,我将探索其他途径。
编辑:
为了明确起见,我已经为自己项目的每个模块使用了单独的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)
Run Code Online (Sandbox Code Playgroud)通过将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)
Run Code Online (Sandbox Code Playgroud)
:define_property()用于重新定义现有属性的范围是CMake的未记录行为。
参考文献
| 归档时间: |
|
| 查看次数: |
2493 次 |
| 最近记录: |