Pregunta

Estoy armando un sistema de compilación para mi aplicación Qt usando un archivo qmake .pro que usa la plantilla 'subdirectorios'.Esto funciona bien y me permite especificar el orden en que se construye cada objetivo, por lo que las dependencias funcionan bien.Sin embargo, ahora he agregado una herramienta al proyecto que genera un número de versión (que contiene la fecha de compilación, la revisión SVN, etc.) que usa la aplicación principal. Puedo compilar esta herramienta de versión primero, pero cuando esté compilada quiero para ejecutarlo antes de que se creen más objetivos (genera un archivo de encabezado que contiene el número de versión que incluye la aplicación principal).

Por ejemplo, mi archivo qmake simple se parece a esto:

TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS = version \
          lib \
          tests \
          mainapp

Cuando se compila la 'versión', quiero ejecutarla (pasando algunos argumentos en la línea de comandos) antes de compilar la 'lib'.

¿Alguien sabe si esto es posible?Veo que qmake tiene un comando de 'sistema' que puede ejecutar aplicaciones, pero no sé cómo podría aprovecharlo.

Una pregunta relacionada se refiere a mis pruebas unitarias.Estos viven en el proyecto de 'prueba' y utilizan el marco QTest.Quiero ejecutar las pruebas exe antes de compilar 'mainapp' y si las pruebas fallan (es decir,el exe de pruebas no devuelve cero) Quiero salir del proceso de compilación.

Me doy cuenta de que qmake está diseñado para generar archivos MAKE, por lo que puede que esté deseando demasiado aquí, pero si alguien puede darme algunos consejos, sería muy bienvenido.

¿Fue útil?

Solución 2

Me envió un mensaje en la lista de correo de Qt interés sobre el paso a 'construir pre' y se puede hacer usando una combinación de PRE_TARGETDEPS y QMAKE_EXTRA_TARGETS. Aquí está la respuesta:

  

Puede especificar pasos de generación personalizada,   p.ej. esto sería llamar makemyversion.sh   para crear cada vez que myversion.cpp   antes de que se construye algo:

versiontarget.target = myversion.cpp
versiontarget.commands = ./makemyversion.sh
versiontarget.depends = FORCE

PRE_TARGETDEPS += myversion.cpp
QMAKE_EXTRA_TARGETS += versiontarget

Ahora estoy usando algo similar a esto para generar el número de versión de mi aplicación cada vez que se crea.

Otros consejos

Actualmente uso qmake para ejecutar mis pruebas unitarias automáticamente durante dos años y funciona bien.

Eche un vistazo aquí: hice un mini tutorial para eso:

Qt:Pruebas unitarias automatizadas con QMAKE

Resumen abreviado:


Estructura

/myproject/
    myproject.h
    myproject.cpp
    main.cpp
    myproject.pro
/myproject/tests/
    MyUnitTest.h
    MyUnitTest.cpp
    main.cpp
    tests.pro

Usando QMake para ejecutar automáticamente pruebas unitarias en la compilación

El objetivo de QMake QMAKE_POST_LINK ejecutará un comando definido por el usuario después de la vinculación.

tests.pri (archivo común)

TEMPLATE = app
DEPENDPATH += . ../
INCLUDEPATH += . ../
DESTDIR = ./
CONFIG += qtestlib
unix:QMAKE_POST_LINK=./$$TARGET
win32:QMAKE_POST_LINK=$${TARGET}.exe

tests.pro (archivo específico del proyecto)

TARGET = MyUnitTest
HEADERS += MyUnitTest.h
SOURCES += MyUnitTest.cpp main.cpp
include(tests.pri)

Ejecutar múltiples pruebas unitarias en un solo main()

principal.cpp

#include "MyUnitTest1.h"
#include "MyUnitTest2.h"

int main(int argc, char** argv) {
    QApplication app(argc, argv);

    int retval(0);
    retval +=QTest::qExec(&MyTest1(), argc, argv);
    retval +=QTest::qExec(&MyTest2(), argc, argv);

    return (retval ? 1 : 0);
}

Esto ejecuta sus pruebas en cada compilación y se cancela si se encuentra un error.

Nota

Si obtiene errores del vinculador como "LNK2005:xxx ya está definido...", agregue un nuevo archivo .cpp para cada encabezado de clase de prueba y mueva algunas implementaciones de métodos de prueba.


Puede usar exactamente ese mecanismo para ejecutar su herramienta de control de versiones después de compilar/compilar, por lo que sus preguntas deberían resolverse :-)

Si tienes más preguntas no dudes en preguntarme.

PD:Aquí puede encontrar más trucos (no documentados) sobre QMake: QMake indocumentado

He tratado de hacer un montón de cosas con qmake como un sistema de construcción en los últimos años. Con el tiempo me acaba recurrido a tener una etapa de pre-qmake. Es decir. un script de configuración.

Usted puede construir su herramienta de versión de allí y luego ejecutarlo antes de llamar a qmake para generar el Makefile.

He encontrado la manera más fácil de obtener datos en los archivos de pro, si necesita que también, es generar un archivo .pro.inc e incluirlo en su pro principal.

3DH mencionado, usted quiere un opción QMAKE_POST_LINK especificado en sus archivos que contienen .pro algo que desea ejecutar. Así que para su ejemplo, me gustaría hacer algo como esto con el archivo version.pro:

TEMPLATE = app
TARGET = version
HEADERS = version.h
SOURCES = version.cpp
QMAKE_POST_LINK=./version

Algo similar debe trabajar con el directorio de prueba.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top