Запуск программы /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