web-dev-qa-db-fra.com

Comment cloner et intégrer un projet cmake externe (depuis git) dans un projet local

J'ai rencontré un problème lorsque j'essayais d'utiliser Google Test.

Il existe de nombreux manuels sur la façon d'utiliser ExternalProject_Add Pour ajouter gtest au projet, mais la plupart décrivent une méthode basée sur le téléchargement d'archive Zip avec gtest et sa création.

Comme nous le savons, gtest est un projet hébergé par github et basé sur cmake. Je voudrais donc trouver le chemin natif de cmake.

S'il s'agissait d'un projet uniquement en-tête, j'écrirais quelque chose comme:

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

et ajoutez ce script de mon projet cmake comme:

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

Cependant, cela nécessite une étape de construction.

Comment cela devrait-il être mis en œuvre?

  1. En ajoutant BUILD_COMMAND Dans ExternaProject_Add Et en établissant un lien avec les bibliothèques produites?
  2. Ou en incluant les cmakelists de gtest dans mon projet, quelque chose comme ceci:

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

ce n'est pas le bon chemin car au moment du chargement du projet le dossier n'existe pas.

  1. D'autres façons?

Quelle est la manière correcte/préférée?

14
amigo421

J'irais avec la première approche. Vous n'avez pas besoin de spécifier une commande de construction car cmake est utilisé par défaut. Cela pourrait ressembler à:

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)

Je ne sais pas si c'est la manière correcte/préférée s'il y en a même une. Si vous souhaitez implémenter votre deuxième approche, vous devez d'abord télécharger le code avec execute_process.

20
David Marquant