Komplette CMake-Anleitung. Dritter Teil: Testen und Verpacken


Einführung


Dieser Artikel beschreibt das Testen und Verpacken von Programmen mit CMake, einem flexiblen und vielseitigen Dienstprogramm zur Entwicklung verschiedener Softwareprodukte. Es wird dringend empfohlen, den ersten und zweiten Teil des Handbuchs zu lesen, um Missverständnisse bei der Syntax und der Funktionsweise von CMake zu vermeiden.


CMake-Start


Im Folgenden finden Sie Beispiele für die Verwendung der CMake-Sprache, die Sie üben sollten. Experimentieren Sie mit dem Quellcode, indem Sie vorhandene Befehle ändern und neue hinzufügen. Installieren Sie CMake von der offiziellen Website , um diese Beispiele auszuführen.


Testbeispiel


Wie bereits erwähnt, unterstützt CMake das automatische Testen von Programmen. Diese Funktion ist sehr einfach zu bedienen - schreiben Sie einfach ein paar Befehle in die übliche CMakeLists.txt und führen Sie die Tests dann mit ctest oder make test . Zu Ihrer Verfügung stehen eine Überprüfung der Programmausgabe, eine dynamische Speicheranalyse und vieles mehr.


Wir werden den Prozess des Testens des Programms anhand eines bestimmten Beispiels betrachten. Die Quelldatei Multiply.c enthält den folgenden Code:


 #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; } 

Dieser Code zeigt das Ergebnis der Multiplikation zweier Argumente mit der Konsole an. Bitte beachten Sie, dass eine Situation des Auftretens eines Fehlers auch dann möglich ist, wenn die tatsächliche Anzahl der Argumente nicht den Erwartungen entspricht: In diesem Fall wird der Fehler an den Fehlerstrom ausgegeben Error! .


Im selben Verzeichnis befindet sich die Datei CMakeLists.txt mit einer Beschreibung des Erstellungsprozesses, die den folgenden Code enthält:


 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!") 

Betrachten wir alles in Ordnung. Die ersten vier Befehle sollten Ihnen aus dem vorherigen Artikel bekannt sein , und der nächste Befehl enable_testing wirft eine Reihe von Fragen auf. Im Wesentlichen benachrichtigt dieser Befehl CMake nur über Ihre Absicht, das Programm zu testen, und generiert gleichzeitig einige Konfigurationsdateien, deren Existenz Sie nicht kennen müssen.


Die folgenden drei add_test fügen dem aktuellen Projekt Tests hinzu. Die Kurzform dieses Befehls verwendet den Namen des Tests als erstes Argument, und die nachfolgenden Argumente bilden einen Shell-Befehl zum Ausführen des Tests.


Eine Reihe von Befehlen set_tests_properties legt das Verhalten einzelner Tests fest. Nach der Liste der PROPERTIES folgt das Schlüsselwort PROPERTIES , das den Beginn der Liste der Eigenschaften mit der Form < > < > signalisiert und für die ausgewählten Tests festgelegt wird. Eine vollständige Liste der verfügbaren Immobilien finden Sie hier .


Für alle Tests wird die maximale Ausführungszeit mit der Eigenschaft TIMEOUT auf eine Sekunde TIMEOUT Für die nachfolgenden Tests wird die erwartete Ausgabe mit den FAIL_REGULAR_EXPRESSION PASS_REGULAR_EXPRESSION und FAIL_REGULAR_EXPRESSION mit dem Ausdruck Error! stoppt Error! Test und gilt als fehlgeschlagen).


Möglichkeiten zum Testen


Es gibt ein Analogon zum enable_testing - dies ist die Einbeziehung des CTest Moduls durch den Befehl include . Im Allgemeinen ist die Aufnahme eines Moduls universeller, aber es gibt immer noch einen Unterschied zwischen ihnen.


Der Befehl enable_testing ermöglicht das Testen des aktuellen Verzeichnisses sowie aller nachfolgenden Verzeichnisse. Es sollte sich im Stammverzeichnis CMakeLists.txt , da CTest eine Testdatei im Stammverzeichnis der Assembly erwartet.


Durch Aktivieren des CTest Moduls wird das Projekt für das Testen mit CTest / CDash konfiguriert und automatisch die Option BUILD_TESTING ermittelt, die true akzeptiert, wenn das Testen möglich ist (standardmäßig - ON ). Wenn Sie diesen Befehl verwenden, ist es daher sinnvoll, den Testprozess folgendermaßen zu beschreiben:


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

Testausführung


Eine Reihe von cmake . && cmake --build . && ctest . Befehlen cmake . && cmake --build . && ctest . cmake . && cmake --build . && ctest . Alle drei Tests werden ausgeführt. Der ctest -R <RegularExpression> führt eine Reihe von Tests aus, die einem bestimmten regulären Ausdruck entsprechen. Beispielsweise führt der ctest -R ThirdTest nur den dritten Test aus.


Verpackungsbeispiel


Um ein Paket aus Quelldateien, Bibliotheken und ausführbaren Dateien zu erstellen, müssen Sie nur die Installation der erforderlichen Dateien mit dem Befehl install und dann das CPack Modul CPack dem Befehl CPack aktivieren:


 #    "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) 

In diesem Fall benachrichtigt der Befehl install Paketgenerator über das Installationsverzeichnis des Ziels Multiply . Ohne das Schreiben von Installationsbefehlen ist keine Paketerzeugung möglich.


Im Folgenden werden die Eigenschaften des Pakets aufgelistet, indem mehrere Variablen festgelegt werden. Tatsächlich gibt es viele solcher Variablen, die Pakete richtig verpacken. Die meisten von ihnen sind optional, aber einige Paketgeneratoren erfordern ihre Definition. Eine Liste der Variablen, die allen Paketgeneratoren gemeinsam sind, finden Sie hier .


Die Definition der Variablen CPACK_GENERATOR ist CPACK_GENERATOR - es handelt sich um eine Liste von cpack die cpack Dienstprogramm cpack aufgerufen werden. In diesem Fall nimmt es den Wert DEB , daher wird im Stammverzeichnis der Übersichtsanwendung ein Debian-Paket generiert.


Schließlich wird das CPack Modul CPack und das zukünftige Projektpaket mithilfe der zuvor definierten Variablen und des Installationsbefehls für die ausführbare Datei konfiguriert sowie zwei Assembly-Ziele hinzugefügt - package und package_source (binäre Assembly bzw. package_source ).


Packing Execution


Eine Reihe von cmake . && cmake --build . && cmake --build . --target package Befehlen cmake . && cmake --build . && cmake --build . --target package cmake . && cmake --build . && cmake --build . --target package cmake . && cmake --build . && cmake --build . --target package gestartet, um den ausgewählten Generator zum Erstellen eines Binärpakets und cmake . && cmake --build . && cmake --build . --target package_source Befehle auszuführen cmake . && cmake --build . && cmake --build . --target package_source cmake . && cmake --build . && cmake --build . --target package_source cmake . && cmake --build . && cmake --build . --target package_source generiert ein cmake . && cmake --build . && cmake --build . --target package_source direkt im Stammverzeichnis.


Fertigstellung


Zu diesem Zeitpunkt ist die vollständige CMake-Tutorialserie beendet. Ich hoffe, dass Sie viel nützliches Material gelernt und Ihre Programmierkenntnisse verbessert haben. Viel Glück

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


All Articles