这是我的情况:
我有一个典型的 Qt C++ 项目,我正在使用 qmake(.pro 文件)构建。
我还有一个生成一些代码的 python 脚本。 python 脚本(我们称它为 update.py)生成三个文件,我们称它们为 gen.h、gen.cpp、gen.qml。
现在我正在做的是手动运行 update.py 以生成这些文件。然后我可以运行 make,一切都建立起来了。 gen.h 和 gen.cpp 只是我的 .pro 文件中的“常规”文件,它们已 checkin 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 之前生成它们。
谢谢!
最佳答案
如果我理解这将满足您的需求:
mytarget.target = .buildfile
mytarget.commands = ./update.py
QMAKE_EXTRA_TARGETS += mytarget
PRE_TARGETDEPS += .buildfile
在第一条语句中,您定义了一个名为“buildfile”的新 Makefile 目标, 第二个定义构建文件目标的作用(它调用生成代码的 update.py) 第三个将 mytarget 定义为新的 qmake 目标,最后一个将构建文件目标添加到 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()
关于c++ - 让 qmake 正确运行我的代码生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12845513/