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

что-то подобное должно работать с тестовый каталог.