Запуск программы / скрипта из QMake - PullRequest
14 голосов
/ 31 августа 2010

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

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

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

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 таким образом, чтобы при запуске Makefile запускался скрипт?

Ответы [ 4 ]

14 голосов
/ 02 сентября 2010

Похоже, что 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
6 голосов
/ 01 сентября 2010

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

system(pwd)
5 голосов
/ 24 апреля 2013

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

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 родительского каталога, ...), может потребоваться создать поддельные цели 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 [...]
1 голос
/ 01 сентября 2010

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

normal.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
...