Guide CMake complet. Troisième partie: essais et emballage


Présentation


Cet article décrit les programmes de test et de mise en package utilisant CMake, un ensemble d'utilitaires flexible et polyvalent pour développer divers produits logiciels. Il est fortement recommandé de lire les première et deuxième parties du manuel pour éviter de mal comprendre la syntaxe et le fonctionnement de CMake.


Lancement de CMake


Voici des exemples d'utilisation du langage CMake que vous devez pratiquer. Essayez le code source en modifiant les commandes existantes et en en ajoutant de nouvelles. Pour exécuter ces exemples, installez CMake à partir du site Web officiel .


Exemple de test


Comme mentionné précédemment, CMake prend en charge le test automatique des programmes. Cette fonctionnalité est très facile à utiliser - il suffit d'écrire quelques commandes dans le CMakeLists.txt habituel, puis d'exécuter les tests en utilisant ctest ou make test . À votre disposition, il y a un contrôle de la sortie des programmes, une analyse dynamique de la mémoire et bien plus encore.


Nous considérerons le processus de test du programme avec un exemple spécifique. Le fichier source Multiply.c contient le code suivant:


 #include <stdio.h> #include <stdlib.h> #define ARG_COUNT 3 int main(const int argc, const char *argv[]) { if (argc != ARG_COUNT) { fprintf(stderr, "Error!\n"); return EXIT_FAILURE; } const int first = atoi(argv[1]); const int second = atoi(argv[2]); printf("The result is: %d\n", first * second); return EXIT_SUCCESS; } 

Ce code affiche le résultat de la multiplication de deux arguments sur la console. Veuillez noter qu'une situation d'occurrence d'une erreur est également possible si le nombre réel d'arguments ne satisfait pas la valeur attendue: dans ce cas, l'erreur sera sortie dans l' Error! .


Dans le même répertoire se trouve le fichier CMakeLists.txt avec une description du processus de construction, contenant le code ci-dessous:


 cmake_minimum_required(VERSION 3.0) project(MyProgram) add_executable(Multiply Multiply.c) set(MULTIPLY_TIMEOUT 1) #   : enable_testing() #  : add_test(FirstTest Multiply 15 207) add_test(SecondTest Multiply -54 -785) add_test(ThirdTest Multiply 85234) #   : set_tests_properties(FirstTest SecondTest ThirdTest PROPERTIES TIMEOUT ${MULTIPLY_TIMEOUT}) set_tests_properties(FirstTest PROPERTIES PASS_REGULAR_EXPRESSION "The result is: 3105" FAIL_REGULAR_EXPRESSION "Error!") set_tests_properties(SecondTest PROPERTIES PASS_REGULAR_EXPRESSION "The result is: 42390" FAIL_REGULAR_EXPRESSION "Error!") set_tests_properties(ThirdTest PROPERTIES PASS_REGULAR_EXPRESSION "Error!") 

Considérons tout dans l'ordre. Les quatre premières commandes doivent vous être familières dans l' article précédent , et la prochaine commande enable_testing soulève un certain nombre de questions. En substance, cette commande ne fait que notifier CMake de votre intention de tester le programme, en générant simultanément certains fichiers de configuration, dont vous n'avez pas besoin de connaître l'existence.


Les trois add_test suivantes ajoutent des tests au projet en cours. La forme courte de cette commande prend le nom du test comme premier argument, et les arguments suivants forment une commande shell pour exécuter le test.


Une série de commandes set_tests_properties définit le comportement des tests individuels. Après la liste des éléments de test, le mot-clé PROPERTIES suit, signalant le début d'une liste de propriétés qui ont la forme < > < > et sont définies pour les tests sélectionnés. Une liste complète des propriétés disponibles est ici .


Pour tous les tests, le temps d'exécution maximal est défini sur une seconde avec la propriété TIMEOUT , puis pour les tests suivants, la sortie attendue est définie avec les FAIL_REGULAR_EXPRESSION PASS_REGULAR_EXPRESSION et FAIL_REGULAR_EXPRESSION (par exemple, si l'expression régulière The result is: 3105 correspond, puis le test FirstTest continue et s'il correspond) avec l'expression Error! test s'arrête et est considéré comme ayant échoué).


