reverse_kacejot
@reverse_kacejot
Junior C++ Developer, bachelor of Applied Math

Можно ли через CMake собрать проект, собирающийся bash-скриптом?

Я пытаюсь добавить специфичную версию openssl в свое дерево CMake.
Знаю, что можно выполнять комманды в shell через execute_command, котороый работает во время конфигурации, и с помощью add_custom_command, который работает во время сборки. К сожалению во втором варианте нужно либо указывать таргет либо output файл - таргета у меня нет, что такое OUTPUT я так до конца и не понял.
Если у кого-то есть опыт с добавлением в CMake не CMake проектов, то поделитесь, пожалуйста.
  • Вопрос задан
  • 473 просмотра
Решения вопроса 1
@4rtzel
add_custom_command полезен когда у вас часть исходников генерируются какой-нибудь другой программой (например flex, protobuf). В таком случае OUTPUT будет указывать на сгенерированные файлы с помощью команды COMMAND. Можете посмотреть мой ответ по теме.

Самый простой способ (но не всегда самый хороший) собрать сторонний не CMake проект -- использовать ExternalProject_Add. Сложности возникают когда надо добавить этот проект как зависимость к своему. Самый очевидный способ -- это использовать find_package с указанием правильных путей. Например для OpenSSL:
...
# Вместо этой строчки также можно указать путь из командой строки:
# $ cmake -DOPENSSL_ROOT_DIR=/usr/local/ssl -DOPENSSL_LIBRARIES=/usr/local/ssl/lib ..
set(CMAKE_MODULE_PATH  ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/openssl)
# Используем FindOpenSSL.cmake для поиска
find_package(OpenSSL REQUIRED)
...

Проблема этого способа, что ExternalProject_Add выполняется на этапе сборки (вызов make), а не на этапе конфигурации (вызов cmake), find_package не сработает, если уже нет собранной версии openssl где-то в ${CMAKE_CURRENT_SOURCE_DIR}/openssl.

Другой вариант добавление зависимости -- использовать комбинацию target_link_directories и target_link_libraries. Пример:
target_link_directories(my_target ${CMAKE_CURRENT_SOURCE_DIR}/openssl/lib)
target_link_libraries(my_target PRIVATE crypto ssl)

Проблема этого способа, что мы привязываемся к конкретному пути и названиям библиотек (хотя должны зависеть только от таргетов).

Во многих проектах такие проблемы решаются, так называемым, SuperBuild'ом. Это когда у вас есть главный CMakeLists.txt файл в которым все остальные проекты (включая ваш) определены как ExternalProject. Тогда можно будет нормально строить зависимости между ними и вызовы типа find_package будут работать, но это уже другая история.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы