QMAKE -Regeln für generierten Code
Frage
Ich erkannte, dass meine frühere Frage ein wenig verwirrt über die Regeln und Abhängigkeiten war. Die folgende .Pro -Datei generiert ein Makefile, das korrekt funktioniert, wenn die Quelldateien im Verzeichnis 'generiert' zum Zeitpunkt des Ausführens von QMake vorhanden sind.
idl.target = generated/qmtest.h
idl.commands = code_generator
idl.config = no_link
idl.depends = $$SOURCES $$HEADERS $$FORMS
TEMPLATE = app
INCLUDEPATH += generated
SOURCES += generated/*.cpp
PRE_TARGETDEPS += generated/qmtest.h
QMAKE_EXTRA_UNIX_TARGETS += idl
Aber wenn QMake ausgeführt wird, generiert es nur ein Makefile und Pre_TargetDeps & QMake_Extra_unix_Targets helfen mir nicht. Wie kann ich QMake dazu bringen, ein Makefile zu generieren, das den Inhalt der generierten/ zu Quellen hinzufügt?
Lösung
Möglicherweise müssen Sie dies in zwei Pässen tun.
Fügen Sie in Ihrer QMake -Datei die folgende Zeile hinzu:
include( generated/generated.pri )
Fügen Sie dann am Ende Ihres Scripts code_generator die Quellen zur Datei generated.Pri hinzu (mit Bash für das Beispiel, aber die Idee ist für fast alle Sprachen gleich):
rm generated/generated.pri
for file in $( ls generated/*.cpp ); do
echo "SOURCES += ${file}" >> generated/generated.pri
done
Wenn Sie die QMake -Datei zum ersten Mal ausführen, generiert/generiert.Pri wird vermutlich leer sein. Wenn Sie ausführen, wird die Datei generated.Pri fopuliert. Beim zweiten Mal wird die Datei machen (als Quelle .Pri -Datei geändert) und dann erneut kompilieren. Möglicherweise können Sie mit anderen Befehlen herumspielen, die die zweite Stufe für Sie ausführen würden.
Andere Tipps
Ich hatte gerade das gleiche Problem, aber für eine einfachere Verwendung einer einzigen generierten Datei. Dafür fand ich eine viel einfachere Möglichkeit, dies zu erreichen, indem ich generated_sources anstelle von Quellen verwendet habe:
dummyfile.target = dummy.cpp dummyfile.commands = touch $$dummyfile.target QMAKE_EXTRA_TARGETS += dummyfile GENERATED_SOURCES += $$dummyfile.target
Wahrscheinlich könnte man das in eine QMake -Schleife drücken und auch die richtigen Ziele für mehrere Dateien generieren.
Ich habe eine Lösung entwickelt, von der ich glaube, dass sie robust und allgemein ist, auf die sich abhängt qmake
Erzeugen eines GNU Makefile.
Sagen wir, wir haben alles extra SOURCES
und HEADERS
Zuweisungen in einer Datei mit dem Namen Makefile.pri
, was durch Ausführen des Skripts generiert wird generate_Makefile.pri.sh
Das erzeugt auch die in genannten Quellen und/oder Header in Makefile.pri
.
Wir möchten, dass diese Datei automatisch und zuverlässig vom Build -System selbst generiert wird, um in die enthalten zu sein .pro
Datei, damit das qmake
kann seinen Inhalt berücksichtigen und das Makefile mit den richtigen Abhängigkeiten generieren.
Dies ist dann das, was wir in unsere setzen müssen .pro
Datei.
Makefile_pri.target = Makefile.pri
Makefile_pri.commands = generate_Makefile.pri.sh
Makefile_pri.depends = FORCE
Makefile.target = $$MAKEFILE
Makefile.depends = Makefile_pri
include($$Makefile_pri.target)
QMAKE_EXTRA_TARGETS = Makefile Makefile_pri
Diesen Weg:
- Wenn es keine gibt
Makefile.pri
, dann wird es erstellt; - Wenn
Makefile.pri
wird dann erstellt oder aktualisiert, dannqmake
Läuft erneut und berücksichtigt den Inhalt, wodurch die Wiederherstellung desMakefile
Wie gesagt, das tut darauf ankommen qmake
Ein GNU -Makefile generieren, aber der gleiche Ansatz, den ich glaube, könnte an die Arbeit mit anderen Zielaufbausystemen angepasst werden.