Testfunktionen

Testfunktionen geben einen booleschen Wert zurück, auf den Sie in den bedingten Teilen von Bereichen testen können. Testfunktionen können in eingebaute Funktionen und Funktionsbibliotheken unterteilt werden.

Siehe auch Ersetzungsfunktionen.

Eingebaute Testfunktionen

Grundlegende Testfunktionen sind als integrierte Funktionen implementiert.

cache(variablenname, [set|add|sub] [transient] [super|stash], [source variablenname])

Dies ist eine interne Funktion, die Sie normalerweise nicht benötigen werden.

Diese Funktion wurde in Qt 5.0 eingeführt.

CONFIG(config)

Diese Funktion kann verwendet werden, um auf Variablen zu testen, die in der CONFIG-Variable platziert sind. Dies ist dasselbe wie scopes, hat aber den zusätzlichen Vorteil, dass ein zweiter Parameter übergeben werden kann, um auf die aktive Konfiguration zu testen. Da die Reihenfolge der Werte bei CONFIG -Variablen wichtig ist (d. h. bei sich gegenseitig ausschließenden Werten wird die zuletzt gesetzte als aktive Konfiguration betrachtet), kann ein zweiter Parameter verwendet werden, um eine Reihe von zu berücksichtigenden Werten anzugeben. Ein Beispiel:

CONFIG = debug
CONFIG += release
CONFIG(release, debug|release):message(Release build!) #will print
CONFIG(debug, debug|release):message(Debug build!) #no print

Da release als die aktive Einstellung (für das Feature-Parsing) angesehen wird, wird es die CONFIG sein, die zur Erstellung der Build-Datei verwendet wird. Im allgemeinen Fall wird ein zweiter Parameter nicht benötigt, aber für spezielle gegenseitige Exklusivtests ist er von unschätzbarem Wert.

enthält(Variablenname, Wert)

Schlägt fehl, wenn die Variable variablename den Wert value enthält; andernfalls schlägt der Test fehl. Es ist möglich, einen regulären Ausdruck für den Parameter value anzugeben.

Sie können den Rückgabewert dieser Funktion mithilfe eines Bereichs überprüfen.

Ein Beispiel:

contains( drivers, network ) {
    # drivers contains 'network'
    message( "Configuring for network build..." )
    HEADERS += network.h
    SOURCES += network.cpp
}

Der Inhalt des Bereichs wird nur verarbeitet, wenn die Variable drivers den Wert network enthält. Wenn dies der Fall ist, werden die entsprechenden Dateien zu den Variablen SOURCES und HEADERS hinzugefügt.

count(Variablenname, Anzahl)

Erfolgreich, wenn die Variable variablename eine Liste mit den angegebenen number Werten enthält; andernfalls schlägt die Funktion fehl.

Diese Funktion wird verwendet, um sicherzustellen, dass Deklarationen innerhalb eines Bereichs nur verarbeitet werden, wenn die Variable die richtige Anzahl von Werten enthält. Ein Beispiel:

options = $$find(CONFIG, "debug") $$find(CONFIG, "release")
count(options, 2) {
    message(Both release and debug specified.)
}

debug(level, message)

Prüft, ob qmake auf dem angegebenen Debug-Level läuft. Wenn ja, wird true zurückgegeben und eine Debug-Meldung ausgegeben.

defined(name[, typ])

Prüft, ob die Funktion oder Variable name definiert ist. Wenn type weggelassen wird, werden alle Funktionen geprüft. Um nur Variablen oder bestimmte Typen von Funktionen zu prüfen, geben Sie type an. Es kann die folgenden Werte haben:

  • test prüft nur Testfunktionen
  • replace prüft nur Ersetzungsfunktionen
  • var prüft nur Variablen

equals(Variablenname, Wert)

Prüft, ob variablename gleich der Zeichenkette value ist.

Zum Beispiel:

TARGET = helloworld
equals(TARGET, "helloworld") {
    message("The target assignment was successful.")
}

error(string)

Diese Funktion gibt nie einen Wert zurück. qmake zeigt dem Benutzer string als Fehlermeldung an und beendet sich. Diese Funktion sollte nur bei nicht behebbaren Fehlern verwendet werden.

Ein Beispiel:

error(An error has occurred in the configuration process.)

eval(zeichenkette)

