2010-01-05 18 views
8

Ho realizzato che la mia precedente domanda era un po 'confusa riguardo le regole e le dipendenze. Il seguente file .pro genera un makefile che funziona correttamente SE i file sorgente nella directory 'generate' esistono al momento dell'esecuzione di qmake.qmake regole per codice generato

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 generando un makefile, e PRE_TARGETDEPS & QMAKE_EXTRA_UNIX_TARGETS non mi aiutano. Come posso ottenere qmake per generare un makefile che aggiungerà il contenuto di generato/a SOURCES?

risposta

5

Potrebbe essere necessario effettuare questa operazione in due passaggi.

Nel file qmake, aggiungere la seguente riga:

include(generated/generated.pri) 

Poi, alla fine dello script code_generator, aggiungere le fonti per il 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, generata/generated.pri sarà presumibilmente essere vuoto. Quando esegui make, popolerà il file generate.pri. La seconda volta, verrà ricreato il file make (come file .pri di origine modificato), quindi verrà nuovamente compilato. Potresti essere in grado di giocherellare con altri comandi che farebbero il secondo stadio per te.

+0

Grazie - Ho finito per forzare il generatore a funzionare durante qmake usando il sistema ($$ idl.commands). Il makefile che genera è corretto e dal momento che ho aggiunto l'output al target non fa davvero male a nessuno. – swarfrat

4

Ho avuto lo stesso problema solo ora, ma per un semplice utilizzo 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.

+0

+ PRE_TARGET_DEPENDS + = dummyfile – arved

0

Ho trovato una soluzione che ritengo sia solida e generale, che si basa su qmake che genera un Makefile GNU.

dire che abbiamo avuto tutto extra SOURCES e HEADERS incarichi in un file chiamato Makefile.pri, che viene generato eseguendo lo script generate_Makefile.pri.sh che genera anche le fonti e/o le intestazioni di cui Makefile.pri.

Vogliamo questo file generato automaticamente e in modo affidabile dal sistema di compilazione stesso, in modo da essere incluso nel file .pro, in modo che qmake possa prendere in considerazione il suo contenuto e generare il Makefile con le dipendenze appropriate.

Questo è quindi ciò che dobbiamo inserire 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 

questo modo:

  1. se non c'è Makefile.pri, allora viene creato;
  2. Se Makefile.pri viene creato o aggiornato, quindi qmake corre ancora e tiene conto del suo contenuto, rigenerando i Makefile

Come detto, questo fa dipende qmake generazione di un GNU Makefile, ma lo stesso approccio che ho credo che potrebbe essere adattato per funzionare anche con altri sistemi di costruzione di destinazione.

Problemi correlati