Как заставить qmake правильно запустить мой генератор кода

Вот моя ситуация:

У меня есть типичный проект Qt C ++, который я создаю с помощью qmake (файл .pro).

У меня также есть скрипт Python, который генерирует некоторый код. Скрипт python (назовем его update.py) генерирует три файла, назовем их gen.h, gen.cpp, gen.qml.

Теперь я запускаю update.py для генерации этих файлов. Затем я могу запустить make, и все работает нормально. Gen.h и gen.cpp — это просто «обычные» файлы в моем .pro-файле, и они проверяются в SVN.

Вместо этого я хочу сделать так, чтобы при запуске make, update.py запускался и генерировал эти файлы, а затем они собирались вместе с проектом. Таким образом, я могу удалить их из SVN и избежать дополнительного ручного шага.

К вашему сведению: у меня уже есть файл update.py для повторной генерации этих файлов только при необходимости, поэтому, если вы запустите update.py несколько раз, он не будет слепо менять gen.h, gen.cpp и т. Д.

Я потратил огромное количество времени, пытаясь получить эту работу (на самом деле довольно неловко). Я возился с QMAKE_EXTRA_TARGETS, QMAKE_EXTRA_COMPILERS, PRE_TARGETDEPS и т. Д., Но, похоже, ничего не работает так, как я хочу.

О, еще немного информации: в gen.cpp и gen.h есть классы, основанные на QObject, поэтому мне нужно, чтобы они генерировались gen перед запуском MOC.

Спасибо!

4

Решение

если бы я понял, это будет соответствовать вашим потребностям:

mytarget.target = .buildfile
mytarget.commands = ./update.py
QMAKE_EXTRA_TARGETS += mytarget
PRE_TARGETDEPS += .buildfile

с первым оператором вы определяете новую цель Makefile под названием «buildfile»,
со вторым вы определяете, что делает ваша цель buildfile (она вызывает update.py, который генерирует код)
третьим вы определяете mytarget как новую цель qmake, а в последнюю добавляете цель buildfile в список целей qmake.

Ой, я забыл. Я нашел это в руководстве qmake: http://qt-project.org/doc/qt-4.8/qmake-environment-reference.html в этом разделе. Может быть, это полезно;)

И для МОК вы можете определить это:

new_moc.output  = moc_${QMAKE_FILE_BASE}.cpp
new_moc.commands = moc ${QMAKE_FILE_NAME} -o ${QMAKE_FILE_OUT}
new_moc.depend_command = g++ -E -M ${QMAKE_FILE_NAME} | sed "s,^.*: ,,"new_moc.input = NEW_HEADERS
QMAKE_EXTRA_COMPILERS += new_moc

Я сделал несколько тестов. И это работает для меня:

//.pro file:
QT       += core gui

TARGET = test
TEMPLATE = appSOURCES += main.cpp \
widget.cpp

HEADERS  += widget.h

FORMS    += widget.ui

mytarget.target = .buildfile
mytarget.commands = ./update.py
QMAKE_EXTRA_TARGETS += mytarget
PRE_TARGETDEPS += .buildfilenew_moc.target         = .mymoc
new_moc.output         = moc_widget.cpp
new_moc.commands       = moc widget.cpp -o moc_widget.o
new_moc.depend_command = g++ -E -M widget | sed "s,^.*: ,,"new_moc.input          = moc_widget.h

QMAKE_EXTRA_COMPILERS += new_moc

//update.py:
#!c:/Python/python.exe -u

fd=open("widget.h",'w')
fd.write("#ifndef WIDGET_H\n")
fd.write("#define WIDGET_H\n")
fd.write("#include <QWidget>\n")
fd.write("namespace Ui {\n")
fd.write("class Widget;\n")
fd.write("}\n")
fd.write("class Widget : public QWidget\n")
fd.write("{\n")
fd.write("    Q_OBJECT\n")
fd.write("public:\n")
fd.write("    explicit Widget(QWidget *parent = 0);\n")
fd.write("    ~Widget();\n")
fd.write("private:\n")
fd.write("    Ui::Widget *ui;\n")
fd.write("};\n")
fd.write("#endif // WIDGET_H\n")
fd.close()

fd=open("widget.cpp",'w')
fd.write("#include \"widget.h\"\n")
fd.write("#include \"ui_widget.h\"\n")
fd.write("Widget::Widget(QWidget *parent) :\n")
fd.write("    QWidget(parent),\n")
fd.write("    ui(new Ui::Widget)\n")
fd.write("{\n")
fd.write("    ui->setupUi(this);\n")
fd.write("}\n")
fd.write("\n")
fd.write("Widget::~Widget()\n")
fd.write("{\n")
fd.write("    delete ui;\n")
fd.write("}\n")
fd.close()
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]