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

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

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

Одна вещь, которую я пробовал, - это использование 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

Затем мне нужно, чтобы пакетный файл создавал placeholder.cpp следующим образом:

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

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

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

Ответы

Ответ 1

Похоже, что 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

Ответ 2

Попробуйте выполнить команду system(). Например:

system(pwd)

Ответ 3

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

TEMPLATE = aux
OBJECTS_DIR = ./
DESTDIR = ./

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

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

Немного взломанный, но он выполняет свою работу.

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

CONFIG -= debug_and_release

Однако, если вы используете это и в зависимости от того, как вызывается make файл (всегда вызывается вручную, вызывается родительским каталогом "subdirs" *.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 [...]

Ответ 4

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

regular.pro:

SOURCES += main.cpp
TARGET = regular.exe

external.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.pro:

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