我正在使用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而设计的,所以我可能希望这里有点太多但是如果有人能给我一些指示,那将是非常受欢迎的。
我目前使用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
我目前使用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
我在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
我现在正在使用与此类似的东西来生成我的应用程序每次构建时的版本号。
多年来,我尝试用qmake作为构建系统做很多事情。最终我只是采取了前qmake步骤。 IE浏览器。配置脚本。
您可以在那里构建您的版本工具,然后在调用qmake之前执行它以生成Makefile。
我发现将数据导入专业文件的最简单方法是,如果您还需要,还可以生成.pro.inc文件并将其包含在主专业版中。
如 3DH 提到,你想要一个 QMAKE_POST_LINK
.pro文件中指定的选项,包含您要执行的内容。所以对于你的例子,我会做这样的事情 version.pro
文件:
TEMPLATE = app
TARGET = version
HEADERS = version.h
SOURCES = version.cpp
QMAKE_POST_LINK=./version
类似的东西应该适用于您的测试目录。