首页 > 解决方案 > 在 QMake 中,仅当目标支持 C++20 时,如何添加子目录?

问题描述

我想在所有可用的 C++ 版本中运行我的单元测试,所以我有一个像这样的目录结构

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

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

我知道

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)?

标签: c++qtc++20qmakebuild-system

解决方案


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

主项目/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.pro

load(configure)
qtCompileTest(test) {
    message("CPP20 test passed")
} else {
    message("CPP20 test failed")
}

TARGET = mainproject
SOURCES += main.cpp

推荐阅读