Wertet den Inhalt der Zeichenkette anhand der Syntaxregeln von qmake aus und gibt true zurück. Definitionen und Zuweisungen können in der Zeichenkette verwendet werden, um die Werte bestehender Variablen zu ändern oder neue Definitionen zu erstellen.

Zum Beispiel:

eval(TARGET = myapp) {
    message($$TARGET)
}

Hinweis: Die Zeichenkette kann durch Anführungszeichen abgegrenzt werden, und der Rückgabewert kann verworfen werden, wenn er nicht benötigt wird.

existiert(Dateiname)

Prüft, ob eine Datei mit dem angegebenen filename existiert. Wenn die Datei existiert, ist die Funktion erfolgreich, andernfalls schlägt sie fehl.

Das Argument filename kann Wildcards enthalten. In diesem Fall ist diese Funktion erfolgreich, wenn eine beliebige Datei übereinstimmt.

Ein Beispiel:

exists( $(QTDIR)/lib/libqt-mt* ) {
      message( "Configuring for multi-threaded Qt..." )
      CONFIG += thread
}

Hinweis: "/" sollte als Verzeichnistrennzeichen verwendet werden, unabhängig von der verwendeten Plattform.

export(Variablenname)

Exportiert den aktuellen Wert von variablename aus dem lokalen Kontext einer Funktion in den globalen Kontext.

for(iterate, Liste)

Startet eine Schleife, die über alle Werte in list iteriert und iterate der Reihe nach auf jeden Wert setzt. Wenn list gleich 1..10 ist, wird iterate der Einfachheit halber die Werte 1 bis 10 durchlaufen.

Ein Beispiel:

LIST = 1 2 3
for(a, LIST):exists(file.$${a}):message(I see a file.$${a}!)

Schleifen können mit break() unterbrochen werden. Die Anweisung next() überspringt den Rest des Schleifenkörpers und setzt die Ausführung mit der nächsten Iteration fort.

größerThan(Variablenname, Wert)

Prüft, ob der Wert von variablename größer ist als value. Diese Funktion versucht zunächst einen numerischen Vergleich. Wenn mindestens einer der Operanden nicht konvertiert werden kann, führt diese Funktion einen Stringvergleich durch.

Ein Beispiel:

ANSWER = 42
greaterThan(ANSWER, 1) {
    message("The answer might be correct.")
}

Es ist unmöglich, zwei Zahlen als Zeichenketten direkt zu vergleichen. Als Abhilfe konstruieren Sie temporäre Werte mit einem nicht-numerischen Präfix und vergleichen diese.

Ein Beispiel:

VALUE = 123
TMP_VALUE = x$$VALUE
greaterThan(TMP_VALUE, x456): message("Condition may be true.")

Siehe auch lessThan().

if(Bedingung)

Wertet condition aus. Sie wird verwendet, um boolesche Ausdrücke zu gruppieren.

Zum Beispiel:

if(linux-g++*|macx-g++*):CONFIG(debug, debug|release) {
    message("We are on Linux or Mac OS, and we are in debug mode.")
}

include(Dateiname)

Fügt den Inhalt der durch filename angegebenen Datei in das aktuelle Projekt an der Stelle ein, an der sie eingeschlossen ist. Diese Funktion ist erfolgreich, wenn filename eingebunden ist; andernfalls schlägt sie fehl. Die eingebundene Datei wird sofort verarbeitet.

Sie können prüfen, ob die Datei eingebunden wurde, indem Sie diese Funktion als Bedingung für einen Bereich verwenden. Ein Beispiel:

include( shared.pri )
OPTIONS = standard custom
!include( options.pri ) {
    message( "No custom build options specified" )
OPTIONS -= custom
}

infile(filename, var, val)

Ist erfolgreich, wenn die Datei filename (wenn sie von qmake selbst geparst wird) die Variable var mit dem Wert val enthält; andernfalls schlägt sie fehl. Wenn Sie val nicht angeben, prüft die Funktion, ob var in der Datei zugewiesen wurde.

isActiveConfig

Dies ist ein Alias für die Funktion CONFIG.

isEmpty(Variablenname)

Die Funktion ist erfolgreich, wenn die Variable variablename leer ist; andernfalls schlägt sie fehl. Dies ist das Äquivalent zu count( variablename, 0 ).

Zum Beispiel:

isEmpty( CONFIG ) {
CONFIG += warn_on debug
}

isEqual

Dies ist ein Alias für die Funktion equals.

lessThan(Variablenname, Wert)

