2015-10-20 26 views
6

Come posso aggiungere progetti esterni in CMake quando il repository del progetto non è la radice della libreria che voglio usare, ma in realtà contiene due directory che sono le directory radice dei repository che voglio usare nel mio progetto?Come gestire CMake ExternalProject quando il repository (googletest) ha più librerie?

sto lavorando per realizzare un progetto CMake un'infrastruttura che utilizza Google prova e Mock per il test, tuttavia quando provo a scaricare il test repo Google (https://github.com/google/googletest) con ExternalProject_Add, si lamenta il build che non riesce a trovare la fonte del progetto. Beh, questo è perché Google ha fuso googletest e googlemock in un singolo progetto, tranne che ora sono due progetti.

Alcuni di struttura dei file del pronti contro termine:

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

Quando effettuare le seguenti ...

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

... scarica i pronti contro termine effettivo per googletest-master/src/gtest perché sto anteponendo il repo con "googletest-master" per tenerlo fuori dal mio codice sorgente principale e presuppone che sto scaricando un progetto che è solo sorgente e che la fonte è nella directory root.

Così mi piacerebbe realizzare due cose:

  1. Scarica il repo nella directory googletest-master, esattamente come sarebbe se ho clonato il repo là, o scaricato lo zip off GitHub ed estratto esso.
  2. Costruire e includono sia googletest e googlemock nel mio progetto CMake

risposta

7

È necessario singolo fase di download, ma due fasi di compilazione. Diverse chiamate ExternalProject_add comando non può azionari passi, ma è possibile organizzare tutti questi passaggi in diverse chiamate con appropriate le dipendenze tra di loro:

# 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

ho finito per fare un po 'di personalizzazione di alcuni dei relativi percorsi per soddisfare le mie esigenze/preferenze un po 'di più - questa soluzione raw ha portato ad alcune strutture di directory apparentemente inutilmente complesse (googletest-master/src/googletest/src). Ma questo funziona ed è esattamente ciò di cui avevo bisogno. – AberrantWolf

0

Ho un repository in cui importare librerie GTEST e gmock usando CMake, proprio come si vuole, ma che utilizzano il vecchio repository dei sorgenti di SVN, invece di GIT .

Penso che la chiave stia ottenendo solo le fonti per gmock, dato che include le fonti gtest e quindi esporta entrambe le librerie.

Il CMakeLists.txt assomiglia a questo:

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)