qmake paso previo a la comstackción antes de CUALQUIER comstackción

Hay varias preguntas sobre SO sobre cómo crear un paso previo a la comstackción para qmake , puedo hacerlo con esto en mi archivo .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 

Ahora, el problema es que este enfoque no es un paso de comstackción per se sino solo otro objective de comstackción, por lo que si tengo configurado el -j para que ejecute mi secuencia de comandos en paralelo con las otras tareas de comstackción. Esto es muy malo, porque mi secuencia de comandos crea / actualiza un archivo de encabezado; no es aceptable cambiarlo en parte a través de la comstackción.

Entonces, ¿hay alguna manera de que pueda ejecutar este script antes de ejecutar cualquier comstackción? Sé que puedo crear otro script y llamar el version_getter.py y el qmake en secuencia a partir de eso, pero esto no es deseable ya que tendría que comstackr desde la línea de comandos en lugar de desde Qt Creator.


Actualizar

El archivo .pri completo que está incluido en cada uno de mis subproyectos se encuentra a continuación:

 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 } 

Pero esto todavía resulta en el mismo comportamiento paralelo. Pensé que podría deberse a mi uso de ccache , pero apagarlo no hizo ninguna diferencia (aparte de ser mucho más lento, por supuesto).

Otra opción sería comenzar con el fragmento de archivo del proyecto en su pregunta original, y también asegurarse de que qmake sepa que versioning.h es una dependencia para los otros objectives de comstackción en su archivo de proyecto.

  • Agregue la ruta completa a versioning.h a su variable HEADERS .
  • Agregue la carpeta en la que versioning.h reside a su variable DEPENDPATH .

(Advertencia: si ejecuta qmake cuando versioning.h no existe, emitirá “ADVERTENCIA: no se encuentra: versioning.h”; la única solución para esa advertencia es usar el comando system() , como describí en mi otra respuesta.)

Ejemplo

Crea test.pro contenga lo siguiente:

 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 = .. 

Crea test.c contenga lo siguiente:

 #include "../versioning.h" 

Ejecuta qmake . Saldrá WARNING: Failure to find: ../versioning.h .

Ejecuta make -j9 . Ejecutará versionTarget.commands (que duerme durante 5 segundos para exagerar cualquier problema de multiprocesamiento) y, una vez hecho esto, ejecuta el comando para comstackr test.c

(Y si examina el test.o Makefile generado, verá que test.o depende tanto de test.c como de ../versioning.h , por lo que Make debería descubrir correctamente que no puede ejecutar el comando para comstackr test.c antes del comando para crear / actualizar ../versioning.h )

Use el comando system() qmake – se ejecuta cuando ejecuta qmake , lo que ocurre antes de que make ejecute los comandos de comstackción.

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