Prüft, ob der Wert von variablename kleiner ist als value. Funktioniert wie greaterThan().

Zum Beispiel:

ANSWER = 42
lessThan(ANSWER, 1) {
    message("The answer might be wrong.")
}

load(Merkmal)

Lädt die durch feature angegebene Merkmalsdatei (.prf), sofern das Merkmal nicht bereits geladen wurde.

log(Nachricht)

Gibt eine Meldung auf der Konsole aus. Im Gegensatz zur Funktion message wird weder ein Text vorangestellt noch ein Zeilenumbruch angehängt.

Diese Funktion wurde in Qt 5.0 eingeführt.

Siehe auch message().

Nachricht(string)

Hat immer Erfolg und zeigt string als allgemeine Nachricht für den Benutzer an. Anders als die Funktion error() erlaubt diese Funktion die Fortsetzung der Verarbeitung.

message( "This is a message" )

Die obige Zeile bewirkt, dass "Dies ist eine Nachricht" in die Konsole geschrieben wird. Die Verwendung von Anführungszeichen ist optional, wird aber empfohlen.

Hinweis: Standardmäßig werden für jedes Makefile, das von qmake für ein bestimmtes Projekt erzeugt wird, Nachrichten ausgegeben. Wenn Sie sicherstellen wollen, dass Meldungen nur einmal pro Projekt erscheinen, testen Sie die Variable build_pass in Verbindung mit einem Bereich, um Meldungen während des Builds herauszufiltern. Zum Beispiel:

!build_pass:message( "This is a message" )

mkpath(dirPath)

Erzeugt den Verzeichnispfad dirPath. Diese Funktion ist ein Wrapper um die Funktion QDir::mkpath.

Diese Funktion wurde in Qt 5.0 eingeführt.

erfordert(Bedingung)

Wertet condition aus. Wenn die Bedingung falsch ist, überspringt qmake dieses Projekt (und seine SUBDIRS) beim Bauen.

Hinweis: Sie können auch die REQUIRES Variable für diesen Zweck verwenden. Wir empfehlen jedoch, stattdessen diese Funktion zu verwenden.

system(Befehl)

Führt den angegebenen Befehl command in einer sekundären Shell aus. Die Funktion ist erfolgreich, wenn der Befehl mit einem Exit-Status von Null zurückkehrt; andernfalls schlägt sie fehl. Sie können den Rückgabewert dieser Funktion mithilfe eines Bereichs überprüfen.

Zum Beispiel:

system("ls /bin"): HAS_BIN = TRUE

Siehe auch die replace-Variante von system().

touch(dateiname, referenz_dateiname)

Aktualisiert den Zeitstempel von filename, damit er mit dem Zeitstempel von reference_filename übereinstimmt.

Diese Funktion wurde in Qt 5.0 eingeführt.

unset(Variablenname)

Entfernt variablename aus dem aktuellen Kontext.

Zum Beispiel:

NARF = zort
unset(NARF)
!defined(NARF, var) {
    message("NARF is not defined.")
}

versionAtLeast(Variablenname, versionNumber)

Prüft, ob die Versionsnummer von variablename größer oder gleich versionNumber ist. Die Versionsnummer wird als eine Folge von nicht-negativen Dezimalzahlen betrachtet, die durch '.' getrennt sind; jeder nicht-numerische Teil der Zeichenkette wird ignoriert. Der Vergleich wird segmentweise von links nach rechts durchgeführt; wenn eine Version ein Präfix der anderen ist, wird sie als kleiner betrachtet.

Diese Funktion wurde in Qt 5.10 eingeführt.

versionAtMost(Variablenname, versionNumber)

Prüft, ob die Versionsnummer von variablename kleiner oder gleich versionNumber ist. Funktioniert wie versionAtLeast().

Diese Funktion wurde in Qt 5.10 eingeführt.

warning(zeichenkette)

Hat immer Erfolg und zeigt string als Warnmeldung für den Benutzer an.

write_file(Dateiname, [Variablenname, [Modus]])

Schreibt die Werte von variablename in eine Datei mit dem Namen filename, jeden Wert in eine eigene Zeile. Wenn variablename nicht angegeben ist, wird eine leere Datei erstellt. Wenn mode gleich append ist und die Datei bereits existiert, wird an sie angehängt, anstatt sie zu ersetzen.

Diese Funktion wurde in Qt 5.0 eingeführt.

Testfunktionsbibliothek

