【问题标题】:Getting qmake to properly run my code-generator让 qmake 正确运行我的代码生成器
【发布时间】:2012-10-02 11:15:24
【问题描述】:

这是我的情况:

我有一个使用 qmake(.pro 文件)构建的典型 Qt C++ 项目。

我还有一个生成一些代码的 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 的类,所以我需要在 MOC 运行之前生成它们。

谢谢!

【问题讨论】:

    标签: c++ qt code-generation qmake


    【解决方案1】:

    如果我理解这将满足您的需求:

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

    使用第一条语句定义一个名为“buildfile”的新 Makefile 目标, 第二次定义构建文件目标的作用(它调用生成代码的 update.py) 第三个将 mytarget 定义为新的 qmake 目标,最后一个将 buildfile 目标添加到 qmake 的目标列表中。

    哦,我忘了。我在 qmake 的手册中找到了这个:http://qt-project.org/doc/qt-4.8/qmake-environment-reference.html at this section。也许它有用;)

    对于 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 2016-01-03
      • 2012-10-15
      • 2021-11-09
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      相关资源
      最近更新 更多