#cmake
#cmake
Вопрос:
Возможно ли включить дочерний каталог в качестве подкаталога внутри cmake?
Что-то вроде
A
CMakeLists.txt
B
CMakeLists.txt
и B включает A в качестве подкаталога?
Ответ №1:
Это возможно, хотя, возможно, и не рекомендуется…
Вы можете использовать форму с двумя аргументами команды add_subdirectory, чтобы добавить любой каталог, который вы хотите, в качестве «вложенного» каталога:
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../A ${CMAKE_CURRENT_BINARY_DIR}/A)
Второй аргумент формы с двумя аргументами указывает, куда поместить двоичный каталог для добавленного подкаталога.
Вы просто должны быть осторожны, чтобы не было другого реального подкаталога B, который также называется «A» и который также является add_subdirectory’d … Потому что, если вы это сделаете, это будет ошибкой, поскольку CMake не может иметь два разных исходных каталога, отображаемых в один и тот же каталог сборки.
Комментарии:
1. Что, если
${CMAKE_CURRENT_SOURCE_DIR}/../A/some/path
используется? Не позволит ли это избежать ошибки столкновения имен?2. Независимо от того, есть ли конфликт имен, зависит от полного набора каталогов, используемых в сумме всех вызовов add_subdirectory. И на содержимом CMakeLists.txt файлы. Например, команды «project» вводят переменные source_dir и binary_dir на основе имени проекта. Использование «../A / some /path» позволит избежать конфликта с другим «A», но не с другим «path»
3. вы могли бы просто использовать абсолютный путь. почему вы этого не сделали? есть ли причина вашего выбора здесь?
4. @Rika использование абсолютного пути, безусловно, возможно. Я никогда не рекомендую это из-за простого факта, что абсолютный путь всегда отличается от платформы к платформе и, скорее всего, отличается от разработчика к разработчику. В общем, у вас нет НИКАКИХ знаний о том, как ваш код будет размещен на диске разработчика, кроме структуры, которая существует внутри вашего репозитория.
5. @DLRdave Вы, безусловно, на 100% правы. спасибо за ответ, я его ценю
Ответ №2:
К сожалению, нет.
В качестве решения я могу предложить вам add_subdirectory(A) и add_subdirectory (B) на верхнем уровне и установить переменные, которые вы хотите экспортировать из A с помощью PARENT_SCOPE. Это позволило бы B/CMakeLists.txt для доступа к переменным, определенным в A/CMakeLists.txt
Комментарии:
1. На самом деле, вы можете. Это просто не очень распространено… Смотрите мой другой ответ.