2016-01-25 1 views
2

Я получаю библиотеку Поймать из GitHub через дополнительный CMakeLists.txt, которая включена в основную один:CMake: получить библиотеку из мерзавца, прежде чем использовать в качестве основного cmakelists

cmake_minimum_required(VERSION 3.2) 
project(MyProject) 

add_subdirectory(ext/catch) 
include_directories(${CATCH_INCLUDE_DIR} ${CXXOPTS_INCLUDE_DIR} src) 
... 

Где CMakeLists.txt для улова:

cmake_minimum_required(VERSION 2.8.8) 
project(catch_builder CXX) 
include(ExternalProject) 
find_package(Git REQUIRED) 

ExternalProject_Add(
    catch 
    PREFIX ${CMAKE_CURRENT_SOURCE_DIR} 
    GIT_REPOSITORY https://github.com/philsquared/Catch.git 
    TIMEOUT 10 
    UPDATE_COMMAND ${GIT_EXECUTABLE} pull 
    CONFIGURE_COMMAND "" 
    BUILD_COMMAND "" 
    INSTALL_COMMAND "" 
    LOG_DOWNLOAD ON 
) 

# Expose required variable (CATCH_INCLUDE_DIR) to parent scope 
ExternalProject_Get_Property(catch source_dir) 
set(CATCH_INCLUDE_DIR ${source_dir}/include CACHE INTERNAL "Path to include folder for Catch") 
message(${CATCH_INCLUDE_DIR}) 

Однако строительство основного проекта начинается раньше, чем Catch будет извлечен из Git. Как это исправить? Что не так в моем сценарии cmake?

+1

Просто сделайте основной объект проекта зависимым от 'catch' libary:' add_dependencies ( catch) '. Таким образом, ваш проект будет создан * после * 'catch' библиотеки. – Tsyvarev

ответ

2

Я думаю, что у меня была та же проблема, что я сделал это:

  • Помещенный AddCatch.cmake (The cmakelist вылова) в CMAKE_MODULE_PATH
    e.g.: set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
  • Удалить строку: project(catch_builder CXX)
  • Заменить add_subdirectory(ext/catch) на include(AddCatch)

И он должен работать нормально;)

+0

Я долгое время пользовался вашим советом, и это сработало. Но теперь я переместил проект в инструментальную цепочку MinGW, и существующий cmake работает странно, он не пытается клонировать проект даже во время сборки (и во время настройки тоже). нет ошибок, сообщений нет. просто выглядит, как команда ExternalProject_Add не существует в скрипте. вы знаете, почему MinGW не работает? – amigo421

2

В вашем случае загрузка, выполняемая ExternalProject_Add, происходит в _build_time, а не при запуске CMake, поэтому загрузка еще не произошла, когда вызывается add_subdirectory. С небольшим количеством работы вы можете использовать команду CMake ExternalProject_Add для выполнения загрузки Catch из github в CMake/configure, а не во время сборки. Это значит, что он будет присутствовать при вызове add_subdirectory. Существует статья here, показывающая, как это сделать (она использует GoogleTest в качестве примера и связывает ее с полностью обобщенной реализацией, которую вы можете использовать непосредственно для своей ситуации). Общий подход заключается в том, что он создает небольшой скрипт, который вызывается через режим сценария CMake, чтобы принудительно вызвать вызов ExternalProject_Add.

Смежные вопросы