2015-12-23 2 views
11

Рассмотрим следующий CMakeLists.txt файл:Cmake установки (ЦЕЛЕВЫХ в подкаталогах

add_subdirectory(execA) 
add_subdirectory(libB) 

install(TARGETS execA libB 
     RUNTIME DESTINATION bin 
     LIBRARY DESTINATION lib 
     ARCHIVE DESTINATION lib) 

I'm получаю следующее сообщение об ошибке:

install TARGETS given target "execA" which does not exist in this 
    directory 

execA и libB имеют свои собственные CMakeList.txt файлы и расположены под project справочник, а также каталог по строительству, который я запускаю cmake (cmake ..):

project 
    |------ CMakeList.txt (the one with the code) 
    |----execA 
    |  \- .cpp, .hpp and CMakelist.txt 
    |----libB 
    |  \- .cpp, .hpp and CMakelist.txt 
    |---- lib 
    |---- bin 
    \---- build (where I´m commanding: $ cmake .. 

Помощь, необходимая для устранения ошибки.

ответ

7

Согласно this bugreport, install(TARGETS) командный поток принимает только объекты , созданные в том же каталоге.

Так что вам нужно либо переместить add_library() вызов в каталог верхнего уровня, либо разбить install(TARGETS) вызов на целевые и переместить каждый из них в соответствующий подкаталог.

3

Несмотря на то, что это поможет увидеть файлы CMakeLists.txt, содержащиеся в подкаталогах, я думаю, они содержат add_executable и/или add_library инструкций для создания ваших материалов.
Кроме того, из-за вашего примера, я думаю, вы используете одно и то же имя своих каталогов для своих целей.
При этом вы должны знать, что символы, определенные в файле CMakeLists.txt в подкаталоге, по умолчанию не отображаются в контексте файла CMakeLists.txt в родительском каталоге. Из-за этого вам лучше переместить операторы install в файлы CMakeLists.txt в ваших подкаталогах.
Это должно решить проблему, если мои мысли были правильными. В противном случае я настоятельно рекомендую вам опубликовать в своем вопросе также содержимое других файлов, упомянутых выше.

В любом случае, ошибка совершенно ясна.
Файл, содержащий оператор install для целевого объекта с именем X, не содержит целевого оператора создания (add_executable и других), который рождает эту цель, поэтому он продолжает утверждать, что эта цель не существует в этом каталоге.

0

Это более старая тема, но это все еще кажется больной точкой в ​​CMake 3.11.

В нашей кодовой базе у нас есть много целей, определенных в подкаталогах, и вам необходимо создать набор инсталляторов с различными конфигурациями и (потенциально перекрывающимися) комбинациями целей.

Вот мое решение:

  • Перед вызовом add_subdirectory в файле CMakeLists.txt корень, создать GLOBAL свойство с именами цели (ы) вы хотите включить в инсталляторе
  • Wrap целевой функции создания (add_executable и т. д.) в ваших собственных пользовательских функциях.Внутри этих функций проверьте, присутствует ли цель в глобальном свойстве, и вызывают install соответственно

Этот подход позволяет централизовать конфигурацию установщика.

Также: для поддержки создания нескольких инсталляторов мы заполняем наш глобальный список вместе с другими установками в отдельных файлах .cmake. Когда мы вызываем cmake, мы передаем имя файла cmake конфигурации установщика в качестве аргумента командной строки. Наш корневой файл CMakeLists.txt просто вызывает include с этим файлом