Auf dieser Seite

Testfunktionen

Testfunktionen geben einen booleschen Wert zurück, auf den Sie in den bedingten Teilen von Scopes prüfen können. Testfunktionen lassen sich in integrierte Funktionen und Funktionsbibliotheken unterteilen.

Siehe auch Ersetzungsfunktionen.

Integrierte Testfunktionen

Grundlegende Testfunktionen sind als integrierte Funktionen implementiert.

cache(Variablenname, [set|add|sub] [transient] [super|stash], [Quellvariablenname])

Dies ist eine interne Funktion, die Sie in der Regel nicht benötigen werden.

Diese Funktion wurde in Qt 5.0 eingeführt.

CONFIG(config)

Diese Funktion kann verwendet werden, um nach Variablen zu suchen, die in die Variable CONFIG gesetzt wurden. Dies entspricht der Funktion „scopes“, hat jedoch den zusätzlichen Vorteil, dass ein zweiter Parameter übergeben werden kann, um die aktive Konfiguration zu prüfen. Da die Reihenfolge der Werte bei „ CONFIG “-Variablen wichtig ist (d. h., der zuletzt festgelegte Wert gilt bei sich gegenseitig ausschließenden Werten als aktive Konfiguration), kann ein zweiter Parameter verwendet werden, um eine Reihe von zu berücksichtigenden Werten anzugeben. 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 aktive Einstellung (für die Feature-Analyse) gilt, wird diese CONFIG zur Erstellung der Build-Datei verwendet. Im Normalfall wird kein zweiter Parameter benötigt, für bestimmte Tests mit sich gegenseitig ausschließenden Werten ist er jedoch von unschätzbarem Wert.

contains(Variablenname, Wert)

Erfolgreich, wenn die Variable „ variablename “ den Wert „ value “ enthält; andernfalls fehlgeschlagen. Für den Parameter „value“ kann ein regulärer Ausdruck angegeben werden.

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

Beispiel:

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

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

count(variablename, number)

number Erfolgreich, wenn die Variable „ variablename “ eine Liste mit der angegebenen Anzahl von Werten enthält; andernfalls fehlgeschlagen.

Diese Funktion wird verwendet, um sicherzustellen, dass Deklarationen innerhalb eines Gültigkeitsbereichs nur verarbeitet werden, wenn die Variable die richtige Anzahl von Werten enthält. Zum 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 der angegebenen Debug-Stufe läuft. Wenn ja, gibt sie „true“ zurück und gibt eine Debug-Meldung aus.

defined(name[, type])

Prüft, ob die Funktion oder Variable „ name “ definiert ist. Wird „ type “ weggelassen, werden alle Funktionen geprüft. Um nur Variablen oder bestimmte Funktionstypen zu prüfen, geben Sie „ type “ an. Es kann folgende Werte annehmen:

  • test „only“ prüft nur Testfunktionen
  • replace prüft nur Ersetzungsfunktionen
  • var prüft nur Variablen

equals(Variablenname, Wert)

Prüft, ob „ variablename “ mit der Zeichenkette „ value “ übereinstimmt.

Beispiel:

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

error(Zeichenkette)

Diese Funktion gibt niemals einen Wert zurück. qmake zeigt „ string “ als Fehlermeldung für den Benutzer an und beendet die Ausführung. Diese Funktion sollte nur bei nicht behebbaren Fehlern verwendet werden.

Beispiel:

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

eval(string)

Wertet den Inhalt der Zeichenkette unter Verwendung der qmake-Syntaxregeln aus und gibt „true“ zurück. In der Zeichenkette können Definitionen und Zuweisungen verwendet werden, um die Werte bestehender Variablen zu ändern oder neue Definitionen zu erstellen.

Beispiel:

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

Hinweis: Anführungszeichen können zur Begrenzung der Zeichenkette verwendet werden, und der Rückgabewert kann verworfen werden, wenn er nicht benötigt wird.

exists(filename)

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 “ darf Platzhalter enthalten. In diesem Fall ist die Funktion erfolgreich, wenn eine beliebige Datei übereinstimmt.

Beispiel:

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

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

export(variablename)

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

for(iterate, list)

Startet eine Schleife, die alle Werte in ` list` durchläuft und dabei ` iterate ` nacheinander auf jeden Wert setzt. Zur Vereinfachung: Wenn ` list ` den Wert 1..10 hat, durchläuft `iterate` die Werte von 1 bis 10.

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.

greaterThan(Variablenname, Wert)

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

Beispiel:

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

Es ist nicht möglich, zwei Zahlen direkt als Zeichenfolgen zu vergleichen. Als Workaround können temporäre Werte mit einem nicht-numerischen Präfix gebildet und diese verglichen werden.

Beispiel:

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

Siehe auch lessThan().

if(Bedingung)

Wertet „ condition “ aus. Wird verwendet, um boolesche Ausdrücke zu gruppieren.

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(filename)

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

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

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

infile(filename, var, val)

Schlägt erfolgreich an, wenn die Datei „ filename “ (bei der Analyse durch qmake selbst) die Variable „ var “ mit dem Wert „ val “ enthält; andernfalls schlägt sie fehl. Wenn Sie „ val “ nicht angeben, prüft die Funktion, ob in der Datei „ var “ zugewiesen wurde.

isActiveConfig

Dies ist ein Alias für die Funktion „ CONFIG “.

isEmpty(variablename)

Erfolgreich, wenn die Variable „ variablename “ leer ist; andernfalls fehlgeschlagen. Dies entspricht „ count( variablename, 0 ) “.

