J'essaye CTest dans CMake afin d'exécuter automatiquement certains de mes tests en utilisant make test
target. Le problème est que CMake ne «comprend» pas que le test que je suis prêt à exécuter doit être construit car il fait partie du projet.
Je cherche donc un moyen de spécifier explicitement cette dépendance.
dependencies
cmake
ctest
claf
la source
la source
check
cible et qu'ils puissent entrer en collisionIl existe en fait un moyen d'utiliser
make test
. Vous devez définir la construction de l'exécutable de test comme l'un des tests, puis ajouter des dépendances entre les tests. C'est:la source
J'utilise une variante de la réponse de richq. Au niveau supérieur
CMakeLists.txt
, j'ajoute une cible personnalisée,,build_and_test
pour créer et exécuter tous les tests:Dans les différents
CMakeLists.txt
fichiers de sous-projets ci- dessoustest/
, j'ajoute chaque exécutable de test en tant que dépendance debuild_and_test
:Avec cette approche, j'ai juste besoin de le faire
make build_and_test
au lieu demake test
(oumake all test
), et cela a l'avantage de créer uniquement du code de test (et ses dépendances). C'est dommage que je ne puisse pas utiliser le nom de la cibletest
. Dans mon cas, ce n'est pas si mal parce que j'ai un script de haut niveau qui débogue et publie hors de l'arbre (et compilé de manière croisée) en appelantcmake
et ensuitemake
, et cela se traduittest
parbuild_and_test
.De toute évidence, les éléments GTest ne sont pas nécessaires. Il se trouve que j'utilise / aime Google Test, et je voulais partager un exemple complet de son utilisation avec CMake / CTest. À mon humble avis, cette approche a également l'avantage de me permettre d'utiliser
ctest -V
, ce qui montre la sortie de Google Test pendant que les tests s'exécutent:la source
Si vous essayez d'émuler
make check
, vous trouverez peut-être cette entrée de wiki utile:http://www.cmake.org/Wiki/CMakeEmulateMakeCheck
Je viens de vérifier que c'est fait ce qu'il dit avec succès (CMake 2.8.10).
la source
make check
. Pour les tests avec des temps de compilation dominants, cela rendctest -R
inutile.Épargnez-vous le mal de tête:
Fonctionne hors de la boîte pour moi et construira des dépendances avant d'exécuter le test. Compte tenu de la simplicité, cela rend presque la
make test
fonctionnalité native pratique car elle vous donne la possibilité d'exécuter les derniers tests de compilation même si votre code est cassé.la source
make -j4 all && make test
. Et c'est aussi floconneux en utilisant un outil de construction non-Make.Si vous utilisez CMake> = 3.7, l'approche recommandée consiste à utiliser des appareils :
Cela fait ce qui suit:
test
cible exécutable construite à partir detest.cpp
test_build
"test" qui exécute Cmake pour générer la cibletest
test_build
test comme une tâche de configuration de l'appareiltest_fixture
test
test qui exécute simplement l'test
exécutabletest
test comme ayant besoin d'un appareiltest_fixture
.Ainsi, chaque fois qu'un test
test
doit être exécuté, il exécute d'abord testtest_build
, qui construit l'exécutable nécessaire.la source
$<CONFIG>
n'est pas défini--target
, deviendra l'argument du--config
.$<CONFIG>
c'est toujours non vide. C'est une expression de générateur pour le nom de la configuration: cmake.org/cmake/help/latest/manual/ ... Je vais éditer la réponse pour la mettre entre guillemets de toute façon juste parce que cela ne fait aucune différence.cmake
? Je fais de cette façon:mkdir build; cd build; cmake ..; make
. Et il semble qu'il n'y ait aucune valeur par défaut et que toutes les variables associées sont vides, jusqu'à ceCMAKE_BUILD_TYPE
qu'elles soient définies manuellement. (actuellement sur Debian 10, n'a pas vérifié d'autres plates-formes)C'est ce que j'ai martelé et que j'utilise:
YMMV
la source
Réponse de Derrick, simplifiée et commentée:
Ce n'est pas tout à fait correct, car cela ne résout pas le problème de concurrence de l'exécution
ninja all test
, au cas où quelqu'un le ferait. Au contraire, parce que maintenant, vous avez deux processus ninja.La solution ultime, si vous me le demandez, est d'utiliser Meson au lieu de CMake. Meson a raison, entre autres choses.
la source
Toutes les réponses ci-dessus sont parfaites. Mais en fait CMake utilise CTest comme outil de test, donc la méthode standard (je pense que c'est le cas) pour faire la mission est:
Exécutez ensuite cmake et faites pour construire les cibles. Après cela, vous pouvez exécuter make test ou simplement exécuter
vous obtiendrez le résultat. Ceci est testé sous CMake 2.8.
Vérifiez les détails sur: http://cmake.org/Wiki/CMake/Testing_With_CTest#Simple_Testing
la source
enable_testing()
,add_test()
, etc. Le problème est qu'il doit émettre manuellement la commande de construction avant l' exécution des tests. Il souhaite que lamake test
cible crée automatiquement les exécutables de test si nécessaire.Toutes les réponses sont bonnes, mais elles impliquent une violation de la tradition d'exécuter un test par commande
make test
. J'ai fait cette astuce:Cela signifie que le test consiste à construire (facultativement) et à exécuter la cible exécutable.
la source
make
et perd la fonctionnalité de CMake de génération de scripts pour d'autres outils de construction.