CMake: Как изменить свойства в целях проекта подкаталога?

Я пытаюсь организовать цели в моем подпроекте (в данном случае 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 не так важен, так как большинство инструментов редактирования уже основаны на папках.

4

Решение

Я дал вашему примеру попытку, и вот мои два варианта:

  1. С использованием 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)
    
  2. Преобразовав 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.

Рекомендации

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]