我想在所有可用的C++版本中运行我的单元测试,所以我有一个类似的目录结构
tests/
component/
tst_component.cpp
cxx11/
cxx14/
cxx17/
cxx20/
并使用CONFIG += c++NN
在C++NN中的每个cxxNN
子目录中编译tst_component.cpp
。如果编译器支持所有这些(对于较旧的qmakes,1z表示17,2a表示20(,那么这就可以很好地工作。但在我们的CI中,我有一个编译器太老了,无法理解CONFIG+=c++2a
添加到命令行中的-std=c++2a
选项,所以当编译器不支持(甚至不支持(c++20时,我想有条件地排除cxx20 subdir。
我知道
CONFIG(QT_CONFIG, c++2a):SUBDIRS += cxx20
但这是在测试Qt是否是在C++20模式下构建的,这不是我想要的。这就是我使用的atm,通过CI进行更改,但这意味着,当然,在有人安装用C++20构建的Qt之前,C++20模式实际上不会在CI上进行测试。
有没有一种方法可以独立于Qt的构建方式,并且不需要手动在构建系统中维护编译器版本白名单?
编辑:20210609有点像配置测试:我试图用CONFIG+=c++2a
编译一些东西,如果成功了,就会设置一些标志(比如have_cxx20
,让我说have_cxx20:SUBDIRS+=cxx20
(?
qmake有一个编译测试功能,您可以使用它编译一个具有定义的一组构建标志的简单源文件。看见https://doc.qt.io/qt-5/qmake-test-function-reference.html#qtcompiletest-测试以供参考,下面是这样一个项目的框架:
mainproject/
├── config.tests
│ └── test
│ ├── test.cpp
│ └── test.pro
├── main.cpp
└── mainproject.pro
mainproject/config.tests/test/test.pro:
SOURCES = test.cpp ## can be just a simple main() function, or even testing some c++20 specific features
QMAKE_CXXFLAGS+= -std=c++20
mainproject/mainproject.pro
load(configure)
qtCompileTest(test) {
message("CPP20 test passed")
} else {
message("CPP20 test failed")
}
TARGET = mainproject
SOURCES += main.cpp