cmake include_directories передается в externaproject_add - PullRequest
0 голосов
/ 29 декабря 2018

Мне нужно использовать mangrove (библиотека mongo ODM поверх mongo-c-driver и mongo-cxx-driver) и включить это в мой проект в качестве команды CMake ExternalProject_Add, с зависимостями как mongo-c-driver / mongo-Команда cxx-driver

# mongo-c-driver
ExternalProject_Add(mongo-c-driver
        GIT_REPOSITORY https://github.com/mongodb/mongo-c-driver.git
        GIT_TAG r1.12
        CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_LOCATION} -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF
#        CMAKE_ARGS -DINCLUDE_DIRECTORIES=${EXTERNAL_INSTALL_LOCATION}/include/libbson-1.0 ${EXTERNAL_INSTALL_LOCATION}/include/libmongoc-1.0
        )

#include_directories(${EXTERNAL_INSTALL_LOCATION}/include/libbson-1.0
#        ${EXTERNAL_INSTALL_LOCATION}/include/libmongoc-1.0)
#link_directories(${EXTERNAL_INSTALL_LOCATION}/lib)

include_directories здесь на самом деле не требуется, потому что файл конфигурации cmake mongoc делает эту работу.Однако, конечно, я тоже проверил с комментариями.

Так что включения из mongo-c-driver требуются для следующего включенного внешнего проекта - мангрового дерева.

Что не удается из-за ошибки c ++, а ненайдены некоторые включаемые файлы, которые существуют во включаемых путях текущего проекта.Таким образом, кажется, что включенный внешний проект не использует текущие включения CMake, которые ранее были добавлены другим внешним проектом

# mangrove
ExternalProject_Add(mangrove
        GIT_REPOSITORY https://github.com/aospan/mangrove.git
        CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_LOCATION} -DCMAKE_INCLUDE_DIRECTORIES_BEFORE=${EXTERNAL_INSTALL_LOCATION}/include/libbson-1.0
        )

ExternalProject_Add_StepDependencies(mangrove build mongo-c-driver mongo-cxx-driver)

include_directories(${EXTERNAL_INSTALL_LOCATION}/include/libbson-1.0
        ${EXTERNAL_INSTALL_LOCATION}/include/libmongoc-1.0)
link_directories(${EXTERNAL_INSTALL_LOCATION}/lib)

Кажется, что include_directories внутри скрипта не влияет на включенный проект на основе CMakeна ExternalProject_Add.

Есть ли способ передать эти включенные пути во внешний проект?

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Как указано в других ответах, вы не можете передать во включениях проект mangrove и что внешние проекты и текущий проект не зависят друг от друга.

Это, кажется, половинапроблема.Похоже, вы пытаетесь использовать mongo-c-driver для предоставления libbson.Но mangrove использует:

set(LIBBSON_REQUIRED_VERSION 1.7.0)
set(LIBBSON_REQUIRED_ABI_VERSION 1.0)
find_package(LibBSON ${LIBBSON_REQUIRED_VERSION} REQUIRED)

Что не совсем понятно, так это то, работает ли find_package в режиме модуля или конфигурации и каковы были его результаты.Но для успешной работы libbson должен быть собран при сборке mongo-c-driver, чтобы find_package мог найти библиотеку и настроить пути включения и линию связи.

Кажется, что mangroveнашел что-то, что позволило find_package не потерпеть неудачу, но не заполнило ${LIBBSON_INCLUDE_DIRS} правильным путем включения, который вызвал ошибку компиляции, которую вы упомянули.

Без подробностей трудно дать вам подробный ответ, новам необходимо убедиться, что команды find_package в mangrove работают правильно со встроенным и не установленным libbson или установить libbson в месте, совместимом с командой find_package, используемой mangrove.

0 голосов
/ 29 декабря 2018

Вы используете неправильный макрос.CMAKE_INCLUDE_DIRECTORIES_BEFORE указывает только на то, как работает include-directories, и является флагом .

. Нет другого варианта, как установить правильные переменные так, чтобы внешний CMakeLists.txt использовал find_path длязаполните путь к bson.h.Если этого не произойдет, я предлагаю вам исправить файл CMakeLists.txt для использования find_path и сделать запрос на извлечение.

Редактировать:

Похоже, что мангровый проект имеет способ настройкивсе это с ENABLE_BSON.Затем вы можете установить BSON_VERSION, BSON_INCLUDE_DIRS и BSON_LIBRARIES вручную, если значение по умолчанию AUTO не работает.

...