4

これが私の状況です:

qmake (.pro ファイル) で構築している典型的な Qt C++ プロジェクトがあります。

コードを生成する Python スクリプトもあります。Python スクリプト (update.py と呼びましょう) は 3 つのファイルを生成します。それらを 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 ベースのクラスがあるため、MOC を実行する前に生成する必要があります。

ありがとう!

4

1 に答える 1

3

これがあなたのニーズに合うと私が理解した場合:

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

最初のステートメントで「buildfile」と呼ばれる新しい Makefile ターゲットを定義し、2 番目のステートメントで buildfile ターゲットの動作を定義し (コードを生成する update.py を呼び出します)、3 番目のステートメントで mytarget を新しい qmake ターゲットとして定義し、最後のステートメントを追加します。 buildfile ターゲットを qmake のターゲット リストに追加します。

ああ、私は忘れていました。これはqmakeのマニュアルで見つけました:http: //qt-project.org/doc/qt-4.8/qmake-environment-reference.htmlのこのセクション。多分それは役に立ちます;)

moc の場合、これらを定義できます。

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 = app


SOURCES += main.cpp \
           widget.cpp

HEADERS  += widget.h

FORMS    += widget.ui

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


new_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()
于 2012-10-11T19:30:11.753 に答える