Façons d'activer les tests


Il existe un analogue de la enable_testing - il s'agit de l'inclusion du module CTest via la commande include . En général, l'inclusion d'un module est plus universelle, mais il y a toujours une différence entre eux.


La commande enable_testing permet de tester le répertoire actuel, ainsi que tous les suivants. Il doit se trouver dans la racine CMakeLists.txt , car CTest attend un fichier de test à la racine de l'assembly.


L'activation du module CTest configure le projet pour les tests à l'aide de CTest / CDash et détermine également automatiquement l'option BUILD_TESTING , qui accepte vrai lorsque le test est possible (la valeur par défaut est ON ). Ainsi, lorsque vous utilisez cette commande, il est raisonnable de décrire le processus de test de cette manière:


 if(BUILD_TESTING) add_test(FirstTest Test 1) add_test(SecondTest Test 2) add_test(ThirdTest Test 3) #  ... endif() 

Exécution des tests


Une série de commandes cmake . && cmake --build . && ctest . cmake . && cmake --build . && ctest . les trois tests sont exécutés. La commande ctest -R <RegularExpression> exécute un ensemble de tests qui satisfont une expression régulière donnée. Par exemple, la ctest -R ThirdTest exécute uniquement le troisième test.


Exemple d'emballage


Pour créer un package de fichiers source, bibliothèques et fichiers exécutables, il vous suffit de décrire l'installation des fichiers nécessaires à l'aide de la commande install , puis d'activer le module CPack la commande include :


 #    "Multiply"   "bin": install(TARGETS Multiply DESTINATION bin) #    : set(CPACK_PACKAGE_NAME "Multiply") set(CPACK_PACKAGE_VENDOR "MyCompany") set(CPACK_PACKAGE_CONTACT "https://myprojectsite.org") set(CPACK_DEBIAN_PACKAGE_MAINTAINER "mycontacts@gmail.com") set(CPACK_PACKAGE_DESCRIPTION "The most stupid program ever written") #    : set(CPACK_GENERATOR "DEB") #    "CPack": include(CPack) 

Dans ce cas, la commande install notifie le générateur de packages du répertoire d'installation cible Multiply . Sans écriture des commandes d'installation, la génération de packages n'est pas possible.


Ce qui suit répertorie les caractéristiques du package en définissant plusieurs variables. En fait, il existe de nombreuses variables de ce type qui conditionnent correctement les packages. La plupart d'entre eux sont facultatifs, mais certains générateurs de packages nécessitent leur définition. Une liste des variables communes à tous les générateurs de packages est disponible ici .


La définition de la variable CPACK_GENERATOR est CPACK_GENERATOR - il s'agit d'une liste de générateurs de packages appelés par l'utilitaire cpack . Dans ce cas, il prend la valeur DEB , donc un paquet Debian est généré dans le répertoire racine de l'application de vue d'ensemble.


Enfin, le module CPack est CPack , configurant le futur package de projet à l'aide des variables définies précédemment et de la commande d'installation pour le fichier exécutable, ainsi que l'ajout de deux cibles d'assembly - package et package_source (assemblage binaire et assemblage source, respectivement).


Exécution de l'emballage


Une série de commandes cmake . && cmake --build . && cmake --build . --target package cmake . && cmake --build . && cmake --build . --target package cmake . && cmake --build . && cmake --build . --target package lancé pour exécuter le générateur sélectionné pour créer un package binaire et les commandes cmake . && cmake --build . && cmake --build . --target package_source cmake . && cmake --build . && cmake --build . --target package_source cmake . && cmake --build . && cmake --build . --target package_source générer un package source directement dans le répertoire racine.


Achèvement


À ce stade, la série de didacticiels complets CMake a pris fin. J'espère que vous avez appris beaucoup de matériel utile et amélioré vos compétences en programmation. Bonne chance

Source: https://habr.com/ru/post/fr433822/


All Articles