Ceci est un cas inhabituel ; la plupart des projets spécifient des règles d'installation.
Le module ExternalProject_Add
de CMake est peut-être le meilleur outil pour ce travail. Cela vous permet de télécharger, configurer et construire gtest depuis votre projet, puis de lier les bibliothèques gtest.
J'ai testé le CMakeLists.txt suivant sur Windows avec Visual Studio 10 et 11, et sur Ubuntu en utilisant GCC 4.8 et Clang 3.2 - il pourrait nécessiter des ajustements pour d'autres plates-formes/compilateurs :
cmake_minimum_required(VERSION 2.8.7 FATAL_ERROR)
project(Test)
# Créez main.cpp qui utilise gtest
file(WRITE src/main.cpp "#include \"gtest/gtest.h\"\n\n")
file(APPEND src/main.cpp "TEST(A, B) { SUCCEED(); }\n")
file(APPEND src/main.cpp "int main(int argc, char **argv) {\n")
file(APPEND src/main.cpp " testing::InitGoogleTest(&argc, argv);\n")
file(APPEND src/main.cpp " return RUN_ALL_TESTS();\n")
file(APPEND src/main.cpp "}\n")
# Créez le fichier de correctif pour gtest avec MSVC 2012
if(MSVC_VERSION EQUAL 1700)
file(WRITE gtest.patch "Index: cmake/internal_utils.cmake\n")
file(APPEND gtest.patch "===================================================================\n")
file(APPEND gtest.patch "--- cmake/internal_utils.cmake (revision 660)\n")
file(APPEND gtest.patch "+++ cmake/internal_utils.cmake (working copy)\n")
file(APPEND gtest.patch "@@ -66,6 +66,9 @@\n")
file(APPEND gtest.patch " # La surcharge résolue a été trouvée par la recherche dépendante des arguments.\n")
file(APPEND gtest.patch " set(cxx_base_flags \"\${cxx_base_flags} -wd4675\")\n")
file(APPEND gtest.patch " endif()\n")
file(APPEND gtest.patch "+ if (MSVC_VERSION EQUAL 1700)\n")
file(APPEND gtest.patch "+ set(cxx_base_flags \"\${cxx_base_flags} -D_VARIADIC_MAX=10\")\n")
file(APPEND gtest.patch "+ endif ()\n")
file(APPEND gtest.patch " set(cxx_base_flags \"\${cxx_base_flags} -D_UNICODE -DUNICODE -DWIN32 -D_WIN32\")\n")
file(APPEND gtest.patch " set(cxx_base_flags \"\${cxx_base_flags} -DSTRICT -DWIN32_LEAN_AND_MEAN\")\n")
file(APPEND gtest.patch " set(cxx_exception_flags \"-EHsc -D_HAS_EXCEPTIONS=1\")\n")
else()
file(WRITE gtest.patch "")
endif()
# Activer le module CMake ExternalProject
include(ExternalProject)
# Définir le type de construction s'il n'est pas déjà défini
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
# Définir le répertoire racine par défaut d'ExternalProject
set_directory_properties(PROPERTIES EP_PREFIX ${CMAKE_BINARY_DIR}/ThirdParty)
# Ajouter gtest
ExternalProject_Add(
googletest
SVN_REPOSITORY http://googletest.googlecode.com/svn/trunk/
SVN_REVISION -r 660
TIMEOUT 10
PATCH_COMMAND svn patch ${CMAKE_SOURCE_DIR}/gtest.patch ${CMAKE_BINARY_DIR}/ThirdParty/src/googletest
# Forcer des chemins de sortie séparés pour les compilations debug et release pour permettre une identification facile de la bonne lib dans les commandes TARGET_LINK_LIBRARIES suivantes
CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG:CHEMIN=DebugLibs
-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE:CHEMIN=ReleaseLibs
-Dgtest_force_shared_crt=ON
# Désactiver l'étape d'installation
INSTALL_COMMAND ""
# Envelopper les étapes de téléchargement, configuration et construction dans un script pour enregistrer la sortie
LOG_DOWNLOAD ON
LOG_CONFIGURE ON
LOG_BUILD ON)
# Spécifier le répertoire d'inclusion
ExternalProject_Get_Property(googletest source_dir)
include_directories(${source_dir}/include)
# Ajouter un drapeau de compilateur pour MSVC 2012
if(MSVC_VERSION EQUAL 1700)
add_definitions(-D_VARIADIC_MAX=10)
endif()
# Ajouter la cible exécutable de test
add_executable(MainTest ${PROJECT_SOURCE_DIR}/src/main.cpp)
# Créer la dépendance de MainTest à googletest
add_dependencies(MainTest googletest)
# Spécifier les bibliothèques de liaison de MainTest
ExternalProject_Get_Property(googletest binary_dir)
if(MSVC)
set(Suffix ".lib")
else()
set(Suffix ".a")
set(Pthread "-pthread")
endif()
target_link_libraries(
MainTest
debug ${binary_dir}/DebugLibs/${CMAKE_FIND_LIBRARY_PREFIXES}gtest${Suffix}
optimized ${binary_dir}/ReleaseLibs/${CMAKE_FIND_LIBRARY_PREFIXES}gtest${Suffix}
${Pthread})
Si vous créez ceci en tant que CMakeLists.txt dans un répertoire vide (disons MyTest
), alors :
cd MyTest
mkdir build
cd build
cmake ..
Cela devrait créer un main.cpp de base dans MyTest/src
et créer un fichier de projet (MyTest/build/Test.sln
sur Windows)
Lorsque vous construisez le projet, il devrait télécharger les sources gtest dans MyTest/build/ThirdParty/src/googletest
, et les construire dans MyTest/build/ThirdParty/src/googletest-build
. Vous devriez alors pouvoir exécuter avec succès la cible MainTest.