Qmake' subdirs ' template-выполнение цели?
Я собираю систему сборки для своего приложения Qt с помощью qmake .pro файл, который использует шаблон "субдиры". Это отлично работает и позволяет мне указать порядок построения каждой цели, поэтому зависимости работают хорошо. Тем не менее, теперь я добавил инструмент в проект, который генерирует номер версии (содержащий дату сборки, редакцию SVN и т. д.), который используется основным приложением - я могу сначала создать этот инструмент версии, но когда он будет построен, я хочу выполнить его до того, как появятся новые цели встроенный (он генерирует файл заголовка, содержащий номер версии, который включает в себя основное приложение.)
например, мой простой файл qmake выглядит примерно так:
TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS = version
lib
tests
mainapp
когда "версия" построена, я хочу выполнить ее (передав некоторые аргументы в командной строке) перед построением "lib".
кто-нибудь знает, возможно ли это? Я вижу, что qmake имеет "системную" команду, которая может выполнять приложения, но я не знаю, как я мог бы использовать это.
A связанный вопрос касается моих модульных тестов. Они живут в проекте "test" и используют структуру QTest. Я хочу выполнить тесты exe перед построением "mainapp", и если тесты терпят неудачу (т. е. тесты exe не возвращают ноль), я хочу выйти из процесса сборки.
Я понимаю, что qmake предназначен для создания makefiles, поэтому я могу пожелать немного слишком много здесь, но если кто-нибудь может дать мне несколько указателей, это было бы очень приятно.
4 ответов
в настоящее время я использую qmake для автоматического выполнения модульных тестов в течение двух лет - и он работает нормально.
посмотрите здесь - я сделал мини-howto для этого:
Qt: автоматизированные модульные тесты с QMAKE
сокращенный резюме:
структура
/myproject/
myproject.h
myproject.cpp
main.cpp
myproject.pro
/myproject/tests/
MyUnitTest.h
MyUnitTest.cpp
main.cpp
tests.pro
использование QMake для автоматического запуска модульных тестов на build
цель QMake QMAKE_POST_LINK будет запускать пользовательскую команду после связывающий.
тесты.при (общий файл)
TEMPLATE = app
DEPENDPATH += . ../
INCLUDEPATH += . ../
DESTDIR = ./
CONFIG += qtestlib
unix:QMAKE_POST_LINK=./$$TARGET
win32:QMAKE_POST_LINK=$${TARGET}.exe
тесты.про (проект-конкретный файл)
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
я опубликовал сообщение в списке рассылки Qt Interest о шаге "pre build", и это можно сделать, используя комбинацию PRE_TARGETDEPS и QMAKE_EXTRA_TARGETS. Вот ответ:
вы можете указать пользовательские шаги сборки, например. это вызовет makemyversion.sh чтобы создать myversion.НКЛ каждый раз прежде чем он что-то строит:
versiontarget.target = myversion.cpp versiontarget.commands = ./makemyversion.sh versiontarget.depends = FORCE PRE_TARGETDEPS += myversion.cpp QMAKE_EXTRA_TARGETS += versiontarget
Я использую нечто подобное для генерации номер версии моего приложения каждый раз это построенный.
Я пытался сделать много вещей, с помощью qmake в качестве системы сборки на протяжении многих лет. В конце концов я просто прибегнул к шагу pre-qmake. То есть. скрипт configure.
вы можете создать свой инструмент версии там, а затем выполнить его перед вызовом qmake для создания файлов Makefile.
Я нашел самый простой способ получить данные в файлы pro, Если вам это тоже нужно, это создать .профи.inc файл и включить его из вашего основного pro.
As 3DH упомянуто, вы хотите QMAKE_POST_LINK
опция, указанная в вашем .pro файлы, которые содержат то, что вы хотите выполнить. Поэтому для вашего примера я бы сделал что-то подобное с :
TEMPLATE = app
TARGET = version
HEADERS = version.h
SOURCES = version.cpp
QMAKE_POST_LINK=./version
что-то подобное должно работать с тестовый каталог.