Komplexe Testfunktionen sind in einer Bibliothek von .prf-Dateien implementiert.

packagesExist(Pakete)

Verwendet den PKGCONFIG-Mechanismus, um festzustellen, ob die angegebenen Pakete zum Zeitpunkt des Parsens des Projekts existieren oder nicht.

Dies kann nützlich sein, um optional Funktionen zu aktivieren oder zu deaktivieren. Zum Beispiel:

packagesExist(sqlite3 QtNetwork QtDeclarative) {
    DEFINES += USE_FANCY_UI
}

Und dann, im Code:

#ifdef USE_FANCY_UI
    // Use the fancy UI, as we have extra packages available
#endif

prepareRecursiveTarget(target)

Erleichtert die Erstellung von projektweiten Zielen, ähnlich dem install Ziel, indem ein Ziel vorbereitet wird, das alle Unterverzeichnisse durchläuft. Zum Beispiel:

TEMPLATE = subdirs
SUBDIRS = one two three
prepareRecursiveTarget(check)

Unterverzeichnisse, in deren .CONFIG have_no_default oder no_<target>_target angegeben ist, sind von diesem Ziel ausgeschlossen:

two.CONFIG += no_check_target

Sie müssen das vorbereitete Ziel manuell zu QMAKE_EXTRA_TARGETS hinzufügen:

QMAKE_EXTRA_TARGETS += check

Um das Ziel global zu machen, muss der obige Code in jedes Unterverzeichnis-Unterprojekt aufgenommen werden. Damit diese Ziele überhaupt etwas bewirken können, müssen auch die Unterprojekte, die nicht subdirs sind, den entsprechenden Code enthalten. Der einfachste Weg, dies zu erreichen, ist die Erstellung einer benutzerdefinierten Feature-Datei. Ein Beispiel:

# <project root>/features/mycheck.prf
equals(TEMPLATE, subdirs) {
    prepareRecursiveTarget(check)
} else {
    check.commands = echo hello user
}
QMAKE_EXTRA_TARGETS += check

Die Feature-Datei muss in jedes Unterprojekt injiziert werden, zum Beispiel durch .qmake.conf:

# <project root>/.qmake.conf
CONFIG += mycheck

Diese Funktion wurde in Qt 5.0 eingeführt.

qtCompileTest(test)

Erzeugt ein Testprojekt. Wenn der Test erfolgreich ist, wird true zurückgegeben und config_<test> zur CONFIG-Variable hinzugefügt. Andernfalls wird false zurückgegeben.

Um diese Funktion verfügbar zu machen, müssen Sie die entsprechende Feature-Datei laden:

# <project root>/project.pro
load(configure)

Dies setzt auch die Variable QMAKE_CONFIG_TESTS_DIR auf das Unterverzeichnis config.tests des übergeordneten Verzeichnisses des Projekts. Es ist möglich, diesen Wert nach dem Laden der Feature-Datei zu überschreiben.

Innerhalb des Tests-Verzeichnisses muss es ein Unterverzeichnis pro Test geben, das ein einfaches qmake-Projekt enthält. Das folgende Codeschnipsel veranschaulicht die .pro-Datei des Projekts:

# <project root>/config.tests/test/test.pro
SOURCES = main.cpp
LIBS += -ltheFeature
# Note that the test project is built without Qt by default.

Der folgende Codeschnipsel zeigt die .cpp-Hauptdatei des Projekts:

// <project root>/config.tests/test/main.cpp
#include <TheFeature/MainHeader.h>
int main() { return featureFunction(); }

Der folgende Codeausschnitt zeigt den Aufruf des Tests:

# <project root>/project.pro
qtCompileTest(test)

Wenn das Testprojekt erfolgreich erstellt wurde, ist der Test erfolgreich.

Die Testergebnisse werden automatisch zwischengespeichert, wodurch sie auch allen Unterprojekten zur Verfügung stehen. Es ist daher empfehlenswert, alle Konfigurationstests in der obersten Projektdatei auszuführen.

Um die Wiederverwendung von gecachten Ergebnissen zu unterdrücken, übergeben Sie CONFIG+=recheck an qmake.

Siehe auch load().

Diese Funktion wurde in Qt 5.0 eingeführt.

qtHaveModule(Name)

Prüft, ob das durch name angegebene Qt-Modul vorhanden ist. Für eine Liste der möglichen Werte siehe QT.

Diese Funktion wurde in Qt 5.0.1 eingeführt.

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.