2017-01-19 1 views
1

J'ai lu this brilliant tutorial sur la façon d'intégrer Google Test avec CMake. Les grandes lignes du projet ressemble là comme ceci:cmake: comment compiler séparément le code de production et le code de test

+-- CMakeLists.txt 
+-- main 
| +-- CMakeLists 
| +-- main.cpp 
| 
+-- test 
| +-- CMakeLists.txt 
| +-- testfoo 
|  +-- CMakeLists.txt 
|  +-- main.cpp 
|  +-- testfoo.h 
|  +-- testfoo.cpp 
|  +-- mockbar.h 
| 
+-- libfoo 
| +-- CMakeLists.txt 
| +-- foo.h 
| +-- foo.cpp 
| 
+-- libbar 
    +-- CMakeLists.txt 
    +-- bar.h 
    +-- bar.cpp 

(Pour les intéressés, tout le code de cet exemple de projet peut être vérifié à partir here)

Le haut niveau CMakeLists.txt contient (entre autres) les énoncés enable_testing() et add_subdirectory(test). Compilation et exécution des cas de test fonctionne parfaitement avec cette configuration, simplement en exécutant

mkdir build && cd build 
cmake .. 
make 
make test 

Mais comment pourrais-je compiler ce projet en code de production, à savoir que les composants test, libfoo et libbar, sans tous les tests unitaires?

Dois-je faire les déclarations enable_testing() et add_subdirectory(test) dépend en quelque sorte sur certaines variables de configuration de construction? Ou quelle est la meilleure pratique pour cela?

+0

Vous pouvez faire des appels de commande CMake ne dépend que de la configuration de construction en configuration unique 'environnements de make' . Je me demande si vous connaissez la propriété cible ['EXCLUDE_FROM_DEFAULT_BUILD_ '] (https://cmake.org/cmake/help/latest/prop_tgt/EXCLUDE_FROM_DEFAULT_BUILD_CONFIG.html) cible? – Florian

Répondre

3

Pour construire les essais que sur demande, je le fais de cette façon:

  1. Ajouter une option option(BUILD_TEST "Build the unit tests" ON)
  2. Inclure les sous-répertoires de test uniquement en cas BUILD_TEST est sur

if(BUILD_TEST) add_subdirectory(test) endif()

Dans votre cas, vous pouvez le modifier en testfoo.

Comme vous avez demandé la production, vous pouvez utiliser les éléments suivants au lieu de construire en mode débogage:

if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") add_subdirectory(test) endif()

1

Ce que je fais est de faire une macro personnalisée pour la création de test unitaire qui fait cela:

set_target_properties(${NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test) 

Ensuite, vos tests se retrouveront dans un répertoire spécial (test) au lieu de l'ordinaire (habituellement bin) . Ensuite, pour la production, il suffit de copier le répertoire régulier sans le répertoire de test.

+0

Donc, vous dites que vous construisez généralement à la fois le code de production et le code de test? Ok, plus j'y pense, plus je suis d'accord avec lui (même si dans ce cas le développement du code de test peut parfois être un peu lourd, car il télécharge et construit des googletest - mais il y a des solutions à cela). En fait, la séparation vers différents répertoires de sortie est déjà faite. Je ne suis pas tout à fait sûr de l'avantage que la commande que vous avez posté apporterait. –