qmake regole per il codice generato
Domanda
ho capito la mia precedente domanda era un po 'confuso circa le regole e le dipendenze. Il seguente file .pro genera un makefile che funziona correttamente se esistono i file di origine nella directory 'generato', presso le piste QMake tempo.
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
Ma quando qmake corre, il suo solo generare un makefile, e PRE_TARGETDEPS & QMAKE_EXTRA_UNIX_TARGETS non mi aiuti. Come posso ottenere qmake per generare un makefile che aggiungerà i contenuti di generata / a fonti?
Soluzione
Potrebbe essere necessario farlo in due passaggi.
Nel file qmake, aggiungere la seguente riga:
include( generated/generated.pri )
Poi, alla fine dello script code_generator, aggiungere le fonti al file generated.pri (usando bash per l'esempio, ma l'idea è la stessa per quasi tutte le lingue):
rm generated/generated.pri
for file in $( ls generated/*.cpp ); do
echo "SOURCES += ${file}" >> generated/generated.pri
done
La prima volta che si esegue il file qmake, generato / generated.pri sarà presumibile vuoto. Quando si esegue fare, si popolerà il file generated.pri. La seconda volta, verrà ricreare il file make (come modificato un file .pri di origine), quindi compilare di nuovo. Potreste essere in grado di smanettare con altri comandi che farebbero la seconda fase per voi.
Altri suggerimenti
Ho avuto lo stesso problema in questo momento, ma per un caso d'uso più semplice di un solo file generato. Per questo, ho trovato un modo molto più semplice per raggiungere questo obiettivo utilizzando GENERATED_SOURCES invece di FONTI:
dummyfile.target = dummy.cpp dummyfile.commands = touch $$dummyfile.target QMAKE_EXTRA_TARGETS += dummyfile GENERATED_SOURCES += $$dummyfile.target
Probabilmente si poteva spingere che in un ciclo qmake e generare gli obiettivi corrette per più file pure.
I è venuta in mente una soluzione che credo di essere robusto e generale, che si basa su qmake
generazione di un GNU Makefile.
dire che abbiamo ottenuto tutte le assegnazioni SOURCES
e HEADERS
extra in un file chiamato Makefile.pri
, che viene generato eseguendo il generate_Makefile.pri.sh
script che genera anche le fonti e / o le intestazioni di cui Makefile.pri
.
Vogliamo che questo file automaticamente e in modo affidabile generata dal sistema di compilazione stesso, in modo da includere nel file .pro
, in modo che qmake
può prendere in considerazione il suo contenuto e generare il Makefile con le dipendenze corrette.
Questa è allora quello che dobbiamo mettere nel nostro file .pro
.
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
In questo modo:
- se non c'è
Makefile.pri
, allora viene creato; - Se
Makefile.pri
viene creato o aggiornato, quindiqmake
corre ancora e tiene conto del suo contenuto, la rigenerazione delMakefile
Come detto, questo non dipendono qmake
generare un GNU Makefile, ma lo stesso approccio Credo potrebbe essere adattato per funzionare anche con altri sistemi di generazione di destinazione.