2015-10-20 2 views
6

Как добавить внешние проекты в CMake, когда репо проекта не является корнем библиотеки, которую я хочу использовать, но на самом деле содержит два каталога, которые являются корневыми каталогами репозиториев, которые я хочу использовать в моем проекте?Как обрабатывать CMake ExternalProject, когда repo (googletest) имеет несколько библиотек?

Я работаю, чтобы создать рамки CMake проект, который использует тест Google и Mock для тестирования, однако при попытке загрузить тестовый репозиторий Google (https://github.com/google/googletest) с ExternalProject_Add, он жалуется на билде, что он не может найти источник для проекта. Ну, это потому, что Google объединил googletest и googlemock в один проект, за исключением двух проектов.

Некоторые структуры файла РЭПО в:

googletest-master/ 
├──[...no CMakeFiles.txt exists here...] 
├──googletest/ 
│ ├──src/ 
│ └──CMakeFiles.txt 
└──googlemock/ 
    ├──src/ 
    └──CMakeFiles.txt 

Когда я следующий ...

ExternalProject_Add(
    gtest 
    GIT_REPOSITORY https://github.com/google/googletest.git 
    TIMEOUT 10 
    INSTALL_COMMAND "" 
    LOG_DOWNLOAD ON 
    LOG_CONFIGURE ON 
    LOG_BUILD ON 
    PREFIX "googletest-master" 
) 

... он загружает фактической репо в googletest-master/src/gtest, потому что я предварив репо с «googletest-master», чтобы сохранить его из моего основного исходного кода, и предполагает, что я загружаю проект, который является только источником, и этот источник находится в корневом каталоге.

Так что я хотел бы сделать две вещи:

  1. Загрузите Репо в googletest-мастер каталог, точно так, как это было бы, если бы я клонировать репозиторий там, или загрузили Zip Off GitHub и экстрагируют Это.
  2. Сложение и включают в себя как googletest и googlemock в моем проекте CMake

ответ

7

Вам нужно одного скачать шаг, но два шаги сборки. Различные вызовы ExternalProject_add команды не могут доля шагов, но вы можете организовать все эти шаги в различные вызовы с соответствующими зависимостями между ними:

# Single download(git clone) 
ExternalProject_Add(
    googletest-master 
    DOWNLOAD_DIR "googletest-master/src" # The only dir option which is required 
    GIT_REPOSITORY https://github.com/google/googletest.git 
    TIMEOUT 10 
    LOG_DOWNLOAD ON 
    # Disable all other steps 
    CONFIGURE_COMMAND "" 
    BUILD_COMMAND "" 
    INSTALL_COMMAND "" 
) 

# Build gtest from existing sources 
ExternalProject_Add(
    gtest 
    DOWNLOAD_COMMAND "" # No download required 
    SOURCE_DIR "googletest-master/src/googletest" # Use specific source dir 
    PREFIX "googletest-master" # But use prefix for compute other dirs 
    INSTALL_COMMAND "" 
    LOG_CONFIGURE ON 
    LOG_BUILD ON 
) 

# gtest should be build after being downloaded 
add_dependencies(gtest googletest-master) 

# Build gmock from existing sources 
ExternalProject_Add(
    gmock 
    DOWNLOAD_COMMAND "" # No download required 
    SOURCE_DIR "googletest-master/src/googlemock" # Use specific source dir 
    PREFIX "googletest-master" # But use prefix for compute other dirs 
    INSTALL_COMMAND "" 
    LOG_CONFIGURE ON 
    LOG_BUILD ON 
) 

# gmock should be build after being downloaded 
add_dependencies(gmock googletest-master) 
+0

я в конечном итоге делают некоторые настройки некоторыхов из относительных путей, чтобы удовлетворить мои потребности/предпочтение немного больше - это решение raw привело к некоторым ненужно сложным структурам каталогов (googletest-master/src/googletest/src). Но это работает и именно то, что мне нужно. – AberrantWolf

0

У меня есть repository, где я импортировать GTEST и gmock библиотеки с использованием CMake, так же, как вы хотите, но с использованием старого хранилищу исходного кода SVN вместо GIT ,

Я думаю, что ключ получает источники только для gmock, поскольку он включает в себя самые надежные источники, а затем экспортирует обе библиотеки.

CMakeLists.txt выглядит следующим образом:

cmake_minimum_required(VERSION 2.8) 

include(ExternalProject) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 

set(GMOCK_VERSION "1.7.0") 
set(GMOCK_DIR "${CMAKE_CURRENT_BINARY_DIR}/gmock-${GMOCK_VERSION}") 
ExternalProject_Add(project_gmock 
    SVN_REPOSITORY http://googlemock.googlecode.com/svn/tags/release-${GMOCK_VERSION} 
    PREFIX ${GMOCK_DIR} 
    CMAKE_ARGS -DCMAKE_C_COMPILER:PATH=${CMAKE_C_COMPILER} -DCMAKE_CXX_COMPILER:PATH=${CMAKE_CXX_COMPILER} 
    # Disable update step 
    UPDATE_COMMAND "" 
    # Disable install step 
    INSTALL_COMMAND "" 
) 
ExternalProject_Get_Property(project_gmock source_dir) 
ExternalProject_Get_Property(project_gmock binary_dir) 

include_directories(${source_dir}/gtest/include) 
add_library(gtest STATIC IMPORTED) 
set_property(TARGET gtest PROPERTY IMPORTED_LOCATION ${binary_dir}/gtest/libgtest.a) 
add_dependencies(gtest project_gmock) 
add_library(gtest_main STATIC IMPORTED) 
set_property(TARGET gtest_main PROPERTY IMPORTED_LOCATION ${binary_dir}/gtest/libgtest_main.a) 
add_dependencies(gtest_main project_gmock) 
include_directories(${source_dir}/include) 
add_library(gmock STATIC IMPORTED) 
set_property(TARGET gmock PROPERTY IMPORTED_LOCATION ${binary_dir}/libgmock.a) 
add_dependencies(gmock project_gmock) 
add_library(gmock_main STATIC IMPORTED) 
set_property(TARGET gmock_main PROPERTY IMPORTED_LOCATION ${binary_dir}/libgmock_main.a) 
add_dependencies(gmock_main project_gmock) 

include_directories(${cpp_utest_SOURCE_DIR}/src) 
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++") 
#add_executable(utests) 
#target_link_libraries(utests gmock_main gmock gtest pthread) 
Смежные вопросы