
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)
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)
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:
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