Запуск программы / скрипта из QMake

у нас довольно большая кодовая база. Подавляющее большинство кода компилируется с помощью qmake для создания файлов Makefile. Однако есть некоторые подпроекты, которые создаются путем запуска пакетных файлов или запуска других программ.

Я хотел бы иметь возможность скомпилировать все с помощью qmake, но я не могу понять, как заставить qmake просто запустить скрипт.

одна вещь, которую я пробовал, - это использование QMAKE_EXTRA_TARGETS в моем файле pro, например Итак:

TEMPLATE = lib
SOURCES = placeholder.cpp
CONFIG += no_link staticlib
batch_runner.target   = placeholder.cpp
batch_runner.commands = my_batch_file.bat
QMAKE_EXTRA_TARGETS   = batch_runner

затем я должен иметь пакетный файл для создания заполнителя.cpp так:

# do the real work here
# ...
# create placeholder.cpp so qmake and nmake are happy
echo // dummy >> placeholder.cpp

Это, кажется, работает нормально. Беда в том, что это в некотором роде обман. Если я не укажу batch_runner.target (т. е. я оставляю его пустым) или не ставлю заполнитель.cpp в источниках, то пакетный файл никогда не запускается. Это потому, что qmake не делает batch_runner.команды действий для любой другой зависимости в Makefile.

есть ли лучший способ получить QMake создать файл Makefile таким образом, чтобы скрипт запускался при выполнении файла Makefile?

4 ответов


похоже, что QMAKE_POST_LINK хорошо работает для такого рода вещей.

Кажется, это делает работу. my_batch_file.bat работает при запуске nmake (а не при запуске qmake), и мне не нужно делать ничего смешного с целями-заполнителями или файлами.

вполне вероятно, что мне не нужны все элементы, перечисленные в "CONFIG".

TEMPLATE = lib
TARGET   = 
CONFIG  += no_link target_predeps staticlib

QMAKE_POST_LINK  = my_batch_file.bat
QMAKE_CLEAN     += batch_output.obj

попробовать system () command. Например:

system(pwd)

вот еще одно решение:

TEMPLATE = aux
OBJECTS_DIR = ./
DESTDIR = ./

first.commands = my_batch_file.bat
QMAKE_EXTRA_TARGETS += first
QMAKE_CLEAN += batch_output.obj

шаблон aux в основном создает makefile, который ничего не делает при запуске без указания цели. The OBJECTS_DIR и DESTDIR переменные устанавливаются в текущий каталог, чтобы предотвратить создание qmake debug и release каталоги (важно установить их в ./ и не только .; по крайней мере на Windows). Затем, используя QMAKE_EXTRA_TARGETS, мы находим новые цели first для выполнения пользовательской команды, когда makefile вызывается без цели.

немного суховато, но он получает работу.

дополнение: Если вы хотите предотвратить создание трех файлов Makefile (Makefile, Makefile.Debug, Makefile.Release), вы можете добавить

CONFIG -= debug_and_release

однако, если вы используете это и в зависимости от того, как вызывается makefile (всегда вызывается вручную, вызывается "поддирами" родительского каталога *.pro file,...), возможно, необходимо создать поддельные debug и release цели чтобы избежать "нет правила, чтобы сделать цели..." ошибки. Например:

release.target = release
release-clean.target = release-clean
release-install.target = release-install
[...]
debug.target = debug
debug-clean.target = debug-clean
debug-install.target = debug-install
[...]
QMAKE_EXTRA_TARGETS += release release-clean release-install [...]
QMAKE_EXTRA_TARGETS += debug debug-clean debug-install [...]

вы можете использовать конфигурации подкаталоги для выполнения нескольких разных задач, даже из той же сборки. Это может особенно хорошо работать с дополнительными целями, так как конфигурация subdir может определять конкретную цель в файле makefile для запуска (см. недокументированный qmake для деталей). В этом случае я бы поместил все "обычные" команды сборки в одну.pro файл, внешние команды сборки в другом, и субдиры .pro файл, чтобы построить все из них. Я ничего не тестировал вот так, но это должно сработать.

обычный.pro:

SOURCES += main.cpp
TARGET = regular.exe

Внешний.pro:

batch_runner.commands = my_batch_file.bat
QMAKE_EXTRA_TARGETS   += batch_runner

other_runner.commands = other_batch_file.bat
QMAKE_EXTRA_TARGETS   += other_runner

do_it_all.про:

TEMPLATE = subdirs
CONFIG += ordered

regular.file = regular.pro
SUBDIRS += regular

batch.file = external.pro
batch.target = batch_runner
SUBDIRS += batch

other.file = external.pro
other.target = other_runner
SUBDIRS += other