Правила Qmake для сгенерированного кода
Вопрос
Я понял, что мой предыдущий вопрос был немного смущен правилами и зависимостями. Следующий файл .pro генерирует Makefile, который работает правильно, если исходные файлы в каталоге, сгенерированные », существуют в то время, когда работает Qmake.
idl.target = generated/qmtest.h
idl.commands = code_generator
idl.config = no_link
idl.depends = $$SOURCES $$HEADERS $$FORMS
TEMPLATE = app
INCLUDEPATH += generated
SOURCES += generated/*.cpp
PRE_TARGETDEPS += generated/qmtest.h
QMAKE_EXTRA_UNIX_TARGETS += idl
Но когда работает Qmake, он только генерирует MakeFile, и Pre_TargetDeps & QMake_extra_UNIX_TARGETS мне не помогают. Как я могу заставить Qmake генерировать файл make -файла, который добавит содержимое сгенерированных/ источников?
Решение
Возможно, вам понадобится сделать это в двух проходах.
В вашем файле Qmake добавьте следующую строку:
include( generated/generated.pri )
Затем, в конце вашего скрипта CODE_GENERATOR, добавьте источники в файл сгенерированного.pri (используя BASH для примера, но идея одинакова почти для всех языков):
rm generated/generated.pri
for file in $( ls generated/*.cpp ); do
echo "SOURCES += ${file}" >> generated/generated.pri
done
В первый раз, когда вы запускаете файл QMake, сгенерировано/сгенерировано. PRI, вероятно, будет пустым. Когда вы запускаете, он заполнит файл сгенерированного.pri. Во второй раз, он воссоздает файл MAKE (как файл источника .PRI изменился), затем снова компилируется. Возможно, вы сможете возиться с другими командами, которые сделают для вас второй этап.
Другие советы
У меня была та же проблема только сейчас, но для более простой использования всего одного сгенерированного файла. Для этого я нашел гораздо более простой способ достичь этого, используя Gened_sources вместо источников:
dummyfile.target = dummy.cpp dummyfile.commands = touch $$dummyfile.target QMAKE_EXTRA_TARGETS += dummyfile GENERATED_SOURCES += $$dummyfile.target
Вероятно, можно подтолкнуть это в цикл Qmake и генерировать правильные цели для нескольких файлов.
Я придумал решение, которое я считаю надежным и общим, которое полагается на qmake
генерируя GNU Makefile.
Скажем, у нас есть все дополнительные SOURCES
а также HEADERS
назначения в указанном файле Makefile.pri
, который генерируется путем выполнения сценария generate_Makefile.pri.sh
это также генерирует источники и/или заголовки, упомянутые в Makefile.pri
.
Мы хотим, чтобы этот файл автоматически и надежно генерировался самой системой сборки, поэтому был включен в .pro
файл, чтобы qmake
может принять во внимание его контент и генерировать Makefil с соответствующими зависимостями.
Это то, что мы должны внести в наш .pro
файл.
Makefile_pri.target = Makefile.pri
Makefile_pri.commands = generate_Makefile.pri.sh
Makefile_pri.depends = FORCE
Makefile.target = $$MAKEFILE
Makefile.depends = Makefile_pri
include($$Makefile_pri.target)
QMAKE_EXTRA_TARGETS = Makefile Makefile_pri
Сюда:
- Если нет
Makefile.pri
, затем он создается; - Если
Makefile.pri
создается или обновляется, тогдаqmake
работает снова и учитывает его контент, восстанавливаяMakefile
Как сказано, это делает зависит от qmake
Генерация гнева, но тот же подход, который, как я считаю, может быть адаптирован для работы также с другими целевыми системами сборки.