Шаблон подкласса QMake - выполнение цели?

Я собираю систему сборки для моего приложения Qt, используя файл qmake.pro, который использует шаблон "subdirs". Это отлично работает и позволяет мне указать порядок создания каждой цели, поэтому зависимости работают хорошо. Однако теперь я добавил инструмент для проекта, который генерирует номер версии (содержащий дату сборки, версию SVN и т.д.), Которая используется основным приложением - я могу сначала создать этот инструмент версии, но когда он будет построен, я хочу для его выполнения до создания каких-либо других целей (он генерирует заголовочный файл, содержащий номер версии, который включает основное приложение.)

Например, мой простой файл qmake выглядит примерно так:

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

Когда "версия" построена, я хочу ее выполнить (передавая некоторые аргументы в командной строке) до того, как будет создан "lib".

Кто-нибудь знает, возможно ли это? Я вижу, что qmake имеет команду "system", которая может выполнять приложения, но я не знаю, как я мог бы использовать это.

Связанный с этим вопрос касается моих модульных тестов. Они живут в проекте "тест" и используют инфраструктуру QTest. Я хочу выполнить тесты exe перед созданием "mainapp", и если тесты не сработают (т.е. Тесты exe не возвращают ноль), я хочу выйти из процесса сборки.

Я понимаю, что qmake предназначен для создания make файлов, поэтому я, возможно, очень хочу здесь слишком многого, но если кто-нибудь может дать мне несколько указателей, это будет очень желанно.

Ответ 1

Я разместил сообщение в списке рассылки Qt Interest о шаге "pre build", и это можно сделать, используя комбинацию PRE_TARGETDEPS и QMAKE_EXTRA_TARGETS. Вот ответ:

Вы можете указать пользовательские шаги сборки, например. это вызовет makemyversion.sh создавать myversion.cpp каждый раз прежде чем он что-то создаст:

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

PRE_TARGETDEPS += myversion.cpp
QMAKE_EXTRA_TARGETS += versiontarget

Теперь я использую что-то похожее, чтобы генерировать номер версии приложения каждый раз, когда он построен.

Ответ 2

В настоящее время я использую qmake для автоматического тестирования модульных тестов в течение двух лет - и он отлично работает.

Посмотрите здесь - я сделал мини-такто для этого:

Qt: Автоматизированные тесты устройств с QMAKE

Сокращенное резюме:


Структура

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

Использование QMake для автоматического запуска модульных тестов при сборке

Задача QMake QMAKE_POST_LINK будет запускать пользовательскую команду после компоновки.

tests.pri(общий файл)

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

test.pro(файл, специфичный для проекта)

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

Выполнение нескольких модульных тестов в одном основном()

main.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);
}

Это запускает тесты для каждой сборки и прерывает, если обнаружена ошибка.

Примечание

Если вы получаете ошибки компоновщика, такие как "LNK2005: xxx уже определены...", добавьте новый .cpp файл для каждого заголовка тестового класса и переместите некоторые реализации тестового метода.


Вы можете использовать именно этот механизм для выполнения вашего инструмента управления версиями после компиляции/сборки - поэтому ваши вопросы должны быть решены: -)

Если у вас есть дополнительные вопросы, не стесняйтесь спрашивать меня.

PS: Здесь вы можете найти больше (недокументированных) трюков вокруг QMake: Недокументированный QMake

Ответ 3

Я пытаюсь сделать много вещей с qmake в качестве системы сборки на протяжении многих лет. В конце концов я просто прибегал к тому, чтобы сделать шаг до qmake. То есть. a configure script.

Вы можете создать свой инструмент версии там, а затем выполнить его перед вызовом qmake для создания Make файлов.

Я нашел самый простой способ получить данные в файлах pro, если вам это тоже нужно - создать файл .pro.inc и включить его из основного pro.

Ответ 4

Как упоминалось 3DH, вам нужна опция QMAKE_POST_LINK, указанная в ваши файлы .pro, содержащие что-то, что вы хотите выполнить. Поэтому для вашего примера я бы сделал что-то вроде этого с файлом version.pro:

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

Нечто похожее должно работать с вашим тестовым каталогом.