2010-01-05 20 views
8

Ich erkannte, meine frühere Frage war ein wenig verwirrt über die Regeln und Abhängigkeiten. Die folgende .pro-Datei generiert ein Makefile, das korrekt funktioniert, wenn die Quelldateien im Verzeichnis 'generated' zum Zeitpunkt der Ausführung von qmake vorhanden sind.Qmake Regeln für generierten Code

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 läuft, es ist nur eine Make-Datei zu erzeugen, und PRE_TARGETDEPS & QMAKE_EXTRA_UNIX_TARGETS hilft mir nicht. Wie kann ich qmake dazu bringen, ein Makefile zu generieren, das den Inhalt von generated/zu SOURCES hinzufügt?

Antwort

5

Möglicherweise müssen Sie dies in zwei Durchgängen tun.

In Ihrer qmake-Datei die folgende Zeile:

include(generated/generated.pri) 

Dann am Ende Ihres code_generator Skript, fügen Sie die Quellen an die generated.pri Datei (bash für das Beispiel verwendet, aber die Idee für fast alle Sprachen gleich):

rm generated/generated.pri 
for file in $(ls generated/*.cpp); do 
    echo "SOURCES += ${file}" >> generated/generated.pri 
done 

das erste Mal, wenn Sie die qmake Datei ausführen, generiert/generated.pri vermutlich leer. Wenn Sie make ausführen, wird die generated.pri-Datei gefüllt. Beim zweiten Mal wird die make-Datei neu erstellt (als geänderte Quell-PRI-Datei) und anschließend erneut kompiliert. Sie können vielleicht mit anderen Befehlen herumspielen, die die zweite Stufe für Sie tun würden.

+0

Danke - Ich endete damit, den Generator zwingt, während qmake mit System ($$ idl.commands) zu laufen. Das erzeugte Makefile ist korrekt und da ich die Ausgabe zum Ziel hinzugefügt habe, tut es wirklich nichts weh. – swarfrat

4

Ich hatte das gleiche Problem gerade jetzt, aber für eine einfachere Verwendung nur einer einzigen generierten Datei. Dafür fand ich einen viel einfacheren Weg, dies zu erreichen, indem GENERATED_SOURCES statt Quellen:

 
dummyfile.target = dummy.cpp 
dummyfile.commands = touch $$dummyfile.target 
QMAKE_EXTRA_TARGETS += dummyfile 
GENERATED_SOURCES += $$dummyfile.target 

Wahrscheinlich schieben konnte man das in eine Qmake Schleife und erzeugt die richtigen Ziele für mehrere Dateien als auch.

+0

+ PRE_TARGET_DEPENDS + = Dummydatei – arved

0

Ich habe eine Lösung gefunden, die ich für robust und allgemein halte, die auf qmake beruht, die ein GNU-Makefile erzeugt.

Sagen wir alle zusätzliche SOURCES und HEADERS Zuweisungen in einer Datei namens Makefile.pri haben, die generate_Makefile.pri.sh durch Ausführen des Skript generiert wird, die in Makefile.pri erzeugt auch die genannten Quellen und/oder Header.

Wir wollen diese Datei automatisch und zuverlässig vom Build-System selbst generiert, so dass sie in die Datei .pro aufgenommen werden, so dass qmake ihren Inhalt berücksichtigen und das Makefile mit den entsprechenden Abhängigkeiten generieren kann.

Dies ist dann, was wir in unsere Datei .pro setzen müssen.

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 

Auf diese Weise:

  1. , wenn es keine Makefile.pri ist, dann wird es erstellt;
  2. Wenn Makefile.pri wird erstellt oder aktualisiert werden, dann qmake läuft wieder und berücksichtigt deren Inhalt, die besagten Makefile

Als Regenerieren dieser abhängt auf qmake eine GNU Makefile zu erzeugen, aber das gleiche ich Ansatz Glauben könnte angepasst werden, um auch mit anderen Ziel-Build-Systemen zu arbeiten.

Verwandte Themen