qmake pre-build step before ANY compilation

Ci sono diverse domande su SO su come creare un passo di pre-build per qmake , posso farlo con questo nel mio file .pro :

 versionTarget.target = ../VersionData/versioning.h versionTarget.depends = FORCE win32: versionTarget.commands = cd $$PWD; python.exe ./version_getter.py -p $$TARGET else: versionTarget.commands = cd $$PWD; python ./version_getter.py -p $$TARGET PRE_TARGETDEPS += ../VersionData/versioning.h QMAKE_EXTRA_TARGETS += versionTarget 

Ora, il problema è che questo approccio non è un passo di costruzione di per sé ma solo un altro objective di costruzione, quindi se ho il flag -j configurato per make esegue il mio script in parallelo con gli altri lavori di compilazione. Questo è molto brutto, perché il mio script crea / aggiorna un file di intestazione – facendolo cambiare parzialmente nella compilation non è accettabile.

Quindi, c’è comunque che io possa avere questo script eseguito prima che venga eseguita una compilation? So di poter creare un altro script e chiamare in questo modo version_getter.py e qmake , ma ciò non è desiderabile in quanto dovrei compilare dalla riga di comando anziché da Qt Creator.


Aggiornare

Il file .pri completo incluso in ognuno dei miei sotto-progetti è il seguente:

 CONFIG += thread QT += core \ gui versionTarget.target = ../VersionData/versioning.h versionTarget.depends = FORCE win32: versionTarget.commands = cd $$PWD; python.exe ./version_getter.py -p $$TARGET else: versionTarget.commands = cd $$PWD; python ./version_getter.py -p $$TARGET PRE_TARGETDEPS += ../VersionData/versioning.h QMAKE_EXTRA_TARGETS += versionTarget DEPENDPATH += ../VersionData INCLUDEPATH += ../VersionData HEADERS += ../VersionData/versioning.h UI_HEADERS_DIR = $${_PRO_FILE_PWD_}/include/Qui DESTDIR = $(SYREN_PATH) !win32-msvc { QMAKE_CXXFLAGS += -std=c++0x } 

Ma questo si traduce ancora nello stesso comportamento parallelo. Pensavo che potesse essere dovuto al mio uso di ccache , ma distriggersrlo non ha fatto differenza (oltre ad essere molto più lento, ovviamente).

Un’altra opzione potrebbe essere quella di iniziare con lo snippet di file di progetto nella domanda originale, e inoltre assicurarsi che qmake sia consapevole che versioning.h è una dipendenza per gli altri target di build nel file di progetto –

  • Aggiungi il percorso completo a versioning.h alla variabile HEADERS .
  • Aggiungi la cartella in cui versioning.h risiede nella variabile DEPENDPATH .

(Attenzione: se esegui qmake quando versioning.h non esiste, emetterà “WARNING: Failure to find: versioning.h” – l’unica soluzione per questo avviso è di usare il comando system() , come descritto in la mia altra risposta.)

Esempio

Creare test.pro contenente quanto segue:

 versionTarget.target = ../versioning.h versionTarget.depends = FORCE versionTarget.commands = sleep 5s ; touch ../versioning.h PRE_TARGETDEPS += ../versioning.h QMAKE_EXTRA_TARGETS += versionTarget SOURCES = test.c HEADERS = ../versioning.h DEPENDPATH = .. 

Creare test.c contenente quanto segue:

 #include "../versioning.h" 

Esegui qmake . WARNING: Failure to find: ../versioning.h .

Esegui make -j9 . versionTarget.commands (che dorme per 5 secondi per esagerare i problemi di multiprocessing) e, dopo averlo fatto, lancia il comando per compilare test.c

(E se esaminate il Makefile generato, vedrete che test.o dipende da test.c e ../versioning.h , quindi Make dovrebbe capire correttamente che non può eseguire il comando per compilare test.c prima del comando per creare / aggiornare ../versioning.h .)

Usa il comando system() qmake – viene eseguito quando esegui qmake , cosa che accade prima che make esegua qualsiasi comando di build.

 win32: PYTHON=python.exe else: PYTHON=python system(cd $$PWD; $$PYTHON ./version_getter.py -p ../VersionData/versioning.h)