Правила Qmake для сгенерированного кода

StackOverflow https://stackoverflow.com/questions/2006747

  •  18-09-2019
  •  | 
  •  

Вопрос

Я понял, что мой предыдущий вопрос был немного смущен правилами и зависимостями. Следующий файл .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

Сюда:

  1. Если нет Makefile.pri, затем он создается;
  2. Если Makefile.pri создается или обновляется, тогда qmake работает снова и учитывает его контент, восстанавливая Makefile

Как сказано, это делает зависит от qmake Генерация гнева, но тот же подход, который, как я считаю, может быть адаптирован для работы также с другими целевыми системами сборки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top