2016-06-24 44 views
6

ho affrontato con un problema quando stavo cercando di usare Google provaCome clonare e integrare esterno (da Git) progetto CMake in locale uno

c'è un sacco di manuali come utilizzare ExternalProject_Add per la GTEST l'aggiunta in il progetto, tuttavia la maggior parte di questi descrive un metodo basato sul download dell'archivio zip con gtest e lo crea

come sappiamo gtest glyub e progetto basato su cmake. quindi mi piacerebbe trovato nativo per modo cmake. se questo sarebbe un progetto di testa-solo, mi piacerebbe scrivere qualcosa di simile a:

cmake_minimum_required(VERSION 2.8.8) 
include(ExternalProject) 
find_package(Git REQUIRED) 

ExternalProject_Add(
    gtest 
    PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/ext 
    GIT_REPOSITORY https://github.com/google/googletest.git 
    TIMEOUT 10 
    UPDATE_COMMAND ${GIT_EXECUTABLE} pull 
    CONFIGURE_COMMAND "" 
    BUILD_COMMAND "" 
    INSTALL_COMMAND "" 
    LOG_DOWNLOAD ON 
) 

ExternalProject_Get_Property(gtest source_dir) 
set(GTEST_INCLUDE_DIR ${source_dir}/googletest/include CACHE INTERNAL "Path to include folder for GTest") 
set(GTEST_ROOT_DIR ${source_dir}/googletest CACHE INTERNAL "Path to source folder for GTest") 
include_directories(${INCLUDE_DIRECTORIES} ${GTEST_INCLUDE_DIR} ${GTEST_ROOT_DIR}) 
message(${GTEST_INCLUDE_DIR}) 

e ha aggiunto questo script dal mio progetto cmake come:

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake.modules/") 
include(AddGTest) 
.... 
add_dependencies(${PROJECT_NAME} gtest) 

Tuttavia, questo richiede un passaggio di generazione. come dovrebbe essere implementato?

  1. aggiungendo BUILD_COMMAND in ExternaProject_Add? e il collegamento con le librerie prodotte?
  2. o includendo i cmakelist di gtest nel mio progetto, qualcosa del genere?

    add_subdirectory ($ {} CMAKE_SOURCE_DIR \ ext \ src \ GTEST \ googletest \ CMakeLists.txt)

questo non è il modo corretto perché sul momento del progetto caricare la cartella non esiste

  1. altri modi?

qual è il modo corretto/preferibile?

risposta

10

Vorrei andare con il primo approccio. Non è necessario specificare un comando di compilazione perché cmake viene utilizzato per impostazione predefinita. Questo potrebbe apparire come:

cmake_minimum_required(VERSION 3.0) 
project(GTestProject) 

include(ExternalProject) 

set(EXTERNAL_INSTALL_LOCATION ${CMAKE_BINARY_DIR}/external) 

ExternalProject_Add(googletest 
    GIT_REPOSITORY https://github.com/google/googletest 
    CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_LOCATION} 
) 

include_directories(${EXTERNAL_INSTALL_LOCATION}/include) 
link_directories(${EXTERNAL_INSTALL_LOCATION}/lib) 

add_executable(FirstTest main.cpp) 
add_dependencies(FirstTest googletest) 
target_link_libraries(FirstTest gtest gtest_main pthread) 

Non so se questo è il modo corretto/preferito se c'è anche una sola. Se volessi implementare il tuo secondo approccio, dovresti prima scaricare il codice con execute_process.

+0

Grazie, questo è quello che voglio sentire - "cmake fa questo di default", non ha trovato questo nel manuale, e ha cercato il comando di compilazione – amigo421