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?

War es hilfreich?

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:

  1. Wenn es keine gibt Makefile.pri, dann wird es erstellt;
  2. Wenn Makefile.pri wird dann erstellt oder aktualisiert, dann qmake Läuft erneut und berücksichtigt den Inhalt, wodurch die Wiederherstellung des Makefile

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top