CMAKE добавить подкаталог, который не является подкаталогом в реальном каталоге

#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. На самом деле, вы можете. Это просто не очень распространено… Смотрите мой другой ответ.