Запуск программы / скрипта из 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
вот еще одно решение:
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