правила qmake для сгенерированного кода - PullRequest
8 голосов
/ 05 января 2010

Я понял, что мой предыдущий вопрос был немного смущен правилами и зависимостями. Следующий .pro-файл генерирует make-файл, который работает правильно, ЕСЛИ исходные файлы в каталоге «сгенерированы» существуют во время выполнения 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, он генерирует только make-файл, и PRE_TARGETDEPS & QMAKE_EXTRA_UNIX_TARGETS мне не помогают. Как я могу заставить qmake сгенерировать make-файл, который добавит содержимое сгенерированного / в SOURCES?

Ответы [ 3 ]

5 голосов
/ 06 января 2010

Возможно, вам придется сделать это в два прохода.

В вашем файле 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 предположительно будет пустым. Когда вы запустите make, он заполнит сгенерированный файл .pri. Во второй раз он заново создаст файл make (после изменения исходного файла .pri), а затем снова скомпилирует. Возможно, вы сможете поиграть с другими командами, которые сделают для вас второй этап.

4 голосов
/ 08 августа 2012

У меня была такая же проблема только сейчас, но для более простого использования только одного сгенерированного файла. Для этого я нашел гораздо более простой способ добиться этого, используя GENERATED_SOURCES вместо SOURCES:

dummyfile.target = dummy.cpp
dummyfile.commands = touch $$dummyfile.target
QMAKE_EXTRA_TARGETS += dummyfile
GENERATED_SOURCES += $$dummyfile.target

Вероятно, можно вставить это в цикл qmake и сгенерировать правильные цели для нескольких файлов.

0 голосов
/ 10 февраля 2017

Я нашел решение, которое я считаю надежным и общим, которое основано на qmake создании GNU Makefile.

Скажем, у нас есть все дополнительные SOURCES и HEADERS назначения в файле с именем Makefile.pri, который генерируется путем выполнения скрипта generate_Makefile.pri.sh, который также генерирует источники и / или заголовки, упомянутые в Makefile.pri .

Мы хотим, чтобы этот файл автоматически и надежно создавался самой системой сборки, чтобы он был включен в файл .pro, чтобы qmake мог учитывать его содержимое и генерировать Makefile с надлежащими зависимостями.

Это то, что мы должны поместить в наш файл .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 генерации Makefile GNU, но тот же подход, который я считаю, может быть адаптирован для работы и с другими целевыми системами сборки.

...