Как построить и связать внешние зависимости CMake с CMake? - PullRequest
2 голосов
/ 03 октября 2019

Я хотел бы использовать следующую стороннюю библиотеку: https://github.com/Corvusoft/restbed

Я хотел бы создать структуру папок, подобную этой:

- root
     - CMakeLists.txt
     - src
     - third_party
         - restbed
             - src
             - CMakeLists.txt
         - CMakeLists.txt

Я нашелчто я должен использовать ExternalProject модуль CMake для достижения этой цели, но не похоже, что я могу сделать это правильно. По какой-то причине внешний источник lib (restbed) не появляется в моем проекте XCode, когда я генерирую его с использованием корневого CMakeLists.txt. Этот корневой файл CMakeLists.txt входит в CMakeLists.txt папки third_party. CMakeLists.txt папки third_party выглядит следующим образом:

include(ExternalProject)

# CMAKE_CURRENT_LIST_DIR -> third_party folder
set(RESTBED_DIR ${CMAKE_CURRENT_LIST_DIR}/restbed)

ExternalProject_Add(restbed
    PREFIX ${RESTBED_DIR}
    SOURCE_DIR ${RESTBED_DIR}
    CMAKE_ARGS -DBUILD_SSL=NO
    DOWNLOAD_COMMAND ""
    UPDATE_COMMAND ""
    BUILD_COMMAND cmake ..
    BINARY_DIR ${RESTBED_DIR}/build
    INSTALL_DIR ${RESTBED_DIR}/distribution
    INSTALL_COMMAND make install
)

set(RESTBED_INCLUDE_DIR ${RESTBED_DIR}/distribution/include)
set(RESTBED_LIB_DIR ${RESTBED_DIR}/distribution/lib)

add_library(librestbed IMPORTED STATIC)
add_dependencies(librestbed restbed)

После этого я хотел бы использовать target_include_dir и target_link_libraries для добавления librestbed в качестве зависимости от моего корневого проекта. После этого, когда я собираю свой проект XCode, ничего не происходит, внешняя библиотека не будет собрана. Что я делаю неправильно? Я не хотел бы использовать встроенную функциональность CMake git, потому что я хотел бы хранить свои внешние зависимости в виде подмодулей git в третьей третей библиотеке. Я бы предпочел не позволять CMake выяснить, нужно ли повторно загружать данную зависимость. Заранее спасибо!

1 Ответ

1 голос
/ 03 октября 2019

Я думаю, вы перепутали опцию BUILD_COMMAND с опцией CONFIGURE_COMMAND. cmake .. должен быть помещен после опции CONFIGURE_COMMAND.

ExternalProject_Add(restbed
    PREFIX ${RESTBED_DIR}
    SOURCE_DIR ${RESTBED_DIR}
    CMAKE_ARGS -DBUILD_SSL=NO
    DOWNLOAD_COMMAND ""
    UPDATE_COMMAND ""
    CONFIGURE_COMMAND cmake ..
    BINARY_DIR ${RESTBED_DIR}/build
    INSTALL_DIR ${RESTBED_DIR}/distribution
    INSTALL_COMMAND make install
)

В документации есть значения по умолчанию для каждой из этих команд, поэтому вам, вероятно, вообще не нужно указывать CONFIGURE_COMMAND. Например, для BUILD_COMMAND:

Если этот параметр не задан, будет выбрана команда сборки по умолчанию для интеграции с основной сборкой наиболее подходящим способом (например, с использованием рекурсивного make дляГенераторы Makefile или cmake --build, если в проекте используется сборка CMake.

Кроме того, если вы укажете CONFIGURE_COMMAND, вы, вероятно, расширите аргументы, передаваемые им, примерно так:

    ...
    CONFIGURE_COMMAND cd restbed && mkdir build && cd build && cmake ..
    ...
...