2015-10-20 17 views
6

Jak dodać zewnętrzne projekty w CMake, gdy repozytorium projektu nie jest korzeniem biblioteki, której chcę używać, ale w rzeczywistości zawiera dwa katalogi, z których każdy jest katalogiem głównym repo, które chcę użyć w moim projekcie?Jak obsługiwać CMake ExternalProject, gdy repo (googletest) ma wiele bibliotek?

pracuję do ustanowienia ram projektu CUpewnij test, który wykorzystuje Google i makiety do testowania, jednak gdy próbuję pobrać testową repo Google (https://github.com/google/googletest) z ExternalProject_Add, narzeka na budowie, że nie może znaleźć źródło dla projektu. To dlatego, że Google połączyło googletest i googlemock w jeden projekt, z wyjątkiem tego, że to teraz dwa projekty.

Niektóre struktury plików w repo:

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

Kiedy należy wykonać następujące czynności ...

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

... pobiera rzeczywisty repo do googletest-master/src/gtest bo jestem poprzedzając repo z "googletest-master", aby trzymać go z dala od mojego głównego kodu źródłowego, i zakłada, że ​​pobieram projekt, który jest tylko źródłem i że źródło znajduje się w katalogu głównym.

Więc chciałbym osiągnąć dwie rzeczy:

  1. pobrać repo do katalogu googletest-master, dokładnie tak, jak byłoby gdybym sklonowany repo tam, lub pobraniu zip off GitHub i ekstrahowano to.
  2. Budowa i obejmują zarówno googletest i googlemock w moim projekcie CMake

Odpowiedz

7

Trzeba pojedynczy krok pobierania, ale dwa etapy budowy. Różne połączenia dowodzenia ExternalProject_add może nie share kroki, ale można zorganizować wszystkie kroki w różne rozmowy z odpowiednimi zależnościami między nimi:

# 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

skończyło się jakiejś dostosowanie niektórych ścieżek względnych do moich potrzeb/preferencji nieco więcej - to rozwiązanie surowe prowadziło do niepotrzebnie złożonych struktur katalogów (googletest-master/src/googletest/src). Ale to działa i jest dokładnie tym, czego potrzebowałem. – AberrantWolf

0

Mam repository gdzie mogę importować numeru GTEST i gmock bibliotek przy użyciu CMake, tak jak chcesz, ale używając starego repozytorium źródłowego SVN zamiast GIT .

Myślę, że kluczem jest pozyskiwanie źródeł tylko dla gmock, ponieważ zawiera on źródła gtest, a następnie eksportuje obie biblioteki.

CMakeLists.txt wygląda następująco:

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) 
Powiązane problemy