Beispiel:

isEmpty( CONFIG ) {
CONFIG += warn_on debug
}

isEqual

Dies ist ein Alias für die Funktion „ equals “.

lessThan(variablename, value)

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

Beispiel:

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

load(feature)

Lädt die durch ` feature` angegebene Feature-Datei (`.prf`), sofern das Feature nicht bereits geladen wurde.

log(message)

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

Diese Funktion wurde in Qt 5.0 eingeführt.

Siehe auch message().

message(string)

Läuft immer erfolgreich ab und zeigt „ string “ als allgemeine Meldung für den Benutzer an. Im Gegensatz zur Funktion „ error() “ ermöglicht diese Funktion die Fortsetzung der Verarbeitung.

message( "This is a message" )

Die obige Zeile bewirkt, dass „This is a message“ in die Konsole geschrieben wird. Die Verwendung von Anführungszeichen ist optional, wird jedoch empfohlen.

Hinweis: Standardmäßig werden Meldungen für jedes von qmake für ein bestimmtes Projekt generierte Makefile ausgegeben. Wenn Sie sicherstellen möchten, dass Meldungen für jedes Projekt nur einmal erscheinen, testen Sie die Variable „ build_pass “ in Verbindung mit einem Gültigkeitsbereich, um Meldungen während des Builds herauszufiltern. Zum Beispiel:

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

mkpath(dirPath)

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

Diese Funktion wurde in Qt 5.0 eingeführt.

requires(condition)

Wertet „ condition “ aus. Ist die Bedingung falsch, überspringt qmake dieses Projekt (und dessen SUBDIRS) beim Erstellen.

Hinweis: Sie können zu diesem Zweck auch die Variable `REQUIRES ` verwenden. Wir empfehlen jedoch, stattdessen diese Funktion zu nutzen.

system(Befehl)

Führt den angegebenen Befehl ` command ` in einer sekundären Shell aus. Der Aufruf ist erfolgreich, wenn der Befehl mit dem Exit-Status 0 zurückkehrt; andernfalls schlägt er fehl. Sie können den Rückgabewert dieser Funktion mithilfe eines Scopes überprüfen.

Beispiel:

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

Siehe auch die „replace“-Variante von system().

touch(Dateiname, Referenzdateiname)

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

Diese Funktion wurde in Qt 5.0 eingeführt.

unset(variablename)

Entfernt ` variablename ` aus dem aktuellen Kontext.

Beispiel:

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

versionAtLeast(variablename, versionNumber)

Prüft, ob die Versionsnummer aus „ variablename “ größer oder gleich „ versionNumber “ ist. Die Versionsnummer wird als Folge nicht-negativer Dezimalzahlen betrachtet, die durch „.“ getrennt sind; ein etwaiger nicht-numerischer Teil am Ende der Zeichenkette wird ignoriert. Der Vergleich erfolgt segmentweise von links nach rechts; ist eine Version ein Präfix der anderen, gilt sie als kleiner.

Diese Funktion wurde in Qt 5.10 eingeführt.

versionAtMost(variablename, versionNumber)

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

Diese Funktion wurde in Qt 5.10 eingeführt.

warning(string)

Läuft immer erfolgreich ab und zeigt string als Warnmeldung für den Benutzer an.

write_file(filename, [variablename, [mode]])

Schreibt die Werte von ` variablename ` in eine Datei mit dem Namen ` filename`, wobei jeder Wert in einer eigenen Zeile steht. Wenn ` variablename ` nicht angegeben ist, wird eine leere Datei erstellt. Wenn ` mode ` auf ` append ` gesetzt ist und die Datei bereits existiert, wird der Inhalt an das Ende der Datei angehängt, anstatt sie zu überschreiben.

Diese Funktion wurde in Qt 5.0 eingeführt.

Testfunktionsbibliothek

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

packagesExist(packages)

Verwendet den PKGCONFIG-Mechanismus, um festzustellen, ob die angegebenen Pakete zum Zeitpunkt der Projektanalyse vorhanden sind.

Dies kann nützlich sein, um Funktionen wahlweise zu aktivieren oder zu deaktivieren. 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 projektweiter Ziele ähnlich dem Ziel „ install “, 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, werden 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 verfügbar zu machen, muss der obige Code in jedes „subdirs“-Unterprojekt eingebunden werden. Damit diese Ziele überhaupt etwas bewirken, müssen zudem auch Nicht-„subdirs“-Unterprojekte den entsprechenden Code enthalten. Am einfachsten lässt sich dies durch die Erstellung einer benutzerdefinierten Feature-Datei erreichen. 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 eingebunden werden, beispielsweise über .qmake.conf:

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

Diese Funktion wurde in Qt 5.0 eingeführt.

qtCompileTest(test)

Erstellt ein Testprojekt. Wenn der Test erfolgreich ist, wird „true“ zurückgegeben und „ config_<test> “ wird der Variablen CONFIG 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)

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

Im Verzeichnis „tests“ muss es für jeden Test ein Unterverzeichnis geben, das ein einfaches qmake-Projekt enthält. Der folgende Codeausschnitt 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 Codeausschnitt veranschaulicht die Haupt-C++-Datei 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 wird, ist der Test bestanden.

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

Um die Wiederverwendung zwischengespeicherter Ergebnisse zu unterbinden, ü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. Eine Liste der möglichen Werte finden Sie unter QT.

Diese Funktion wurde in Qt 5.0.1 eingeführt.

© 2026 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.