QMake шаблон 'subdirs' - выполнение целевого объекта?

StackOverflow https://stackoverflow.com/questions/1167573

  •  19-09-2019
  •  | 
  •  

Вопрос

Я собираю систему сборки для своего приложения 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top