2013-08-05 13 views
11

Sto creando obiettivi aggiuntivi utilizzando qmake e sto provando a fare due cose contemporaneamente: creare una nuova cartella e copiare una DLL in quella cartella. Entrambe le azioni separate funzionano bene, ma i due insieme non funzionano.Come eseguire più comandi con una destinazione aggiuntiva in QMake

something.target = this 

# This works: 
# something.commands = mkdir newFolder 
# This works too (if newFolder exists) 
# something.commands = copy /Y someFolder\\file.dll newFolder 

# This doesn't work: 
something.commands = mkdir newFolder; \ 
        copy /Y someFolder\\file.dll newFolder 

QMAKE_EXTRA_TARGETS += something 
PRE_TARGETDEPS += this 

Ho pensato che questo era la sintassi destra (ho trovato esempi simili, per esempio here e here), ma sto ottenendo il seguente errore:

> mkdir newFolder; copy /Y someFolder\\file.dll newFolder 
> The syntax of the command is incorrect. 

è la sintassi differente su differenti piattaforme o qualcosa ? Sto lavorando su Windows 7, con Qt 5.0.1.

risposta

16

Il valore della variabile .commands viene incollato al posto dei comandi di destinazione in Makefile per qmake così com'è. qmake rimuove gli spazi bianchi dai valori e li trasforma in spazi singoli, quindi è impossibile creare un valore multilinea senza uno strumento speciale. E c'è lo strumento: function escape_expand. Prova questo:

something.commands = mkdir newFolder $$escape_expand(\n\t) copy /Y someFolder\\file.dll newFolder 

$$escape_expand(\n\t) aggiunge carattere di nuova riga (termina comando precedente) e comincia comando successivo con un carattere di tabulazione come Makefile dettami di sintassi.

+0

Fantastico, funziona come un fascino! Ma per curiosità: c'è una ragione per cui altri thread sembrano impiegare il '; \ 'come interruzione di riga senza problemi. Questa piattaforma è dipendente? – Yellow

+0

Potrebbe essere una funzione specifica della shell per unire più comandi in uno solo. Su Windows e & funzionerebbe con la shell cmd standard per esempio. Non conosco shell unix-like abbastanza bene da rispondere con certezza. –

+0

@SergeySkoblikov: Sotto Unix, anche '&&' dovrebbe funzionare -> esegue il secondo comando dopo il primo, ma solo nel caso in cui il primo sia stato completato con successo. Solo '&' eseguirà comunque il secondo comando. Sembra essere lo stesso sotto Windows? – mozzbozz

3

L'operatore e funziona anche per me su Linux e stranamente su Windows.

something.commands = mkdir newFolder && copy /Y someFolder\\file.dll newFolder 
Problemi correlati