precio gui creator qt qmake

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 variable HEADERS .
  • Agregue la carpeta en la que reside versioning.h 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

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)