Erweiterte Verwendung
Hinzufügen neuer Konfigurationsmerkmale
Mit qmake können Sie Ihre eigenen features
erstellen, die in Projektdateien eingefügt werden können, indem Sie ihre Namen der Liste der Werte hinzufügen, die durch die CONFIG-Variable angegeben werden. Features sind Sammlungen von benutzerdefinierten Funktionen und Definitionen in .prf
Dateien, die sich in einem von vielen Standardverzeichnissen befinden können. Die Orte dieser Verzeichnisse sind an verschiedenen Stellen definiert, und qmake überprüft jedes dieser Verzeichnisse in der folgenden Reihenfolge, wenn es nach .prf
Dateien sucht:
- In einem Verzeichnis, das in der Umgebungsvariablen
QMAKEFEATURES
aufgeführt ist, die eine Liste von Verzeichnissen enthält, die durch das Pfadlisten-Trennzeichen der Plattform (Doppelpunkt für Unix, Semikolon für Windows) getrennt sind. - In einem Verzeichnis, das in der Eigenschaftsvariablen
QMAKEFEATURES
aufgeführt ist und eine Liste von Verzeichnissen enthält, die durch das Pfadlisten-Trennzeichen der Plattform getrennt sind. - In einem Feature-Verzeichnis, das sich innerhalb eines
mkspecs
-Verzeichnisses befindet.mkspecs
-Verzeichnisse können sich unter jedem der Verzeichnisse befinden, die in der UmgebungsvariablenQMAKEPATH
aufgeführt sind, die eine Liste von Verzeichnissen enthält, die durch das Pfadlisten-Trennzeichen der Plattform getrennt sind. Zum Beispiel:$QMAKEPATH/mkspecs/<features>
. - In einem Feature-Verzeichnis, das sich unterhalb des Verzeichnisses befindet, das durch die Umgebungsvariable QMAKESPEC bereitgestellt wird. Zum Beispiel:
$QMAKESPEC/<features>
. - In einem Feature-Verzeichnis, das sich im Verzeichnis
data_install/mkspecs
befindet. Zum Beispiel:data_install/mkspecs/<features>
. - In einem Feature-Verzeichnis, das als Geschwisterverzeichnis des durch die Umgebungsvariable
QMAKESPEC
angegebenen Verzeichnisses existiert. Beispiel:$QMAKESPEC/../<features>
.
Die folgenden Feature-Verzeichnisse werden nach Feature-Dateien durchsucht:
features/unix
,features/win32
, oderfeatures/macx
, je nach verwendeter Plattformfeatures/
Betrachten Sie zum Beispiel die folgende Zuordnung in einer Projektdatei:
CONFIG += myfeatures
Mit diesem Zusatz zur Variable CONFIG
sucht qmake nach dem Parsen der Projektdatei an den oben genannten Stellen nach der Datei myfeatures.prf
. Auf Unix-Systemen wird es nach der folgenden Datei suchen:
$QMAKEFEATURES/myfeatures.prf
(für jedes Verzeichnis, das in der UmgebungsvariablenQMAKEFEATURES
aufgeführt ist)$$QMAKEFEATURES/myfeatures.prf
(für jedes Verzeichnis, das in der EigenschaftsvariableQMAKEFEATURES
aufgeführt ist)myfeatures.prf
(im Stammverzeichnis des Projekts). Das Stammverzeichnis des Projekts wird durch die Datei der obersten Ebene.pro
bestimmt. Wenn Sie jedoch die Datei.qmake.cache
in einem Unterverzeichnis oder dem Verzeichnis eines Unterprojekts ablegen, wird das Stammverzeichnis des Projekts zum Unterverzeichnis selbst.$QMAKEPATH/mkspecs/features/unix/myfeatures.prf
und$QMAKEPATH/mkspecs/features/myfeatures.prf
(für jedes in der UmgebungsvariablenQMAKEPATH
aufgeführte Verzeichnis)$QMAKESPEC/features/unix/myfeatures.prf
und$QMAKESPEC/features/myfeatures.prf
data_install/mkspecs/features/unix/myfeatures.prf
unddata_install/mkspecs/features/myfeatures.prf
$QMAKESPEC/../features/unix/myfeatures.prf
und$QMAKESPEC/../features/myfeatures.prf
Hinweis: Die .prf
Dateien müssen Namen in Kleinbuchstaben haben.
Installieren von Dateien
Unter Unix ist es üblich, das Build-Tool auch für die Installation von Anwendungen und Bibliotheken zu verwenden, zum Beispiel durch den Aufruf von make install
. Aus diesem Grund hat qmake das Konzept eines install set
, ein Objekt, das Anweisungen darüber enthält, wie ein Teil eines Projekts zu installieren ist. Zum Beispiel kann eine Sammlung von Dokumentationsdateien auf folgende Weise beschrieben werden:
documentation.path = /usr/local/program/doc documentation.files = docs/*
Der Member path
teilt qmake mit, dass die Dateien in /usr/local/program/doc
(dem Path-Member) installiert werden sollen, und der Member files
gibt die Dateien an, die in das Installationsverzeichnis kopiert werden sollen. In diesem Fall wird alles, was sich im Verzeichnis docs
befindet, nach /usr/local/program/doc
kopiert.
Sobald ein Installationssatz vollständig beschrieben wurde, können Sie ihn mit einer Zeile wie dieser an die Installationsliste anhängen:
INSTALLS += documentation
qmake wird sicherstellen, dass die angegebenen Dateien in das Installationsverzeichnis kopiert werden. Wenn Sie mehr Kontrolle über diesen Prozess benötigen, können Sie auch eine Definition für das extra
Member des Objekts angeben. Die folgende Zeile weist qmake zum Beispiel an, eine Reihe von Befehlen für dieses Installationsset auszuführen:
unix:documentation.extra = create_docs; mv master.doc toc.doc
Der Bereich unix
stellt sicher, dass diese speziellen Befehle nur auf Unix-Plattformen ausgeführt werden. Geeignete Befehle für andere Plattformen können mit anderen Bereichsregeln definiert werden.
Die im Member extra
angegebenen Befehle werden ausgeführt, bevor die Anweisungen in den anderen Membern des Objekts ausgeführt werden.
Wenn Sie einen eingebauten Installationssatz an die Variable INSTALLS
anhängen und keine files
oder extra
Member angeben, wird qmake entscheiden, was für Sie kopiert werden muss. Zurzeit werden die Installationssätze target
und dlltarget
unterstützt. Ein Beispiel:
target.path = /usr/local/myprogram INSTALLS += target
In den obigen Zeilen weiß qmake, was kopiert werden muss, und führt den Installationsprozess automatisch durch.
Hinzufügen von benutzerdefinierten Targets
qmake versucht, alles zu tun, was von einem plattformübergreifenden Build-Tool erwartet wird. Das ist oft nicht ideal, wenn Sie spezielle plattformabhängige Befehle ausführen müssen. Dies kann mit spezifischen Anweisungen an die verschiedenen qmake-Backends erreicht werden.
Die Anpassung der Makefile-Ausgabe erfolgt über eine objektähnliche API, wie sie auch an anderen Stellen in qmake zu finden ist. Objekte werden automatisch definiert, indem man ihre Mitglieder angibt. Ein Beispiel:
mytarget.target = .buildfile mytarget.commands = touch $$mytarget.target mytarget.depends = mytarget2 mytarget2.commands = @echo Building $$mytarget.target
Die obigen Definitionen definieren ein qmake-Target namens mytarget
, das ein Makefile-Target namens .buildfile
enthält, das wiederum mit dem Befehl touch
erzeugt wird. Schließlich gibt das Mitglied .depends
an, dass mytarget
von mytarget2
abhängt, einem anderen Ziel, das danach definiert wird. mytarget2
ist ein Dummy-Ziel. Es wird nur definiert, um einen Text auf der Konsole auszugeben.
Der letzte Schritt besteht darin, die Variable QMAKE_EXTRA_TARGETS
zu verwenden, um qmake mitzuteilen, dass dieses Objekt ein Ziel ist, das gebaut werden soll:
QMAKE_EXTRA_TARGETS += mytarget mytarget2
Das ist alles, was Sie tun müssen, um benutzerdefinierte Targets zu erstellen. Natürlich kann es sein, dass Sie eines dieser Targets mit dem qmake-Build-Target verknüpfen möchten. Um dies zu tun, müssen Sie einfach Ihr Makefile-Target in die Liste der PRE_TARGETDEPS aufnehmen.
Benutzerdefinierte Targetspezifikationen unterstützen die folgenden Member:
Mitglied | Beschreibung |
---|---|
Befehle | Die Befehle zur Erzeugung des benutzerdefinierten Build-Targets. |
CONFIG | Spezifische Konfigurationsoptionen für das benutzerdefinierte Build-Target. Kann auf recursive gesetzt werden, um anzugeben, dass Regeln im Makefile erstellt werden sollen, um das relevante Target innerhalb des Sub-Target-spezifischen Makefiles aufzurufen. Dieses Mitglied erstellt standardmäßig einen Eintrag für jedes der Unterziele. |
abhängig | Die vorhandenen Bauziele, von denen das benutzerdefinierte Bauziel abhängt. |
recurse | Gibt an, welche Unterziele bei der Erstellung der Regeln im Makefile verwendet werden sollen, die im unterzielspezifischen Makefile aufgerufen werden. Dieses Mitglied wird nur verwendet, wenn recursive in CONFIG gesetzt ist. Typische Werte sind "Debug" und "Release". |
recurse_target | Gibt das Ziel an, das über das Unterziel Makefile für die Regel im Makefile gebaut werden soll. Dieses Mitglied fügt etwas wie $(MAKE) -f Makefile.[subtarget] [recurse_target] hinzu. Dieses Mitglied wird nur verwendet, wenn recursive in CONFIG gesetzt ist. |
Ziel | Der Name des benutzerdefinierten Build-Ziels. |
Hinzufügen von Compilern
Es ist möglich, qmake anzupassen, um neue Compiler und Präprozessoren zu unterstützen:
new_moc.output = moc_${QMAKE_FILE_BASE}.cpp new_moc.commands = moc ${QMAKE_FILE_NAME} -o ${QMAKE_FILE_OUT} new_moc.depend_command = g++ -E -M ${QMAKE_FILE_NAME} | sed "s,^.*: ,," new_moc.input = NEW_HEADERS QMAKE_EXTRA_COMPILERS += new_moc
Mit den obigen Definitionen können Sie einen Drop-in-Ersatz für moc verwenden, wenn einer verfügbar ist. Der Befehl wird mit allen Argumenten ausgeführt, die der Variablen NEW_HEADERS
(aus dem Element input
) übergeben werden, und das Ergebnis wird in die Datei geschrieben, die durch das Element output
definiert ist. Diese Datei wird zu den anderen Quelldateien im Projekt hinzugefügt. Zusätzlich führt qmake depend_command
aus, um Abhängigkeitsinformationen zu generieren und legt diese Informationen ebenfalls im Projekt ab.
Benutzerdefinierte Compiler-Spezifikationen unterstützen die folgenden Member:
Mitglied | Beschreibung |
---|---|
Befehle | Die Befehle, die für die Generierung der Ausgabe aus der Eingabe verwendet werden. |
CONFIG | Spezifische Konfigurationsoptionen für den benutzerdefinierten Compiler. Siehe die Tabelle CONFIG für Details. |
depend_befehl | Gibt einen Befehl an, der verwendet wird, um die Liste der Abhängigkeiten für die Ausgabe zu erstellen. |
dependency_type | Gibt an, um welchen Dateityp es sich bei der Ausgabe handelt. Handelt es sich um einen bekannten Typ (z. B. TYPE_C, TYPE_UI, TYPE_QRC), wird sie als eine dieser Dateien behandelt. |
hängt | Gibt die Abhängigkeiten der Ausgabedatei an. |
Eingabe | Die Variable, die die Dateien angibt, die mit dem benutzerdefinierten Compiler verarbeitet werden sollen. |
name | Eine Beschreibung dessen, was der benutzerdefinierte Compiler tut. Dies wird nur in einigen Backends verwendet. |
Ausgabe | Der Dateiname, der vom benutzerdefinierten Compiler erzeugt wird. |
ausgabe_funktion | Gibt eine benutzerdefinierte qmake-Funktion an, die zur Angabe des zu erstellenden Dateinamens verwendet wird. |
Variablen | Gibt an, dass die hier angegebenen Variablen durch $(QMAKE_COMP_VARNAME) ersetzt werden, wenn sie in der pro-Datei als $(VARNAME) bezeichnet werden. |
variable_out | Die Variable, zu der die aus der Ausgabe erstellten Dateien hinzugefügt werden sollen. |
Das CONFIG-Mitglied unterstützt die folgenden Optionen:
Option | Beschreibung |
---|---|
kombinieren | Gibt an, dass alle Eingabedateien in einer einzigen Ausgabedatei zusammengefasst werden. |
target_predeps | Gibt an, dass die Ausgabe in die Liste der PRE_TARGETDEPS aufgenommen werden soll. |
explicit_dependencies | Die Abhängigkeiten für die Ausgabe werden nur aus dem depends-Mitglied generiert und nirgendwo sonst. |
dep_existing_only | Jede Abhängigkeit, die ein Ergebnis von .depend_command ist, wird auf Existenz geprüft. Nicht existierende Abhängigkeiten werden ignoriert. Dieser Wert wurde in Qt 5.13.2 eingeführt. |
dep_lines | Die Ausgabe von .depend_command wird als eine Datei pro Zeile interpretiert. Die Vorgabe ist die Aufteilung in Leerzeichen und wird nur aus Gründen der Abwärtskompatibilität beibehalten. |
no_link | Gibt an, dass die Ausgabe nicht in die Liste der einzubindenden Objekte aufgenommen werden soll. |
Abhängigkeiten von Bibliotheken
Oft verlässt sich qmake beim Linken gegen eine Bibliothek darauf, dass die zugrundeliegende Plattform weiß, gegen welche anderen Bibliotheken diese Bibliothek linkt, und lässt die Plattform diese einbinden. In vielen Fällen ist dies jedoch nicht ausreichend. Wenn zum Beispiel eine Bibliothek statisch gelinkt wird, werden keine anderen Bibliotheken gelinkt und somit auch keine Abhängigkeiten zu diesen Bibliotheken erzeugt. Eine Anwendung, die später gegen diese Bibliothek linkt, muss jedoch wissen, wo die Symbole zu finden sind, die die statische Bibliothek benötigt. qmake versucht, die Abhängigkeiten einer Bibliothek gegebenenfalls zu verfolgen, wenn Sie das Tracking explizit aktivieren.
Der erste Schritt besteht darin, die Verfolgung von Abhängigkeiten in der Bibliothek selbst zu aktivieren. Dazu müssen Sie qmake anweisen, Informationen über die Bibliothek zu speichern:
CONFIG += create_prl
Dies ist nur für das lib
Template relevant und wird für alle anderen ignoriert. Wenn diese Option aktiviert ist, erstellt qmake eine Datei mit der Endung .prl, die einige Meta-Informationen über die Bibliothek speichert. Diese Metadatei ist genau wie eine gewöhnliche Projektdatei, enthält aber nur interne Variablendeklarationen. Wenn Sie diese Bibliothek installieren, indem Sie sie als Ziel in einer INSTALLS-Deklaration angeben, kopiert qmake die .prl-Datei automatisch in den Installationspfad.
Der zweite Schritt in diesem Prozess besteht darin, das Lesen dieser Metainformationen in den Anwendungen zu aktivieren, die die statische Bibliothek verwenden:
CONFIG += link_prl
Wenn dies aktiviert ist, verarbeitet qmake alle Bibliotheken, die von der Applikation gelinkt werden, und findet deren Meta-Informationen. qmake verwendet diese, um die relevanten Linking-Informationen zu bestimmen, insbesondere um Werte zur Liste der DEFINES und LIBS in der Projektdatei der Applikation hinzuzufügen. Sobald qmake diese Datei verarbeitet hat, durchsucht es die neu hinzugefügten Bibliotheken in der Variable LIBS
und findet deren abhängige .prl-Dateien, bis alle Bibliotheken aufgelöst sind. An diesem Punkt wird das Makefile wie üblich erstellt, und die Bibliotheken werden explizit mit der Anwendung gelinkt.
Die .prl-Dateien sollten nur von qmake erstellt werden und nicht zwischen Betriebssystemen übertragen werden, da sie plattformabhängige Informationen enthalten können.
© 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.