我正在使用一个使用'subdirs'模板的qmake .pro文件为我的Qt应用程序组建一个构建系统.这工作正常,并允许我指定每个目标的构建顺序,因此依赖关系很好地工作.不过,我现在已经添加了一个工具来生成一个版本号(包含它的制作日期,SVN版本等)所使用的主要的应用程序的项目 - 我可以先建这个版本的工具,但是当它是建立在我想在构建任何更多目标之前执行它(它生成一个包含主应用程序包含的版本号的头文件.)
例如,我的简单qmake文件看起来像这样:
TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS = version \
lib \
tests \
mainapp
Run Code Online (Sandbox Code Playgroud)
当'version'构建时,我想在构建'lib'之前执行它(在命令行上传递一些参数).
有谁知道这是否可能?我看到qmake有一个可以执行应用程序的"系统"命令,但我不知道如何利用它.
一个相关的问题涉及我的单元测试.它们存在于'test'项目中并使用QTest框架.我想在构建'mainapp'之前执行测试exe,如果测试失败(即测试exe没有返回零),我想退出构建过程.
我意识到qmake是为了生成makefile而设计的,所以我可能希望这里有点太多但是如果有人能给我一些指示,那将非常受欢迎.
3DH*_*3DH 10
我目前使用qmake自动执行我的单元测试两年 - 它工作正常.
看看这里 - 我为此制作了一个迷你指南:
/myproject/
myproject.h
myproject.cpp
main.cpp
myproject.pro
/myproject/tests/
MyUnitTest.h
MyUnitTest.cpp
main.cpp
tests.pro
Run Code Online (Sandbox Code Playgroud)
QMake目标QMAKE_POST_LINK将在链接后运行用户定义的命令.
tests.pri(普通文件)
TEMPLATE = app
DEPENDPATH += . ../
INCLUDEPATH += . ../
DESTDIR = ./
CONFIG += qtestlib
unix:QMAKE_POST_LINK=./$$TARGET
win32:QMAKE_POST_LINK=$${TARGET}.exe
Run Code Online (Sandbox Code Playgroud)
tests.pro(项目特定文件)
TARGET = MyUnitTest
HEADERS += MyUnitTest.h
SOURCES += MyUnitTest.cpp main.cpp
include(tests.pri)
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
这将对每个构建运行测试,如果发现错误则中止.
如果您收到链接器错误,例如"LNK2005:xxx已定义...",请为每个测试类标头添加一个新的.cpp文件,并移动一些测试方法实现.
在编译/构建之后,您可以使用该机制来执行您的版本控制工具 - 因此您的问题应该得到解决:-)
如果您有任何其他问题,请不要犹豫,问我.
PS:在这里你可以找到QMake周围的更多(无证件)技巧:未记载的QMake
我在 Qt Interest 邮件列表上发布了一条关于“预构建”步骤的消息,它可以使用 PRE_TARGETDEPS 和 QMAKE_EXTRA_TARGETS 的组合来完成。这是回应:
您可以指定自定义构建步骤,例如。这将在每次构建某些内容之前调用 makemyversion.sh 来创建 myversion.cpp:
Run Code Online (Sandbox Code Playgroud)versiontarget.target = myversion.cpp versiontarget.commands = ./makemyversion.sh versiontarget.depends = FORCE PRE_TARGETDEPS += myversion.cpp QMAKE_EXTRA_TARGETS += versiontarget
我现在使用与此类似的方法在每次构建应用程序时生成应用程序的版本号。