QMake шаблон 'subdirs' - выполнение целевого объекта?
Вопрос
Я собираю систему сборки для своего приложения Qt, используя qmake .файл pro, в котором используется шаблон 'subdirs'.Это отлично работает и позволяет мне указать порядок построения каждой цели, так что зависимости работают хорошо.Однако теперь я добавил в проект инструмент, который генерирует номер версии (содержащий дату сборки, ревизию SVN и т.д.), Который используется основным приложением - я могу сначала создать этот инструмент версии, но когда он будет собран, я хочу выполнить его до создания других целевых объектов (он генерирует заголовочный файл, содержащий номер версии, который включает основное приложение).)
Например, мой простой файл qmake выглядит примерно так:
TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS = version \
lib \
tests \
mainapp
Когда 'version' собрана, я хочу выполнить ее (передав некоторые аргументы в командной строке) перед сборкой 'lib'.
Кто-нибудь знает, возможно ли это?Я вижу, что в qmake есть команда 'system', которая может запускать приложения, но я не знаю, как я мог бы использовать это.
Связанный с этим вопрос касается моих модульных тестов.Они живут в проекте "test" и используют фреймворк qTest.Я хочу выполнить tests exe перед сборкой 'mainapp', и если тесты завершатся неудачей (т.е.исполняемый файл tests не возвращает ноль) Я хочу завершить процесс сборки.
Я понимаю, что qmake предназначен для генерации make-файлов, поэтому, возможно, я здесь немного перегибаю палку, но если кто-нибудь может дать мне несколько советов, это было бы очень кстати.
Решение 2
Я разместил сообщение в списке рассылки Qt Interest о шаге "предварительной сборки", и это можно выполнить, используя комбинацию 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
Сейчас я использую что-то похожее на это, чтобы генерировать номер версии моего приложения каждый раз, когда оно создается.
Другие советы
В настоящее время я использую 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
tests.pro (файл для конкретного проекта)
TARGET = MyUnitTest
HEADERS += MyUnitTest.h
SOURCES += MyUnitTest.cpp main.cpp
include(tests.pri)
Запуск нескольких модульных тестов в одном main()
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
На протяжении многих лет я пытался многое сделать с qmake как системой сборки.В конце концов, я просто прибегнул к этапу, предшествующему qmake.Т. е.сценарий настройки.
Вы можете создать там свой инструмент версии, а затем выполнить его перед вызовом qmake для генерации Makefiles.
Я обнаружил, что самый простой способ перенести данные в файлы pro, если вам это тоже нужно, - сгенерировать файл .pro.inc и включить его из вашего основного pro.
Как 3DH упоминалось, что вы хотите QMAKE_POST_LINK
параметр, указанный в ваших файлах .pro, которые содержат что-то, что вы хотите выполнить.Итак, для вашего примера, я бы сделал что-то подобное с version.pro
файл:
TEMPLATE = app
TARGET = version
HEADERS = version.h
SOURCES = version.cpp
QMAKE_POST_LINK=./version
Что-то подобное должно работать с вашим тестовым каталогом.