问题 QMake'subdirs'模板 - 执行目标?


我正在使用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而设计的,所以我可能希望这里有点太多但是如果有人能给我一些指示,那将是非常受欢迎的。


7433
2017-07-22 19:20


起源



答案:


我目前使用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()中运行多个单元测试

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周围的更多(无证件)技巧: 无证的QMake


10
2017-07-22 20:39



谢谢。我刚读了你的博客文章,我有另一个QTest的解决方案,这意味着你不需要编辑main.cpp来添加新的测试 - 它们是自动“注册”的,类似于Boost自动测试框架的工作方式。如果您有兴趣,请告诉我。 - Rob
那声音真的很有意思 - 当然我感兴趣:) greetz,Chris - 3DH
qtcreator.blogspot.com/2009/10/running-multiple-unit-tests.html - Rob
更改 &MyTest1() 至 MyTest1 test; ... &test - Jiu


答案:


我目前使用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()中运行多个单元测试

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周围的更多(无证件)技巧: 无证的QMake


10
2017-07-22 20:39



谢谢。我刚读了你的博客文章,我有另一个QTest的解决方案,这意味着你不需要编辑main.cpp来添加新的测试 - 它们是自动“注册”的,类似于Boost自动测试框架的工作方式。如果您有兴趣,请告诉我。 - Rob
那声音真的很有意思 - 当然我感兴趣:) greetz,Chris - 3DH
qtcreator.blogspot.com/2009/10/running-multiple-unit-tests.html - Rob
更改 &MyTest1() 至 MyTest1 test; ... &test - Jiu


我在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

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


3
2017-07-30 20:22



预编译很难找到qt,因为他们只有内置的QMAKE_POST_LINK,QMAKE_PRE_LINK和没有QMAKE_PRE_BUILT。感谢分享。 +2 - count0


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

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

我发现将数据导入专业文件的最简单方法是,如果您还需要,还可以生成.pro.inc文件并将其包含在主专业版中。


0
2017-07-23 01:44





3DH 提到,你想要一个 QMAKE_POST_LINK .pro文件中指定的选项,包含您要执行的内容。所以对于你的例子,我会做这样的事情 version.pro 文件:

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

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


0
2017-07-23 03:27