Как обрабатывать CMake ExternalProject, когда repo (googletest) имеет несколько библиотек?

как я могу добавить внешние проекты в CMake, когда РЕПО проекта не является корнем библиотеки, которую я хочу использовать, но на самом деле содержит два каталога, которые являются корневыми каталогами репозиториев, которые я хочу использовать в своем проекте?

Я работаю над созданием проекта CMake framework, который использует Google Test и Mock для тестирования, однако, когда я пытаюсь загрузить Google test repo (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-master, точно так же, как это было бы, если бы я клонировал РЕПО там или загрузил zip с GitHub и извлек его.
  2. построить и включить как googletest и googlemock в мой проект CMake

2 ответов


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

# 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)

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

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

на 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)