У меня есть проект A, который экспортирует статическую библиотеку в качестве цели:
install(TARGETS alib DESTINATION lib EXPORT project_a-targets)
install(EXPORT project_a-targets DESTINATION lib/alib)
Теперь я хочу использовать Project A как внешний проект из Project B и включить его встроенные цели:
ExternalProject_Add(project_a
URL ...project_a.tar.gz
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/project_a
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
)
include(${CMAKE_CURRENT_BINARY_DIR}/lib/project_a/project_a-targets.cmake)
Проблема в том, что включаемый файл еще не существует при запуске CMakeLists проекта B.
Есть ли способ сделать включение зависимым от создаваемого внешнего проекта?
Обновление : я написал короткое руководство по CMake by Example, основанное на этой и других распространенных проблемах, с которыми я столкнулся.
источник
ExternalProject_Add
просто вели себя какadd_subdirectory
и все цели выставлялись. Решение, которое вы описали выше, вероятно, остается самым чистым.ExternalProject
. Это последовательность, или более каноничность, или что-то еще? Я уверен, что мне здесь не хватает чего-то фундаментального.Эта почта есть разумный ответ:
CMakeLists.txt.in
:CMakeLists.txt
:Однако это кажется довольно хакерским. Хочу предложить альтернативное решение - использовать подмодули Git.
Затем
MyProject/dependencies/gtest/CMakeList.txt
вы можете сделать что-то вроде:Я еще не пробовал это широко, но кажется чище.
Изменить: у этого подхода есть обратная сторона: подкаталог может запускать
install()
команды, которые вам не нужны. В этом посте есть способ отключить их но он был ошибочным и не работал у меня.Изменить 2: если вы
add_subdirectory("googletest" EXCLUDE_FROM_ALL)
его используете, это означает, чтоinstall()
команды в подкаталоге не используются по умолчанию.источник
GIT_TAG
во время клонирования, вы можете потерять повторяемость сборки, потому что через 2 года кто-то, запускающий сценарий сборки, получит другая версия, чем то, что вы сделали. Документы CMake тоже рекомендуют это.Изменить: CMake теперь имеет встроенную поддержку для этого. Смотрите новый ответ .
Вы также можете принудительно построить зависимую цель во вторичном процессе make.
См. Мой ответ по связанной теме.
источник
cmake
ExternalProject_Add
действительно можно использовать, но что мне в нем не понравилось - это то, что он что-то выполняет во время сборки, непрерывного опроса и т. д. Я бы предпочел создать проект на этапе сборки, ничего больше. Я пытался переопределитьExternalProject_Add
несколько попыток, но, к сожалению, безуспешно.Затем я попытался добавить подмодуль git, но это перетаскивает весь репозиторий git, а в некоторых случаях мне нужно только подмножество всего репозитория git. Что я проверил - действительно можно выполнить разреженную проверку git, но для этого требуется отдельная функция, о которой я писал ниже.
Я добавил два вызова функций ниже, чтобы проиллюстрировать, как использовать функцию.
Кому-то может не понравиться проверять мастер / ствол, так как он может быть сломан - тогда всегда можно указать конкретный тег.
Оформление заказа будет выполнено только один раз, пока вы не очистите папку кеша.
источник
Искал подобное решение. Ответы здесь и руководство вверху информативны. Я изучал упомянутые здесь посты / блоги, чтобы добиться успеха. Я публикую, что CMakeLists.txt работал у меня. Думаю, это было бы полезно в качестве базового шаблона для новичков.
"CMakeLists.txt"
источник