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 Testfunktionenreplace
prüft nur Ersetzungsfunktionenvar
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.