Динамические подкаталоги в сборке cmake

Я настраиваю среду сборки Cmake для унаследованного мной проекта. У меня есть основной репозиторий, который создает цель, которая может загружать «плагины» (цели dll). Я хочу сохранить каждый плагин в собственном репозитории (каждый представляет собой определенную аппаратную платформу и должен поддерживаться отдельно).

У меня есть каталог под названием «Plugins», в котором эти папки репозитория будут клонированы по мере необходимости.

Как мне заставить CMakeLists.txt в папке «Plugins» добавлять все папки плагинов без добавления явного add_subdirectory для каждого плагина?

Моя цель - разрешить сценарию сборки, который предоставляет исходную конфигурацию и цели отладки / выпуска, также разрешить целевые объекты платформы, которые будут проверять репозитории для платформ, выбранных пользователем, настраивать и строить по запросу. Это единственное произведение, которое я не знаю, как настроить.

Как мне заставить CMakeLists.txt в папке «Plugins» добавлять все папки плагинов без добавления явного add_subdirectory для каждого плагина? Я использую макрос CMake для получения списка подкаталогов (используя файл GLOB), а затем цикл for для add_subdirectory ()
drescherjm 04.12.2018 19:40

Можете ли вы привести пример в качестве ответа?

Tzalumen 04.12.2018 20:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
1 104
1

Ответы 1

Когда я делаю это, например, программы, у меня есть макрос CMake, который перечисляет подкаталоги текущей папки:

#########################################################################################

macro(SUBDIRLIST result curdir)
  FILE(GLOB children RELATIVE ${curdir} ${curdir}/*)
  SET(dirlist "")
  FOREACH(child ${children})
    IF(IS_DIRECTORY ${curdir}/${child})
        SET(dirlist ${dirlist} ${child})
    ENDIF()
  ENDFOREACH()
  SET(${result} ${dirlist})
endmacro()

Затем с помощью этого макроса я создаю следующий файл CMakeLists.txt в папке с подкаталогами:

SUBDIRLIST(SUBDIRS ${CMAKE_CURRENT_SOURCE_DIR})

FOREACH(subdir ${SUBDIRS})
    ADD_SUBDIRECTORY(${subdir})
ENDFOREACH()

Когда CMake генерируется с использованием этой родительской папки, он автоматически добавляет каждую содержащуюся в нем папку с помощью add_subidrectory ().

Он выглядит почти идентично тому коду, с которым я столкнулся ранее. github.com/gwaldron/osgearth/issues/608 За исключением того, что они добавляют каталоги в список с помощью добавления, а не набора. Я надеялся на встроенную операцию, но полагаю, что смогу просто распаковать процесс.

Tzalumen 04.12.2018 20:46

Есть вероятность, что мы получили код из одного источника. У меня есть файл макросов 5+ лет назад.

drescherjm 04.12.2018 20:48

Я сделал что-то похожее, но развернутое, и добавил проверку наличия CmakeLists.txt в каждом подкаталоге перед вызовом add_subdirectory (), поскольку новые проекты являются подмодулями git, все проверяемые каталоги подключаемых модулей строго необязательны, подмодули - это подмодули. доступ ограничен разрешениями gitlab, папки всегда будут присутствовать, даже если они пусты, и приложение должно быть создано, даже если плагины отсутствуют. Я буду обновлять ответ, если позволит время.

Tzalumen 08.11.2021 09:53

Другие вопросы по теме