QMake'子目标'模板 - 执行目标?

时间:2009-07-22 19:20:38

标签: c++ qt qmake

我正在使用qmake .pro文件为我的Qt应用程序组建一个构建系统,该文件使用'subdirs'模板。这工作正常,并允许我指定每个目标的构建顺序,因此依赖关系很好地工作。但是,我现在已经为项目添加了一个工具,该工具生成主应用程序使用的版本号(包含构建日期,SVN修订版等) - 我可以先构建此版本工具但是在构建时我想要在构建任何更多目标之前执行它(它生成一个包含主应用程序包含的版本号的头文件。)

例如,我的简单qmake文件看起来像这样:

TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS = version \
          lib \
          tests \
          mainapp

构建'version'时我想在构建'lib'之前执行它(在命令行上传递一些参数)。

有人知道这是否可行?我看到qmake有一个可以执行应用程序的“系统”命令,但我不知道如何利用它。

相关问题与我的单元测试有关。它们存在于'test'项目中并使用QTest框架。我想在构建'mainapp'之前执行测试exe,如果测试失败(即测试exe没有返回零),我想退出构建过程。

我意识到qmake是为了生成makefile而设计的,所以我可能希望这里有点太多,但如果有人能给我一些指示,那将非常受欢迎。

4 个答案:

答案 0 :(得分:10)

我目前使用qmake自动执行单元测试两年 - 它运行正常。

看看这里 - 我为此制作了一个迷你指南:

Qt: Automated Unit Tests with QMAKE

摘要摘要:


结构

/myproject/
    myproject.h
    myproject.cpp
    main.cpp
    myproject.pro
/myproject/tests/
    MyUnitTest.h
    MyUnitTest.cpp
    main.cpp
    tests.pro

使用QMake在build

上自动运行单元测试

QMake目标QMAKE_POST_LINK将在链接后运行用户定义的命令。

tests.pri(常用文件)

TEMPLATE = app
DEPENDPATH += . ../
INCLUDEPATH += . ../
DESTDIR = ./
CONFIG += qtestlib
unix:QMAKE_POST_LINK=./$$TARGET
win32:QMAKE_POST_LINK=$${TARGET}.exe

tests.pro(项目特定文件)

TARGET = MyUnitTest
HEADERS += MyUnitTest.h
SOURCES += MyUnitTest.cpp main.cpp
include(tests.pri)

在单个main()

中运行多个单元测试

<强>的main.cpp

#include "MyUnitTest1.h"
#include "MyUnitTest2.h"

int main(int argc, char** argv) {
    QApplication app(argc, argv);

    int retval(0);
    retval +=QTest::qExec(&MyTest1(), argc, argv);
    retval +=QTest::qExec(&MyTest2(), argc, argv);

    return (retval ? 1 : 0);
}

这会在每次构建时运行测试,如果发现错误则中止。

注意

如果您收到链接器错误,例如“LNK2005:xxx已定义...”,请为每个测试类标头添加一个新的.cpp文件,并移动一些测试方法实现。


您可以在编译/构建之后使用该机制来执行您的版本控制工具 - 因此您的问题应该得到解决: - )

如果您有任何其他问题,请不要犹豫。

PS:在这里你可以找到围绕QMake的更多(未记录的)技巧:Undocumented QMake

答案 1 :(得分:3)

我在Qt Interest邮件列表上发布了一条关于“预构建”步骤的消息,可以使用PRE_TARGETDEPS和QMAKE_EXTRA_TARGETS的组合来完成。以下是回复:

  

您可以指定自定义构建步骤,   例如。这会调用makemyversion.sh   每次创建myversion.cpp   在构建之前:

versiontarget.target = myversion.cpp
versiontarget.commands = ./makemyversion.sh
versiontarget.depends = FORCE

PRE_TARGETDEPS += myversion.cpp
QMAKE_EXTRA_TARGETS += versiontarget

我现在正在使用与此类似的内容,以便在每次构建时生成应用程序的版本号。

答案 2 :(得分:0)

多年来,我尝试用qmake作为构建系统做很多事情。最后我只是采取了前qmake步骤。 IE浏览器。配置脚本。

您可以在那里构建您的版本工具,然后在调用qmake之前执行它以生成Makefile。

我发现将数据导入专业文件的最简单方法是生成.pro.inc文件并将其包含在主专业人员中。

答案 3 :(得分:0)

如上所述3DH,您希望.pro文件中指定的QMAKE_POST_LINK选项包含您要执行的内容。因此,对于您的示例,我会使用version.pro文件执行类似的操作:

TEMPLATE = app
TARGET = version
HEADERS = version.h
SOURCES = version.cpp
QMAKE_POST_LINK=./version

类似的东西应该适用于您的测试目录。