2010-08-31 12 views
13

Wir haben eine ziemlich große Code-Basis. Der Großteil des Codes wird mit qmake kompiliert, um die Makefiles zu erzeugen. Es gibt jedoch einige Unterprojekte, die durch Ausführen von Stapeldateien oder Ausführen anderer Programme erzeugt werden.Ausführen eines Programms/Skripts von QMake

Ich möchte in der Lage sein, alles mit qmake kompiliert zu haben, aber ich kann nicht herausfinden, wie man qmake einfach ein Skript ausführen.

Eine Sache, die ich versucht habe, ist QMAKE_EXTRA_TARGETS in meiner Pro-Datei, etwa so:

TEMPLATE = lib 
SOURCES = placeholder.cpp 
CONFIG += no_link staticlib 
batch_runner.target = placeholder.cpp 
batch_runner.commands = my_batch_file.bat 
QMAKE_EXTRA_TARGETS = batch_runner 

ich dann die Batch-Datei erzeugt placeholder.cpp wie so haben muß:

# do the real work here 
# ... 
# create placeholder.cpp so qmake and nmake are happy 
echo // dummy >> placeholder.cpp 

Das scheint gut zu funktionieren. Das Problem ist, dass es etwas heikel ist. Wenn ich batch_runner.target nicht vorschreibe (d. H. Ich lasse es leer lassen) oder placeholder.cpp nicht in SOURCES setzen, wird die Batchdatei nie ausgeführt. Dies liegt daran, dass qmake Batch_Runner nicht ausführt, um die Aktion für eine andere Abhängigkeit im Makefile auszuführen.

Gibt es eine bessere Möglichkeit, QMake ein Makefile zu erstellen, so dass ein Skript ausgeführt wird, wenn das Makefile ausgeführt wird?

Antwort

14

Es sieht aus wie QMAKE_POST_LINK gut für diese Art der Sache funktioniert.

Dies scheint die Arbeit zu erledigen. my_batch_file.bat wird ausgeführt, wenn nmake ausgeführt wird (und nicht, wenn qmake ausgeführt wird) und ich muss keine seltsamen Aufgaben mit Platzhaltern oder Dateien ausführen.

Es ist sehr wahrscheinlich, dass ich nicht alle der in "CONFIG" aufgelisteten Punkte benötige.

TEMPLATE = lib 
TARGET = 
CONFIG += no_link target_predeps staticlib 

QMAKE_POST_LINK = my_batch_file.bat 
QMAKE_CLEAN  += batch_output.obj 
6

Probieren Sie die system() command. Zum Beispiel:

+1

Interessant. Das funktioniert, aber der Befehl wird ausgeführt, wenn 'qmake' ausgeführt wird und nicht, wenn 'nmake' ausgeführt wird. Es passiert auch, dass es dreimal ausgeführt wird, anstatt einmal ausgeführt zu werden. –

+1

Möglicherweise müssen Sie einen Bereich hinzufügen, um sicherzustellen, dass er nur einmal ausgeführt wird. –

+0

Ich habe dem Beispiel gerade einen Bereich hinzugefügt, so dass der Befehl nur einmal ausgeführt wird, wenn qmake ausgeführt wird. – pixelgrease

1

Sie können die SUBDIRS-Konfiguration verwenden, um mehrere verschiedene Ziele auszuführen, sogar aus demselben Makefile. Dies kann besonders gut mit Ihren zusätzlichen Zielen funktionieren, da eine Unterverzeichniskonfiguration ein bestimmtes Ziel im Makefile zur Ausführung festlegen kann (Details siehe undocumented qmake). In diesem Fall würde ich alle "normalen" Erstellungsbefehle in eine .pro-Datei, die externen Erstellungsbefehle in eine andere und eine Unterdatei mit .pro-Datei einfügen, um alle zu erstellen. Ich habe noch nicht so etwas getestet, aber es sollte funktionieren.

regular.pro:

SOURCES += main.cpp 
TARGET = regular.exe 

external.pro:

batch_runner.commands = my_batch_file.bat 
QMAKE_EXTRA_TARGETS += batch_runner 

other_runner.commands = other_batch_file.bat 
QMAKE_EXTRA_TARGETS += other_runner 

do_it_all.pro:

TEMPLATE = subdirs 
CONFIG += ordered 

regular.file = regular.pro 
SUBDIRS += regular 

batch.file = external.pro 
batch.target = batch_runner 
SUBDIRS += batch 

other.file = external.pro 
other.target = other_runner 
SUBDIRS += other 
+0

Dies hat das gleiche Problem, das ich in meiner ursprünglichen Frage umrissen habe. Das zusätzliche Ziel wird nur ausgeführt, wenn .target angegeben ist (Sie können scheinbar nicht nur die Befehle angeben) und das .target muss tatsächlich von einem anderen Teil des Makefiles benötigt werden, andernfalls wird es nicht ausgeführt. –

5

ist hier eine andere Lösung:

TEMPLATE = aux 
OBJECTS_DIR = ./ 
DESTDIR = ./ 

first.commands = my_batch_file.bat 
QMAKE_EXTRA_TARGETS += first 
QMAKE_CLEAN += batch_output.obj 

Die Vorlage aux produziert im Grunde eine Make-Datei, die nichts tut, wenn ohne Angabe eines Ziel auszuführen.Die Variablen OBJECTS_DIR und DESTDIR werden auf das aktuelle Verzeichnis gesetzt, um zu verhindern, dass qmake die Verzeichnisse debug und release erstellt (es ist wichtig, sie auf ./ und nicht nur auf . zu setzen; zumindest unter Windows). Unter Verwendung von QMAKE_EXTRA_TARGETS definieren wir dann das Ziel first neu, um den benutzerdefinierten Befehl auszuführen, wenn das Makefile ohne Ziel aufgerufen wird.

Es ist ein bisschen hacky, aber es macht die Arbeit erledigt.

Zusatz: Wenn Sie die Erzeugung von drei Makefiles verhindern wollen (Makefile, Makefile.Debug, Makefile.Release), können Sie

CONFIG -= debug_and_release 

jedoch hinzufügen, wenn Sie diese und je nach Verwendung, wie die Make-Datei ist aufgerufen (wird immer manuell aufgerufen, aufgerufen durch die "Unterordner" * .pro Datei des übergeordneten Verzeichnisses, ...), kann es notwendig sein, falsche debug und release Ziele zu erstellen, um Fehler "keine Regel zu vermeiden, um ..." zu vermeiden. Zum Beispiel:

release.target = release 
release-clean.target = release-clean 
release-install.target = release-install 
[...] 
debug.target = debug 
debug-clean.target = debug-clean 
debug-install.target = debug-install 
[...] 
QMAKE_EXTRA_TARGETS += release release-clean release-install [...] 
QMAKE_EXTRA_TARGETS += debug debug-clean debug-install [...]