11

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

例如,我的简单 qmake 文件如下所示:

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

当构建“版本”时,我想在构建“lib”之前执行它(在命令行上传递一些参数)。

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

一个相关问题涉及我的单元测试。这些存在于“测试”项目中并使用 QTest 框架。我想在构建“mainapp”之前执行测试 exe,如果测试失败(即测试 exe 不返回零),我想退出构建过程。

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

4

4 回答 4

10

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

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

Qt:使用 QMAKE 进行自动化单元测试

简要总结:


结构

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

使用 QMake 在构建时自动运行单元测试

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() 中运行多个单元测试

主文件

#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 的技巧:未记录的 QMake

于 2009-07-22T20:39:24.637 回答
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

我现在使用与此类似的东西在每次构建我的应用程序时生成它的版本号。

于 2009-07-30T20:22:10.137 回答
0

多年来,我尝试使用 qmake 作为构建系统做很多事情。最终,我只是采取了一个 pre-qmake 步骤。IE。一个配置脚本。

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

如果您也需要,我发现将数据放入 pro 文件的最简单方法是生成一个 .pro.inc 文件并从您的主要 pro 中包含它。

于 2009-07-23T01:44:32.563 回答
0

正如3DH所提到的,您希望QMAKE_POST_LINK在 .pro 文件中指定一个包含您想要执行的内容的选项。因此,对于您的示例,我会对version.pro文件执行以下操作:

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

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

于 2009-07-23T03:27:24.520 回答