qt - gui - qhacer paso previo a la compilación antes de cualquier compilación
qt gui (2)
Hay varias preguntas sobre SO acerca de cómo crear un paso de qmake
para qmake
, puedo hacerlo con 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 compilación per se, sino simplemente otro objetivo de compilación, por lo que si tengo el indicador -j
configurado para make
que ejecute mi script en paralelo con los otros trabajos de compilación. Esto es muy malo, porque mi secuencia de comandos crea / actualiza un archivo de encabezado, ya que cambiarlo en parte a través de la compilación no es aceptable.
Entonces, ¿hay alguna forma de ejecutar este script antes de ejecutar cualquier compilación? Sé que puedo crear otro script y llamar a version_getter.py
y qmake
en secuencia a partir de eso, pero esto no es deseable ya que tendría que compilar desde la línea de comandos en lugar de hacerlo desde Qt Creator.
Actualizar
El archivo .pri
completo que se incluye 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 haber sido debido 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 esté al tanto de que versioning.h
es una dependencia para los otros objetivos de compilación en su archivo de proyecto.
- Agregue la ruta completa a
versioning.h
a su variableHEADERS
. - Agregue la carpeta en la que reside
versioning.h
a su variableDEPENDPATH
.
(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
Cree 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 = ..
Cree test.c
contenga lo siguiente:
#include "../versioning.h"
Ejecutar qmake
. Saldrá WARNING: Failure to find: ../versioning.h
.
Ejecuta make -j9
. Ejecutará los comandos de test.c
(que duerme durante 5 segundos para exagerar cualquier problema de multiprocesamiento) y, después de eso, ejecute el comando para compilar test.c
(Y si examinas el Makefile
generado, verás que test.o
depende de test.c
y ../versioning.h
, por lo que Make debe averiguar correctamente que no puede ejecutar el comando para compilar test.c
antes del comando para crear / actualizar ../versioning.h
.)
Use el comando system()
qmake: se ejecuta cuando ejecuta qmake
, lo que sucede antes de make
ejecute cualquier comando de compilación.
win32: PYTHON=python.exe
else: PYTHON=python
system(cd $$PWD; $$PYTHON ./version_getter.py -p ../VersionData/versioning.h)