Я пытаюсь организовать цели в моем подпроекте (в данном случае poco), но я обнаружил, что свойства не могут быть изменены для целей ALIAS. Я хочу, чтобы цели в моем внешнем проекте находились в отдельной папке, а не растягивались повсюду в дереве проекта (скажем, генератор визуальной студии). Есть ли более простой способ добавить проекты с моими собственными свойствами?
Так что вместо:
- 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? Я знаю, что externalproject_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
option, команда 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)
Using: использование define_property()
Переопределить область действия существующего свойства — недокументированное поведение CMake.
Рекомендации
Других решений пока нет …