Шаблон подкласса 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
Нечто похожее должно работать с вашим тестовым каталогом.