在 QMake 中,如何仅在目标支持 C++20 时添加子目录?

In QMake, how do I add a subdir only if the target supports C++20?

我想 运行 在所有可用的 C++ 版本中进行我的单元测试,所以我的目录结构类似于

tests/
    component/
        tst_component.cpp
        cxx11/
        cxx14/
        cxx17/
        cxx20/

并且我使用 CONFIG += c++NN 在 C++NN 的每个 cxxNN 子目录中编译 tst_component.cpp。如果编译器支持所有这些(1z 用于 17,2a 用于 20,用于较旧的 qmake),则此方法效果很好。但是在我们的 CI 上,我有一个太旧的编译器无法理解 CONFIG+=c++2a 添加到命令行的 -std=c++2a 选项,所以我想有条件地排除 cxx20 子目录编译器不支持(甚至是 c++20 的一个子集)。

我知道

CONFIG(QT_CONFIG, c++2a):SUBDIRS += cxx20

但这是在测试 Qt 是否以 C++20 模式构建,这不是我想要的。这就是我正在使用 atm,通过 CI 获得更改,但这当然意味着 C++20 模式实际上并未在 CI 上进行测试,直到有人安装了使用 C++20 构建的 Qt。

有没有一种方法独立于 Qt 的构建方式并且不涉及在构建系统中手动维护编译器版本白名单?

编辑:20210609 类似配置测试的东西:我尝试用 CONFIG+=c++2a 编译一些东西,如果可行,设置了一些标志(比如 have_cxx20,让我可以说 have_cxx20:SUBDIRS+=cxx20)?

qmake 具有编译测试功能,您可以使用它来编译带有一组已定义构建标志的简单源文件。请参阅 https://doc.qt.io/qt-5/qmake-test-function-reference.html#qtcompiletest-test 以供参考,这里是此类项目的框架:

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