Long live qstdlibdetection.h!

I've been meaning to add this since at least 2012 (cf. commit message
of 9180d9aa8bfb9e9f66fad13f194398a98698eb77), this is as good a time
as any.

Detection taken from qcompare.h, except for
- libstdc++: using version macro instead of date one
- Dinkumware, which is taken from the above-mentioned commit (adjusted
  for the LIBCPP->CPPLIB typo),
- STLport/SGI, which are taken from stlport's _stlport_version.h,
- RogueWave, which is taken from Apache stdcxx's rw/_config.h, a fork
  of RogueWave, contributed to Apache by RogueWave themselves.

It looks like not all STLs provide a version macro, and those that do
vary a lot in granularity, so for the time being, just define these
macros to nothing and not to some form of version.

[ChangeLog][QtCore] Added Q_STL_ macros for stdlib detection (libc++,
libstdc++, MSSTL, Dinkumware, STLport, SGI, RogueWave). If your STL is
lacking, please file a bug report. Note that these macros are not
considered public API just yet.

Picking to all active branches, since not picking is more risky (code
that assumed these macros existed in older branches could silently
change behavior if they don't).

Fixes: QTBUG-132908
Fixes: QTBUG-132909
Pick-to: 6.8 6.5 6.2 5.15
Change-Id: I8f956d131292483b7727f11f69b460b12a06b583
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
(cherry picked from commit b6f825a857d0d2266ea89879f26703f86ddf669a)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Marc Mutz 2025-01-21 08:29:40 +01:00 committed by Qt Cherry-pick Bot
parent 69fa60518c
commit 7197992341
2 changed files with 61 additions and 0 deletions

View File

@ -68,6 +68,7 @@ qt_internal_add_module(Core
global/qoverload.h
global/qprocessordetection.h
global/qrandom.cpp global/qrandom.h global/qrandom_p.h
global/qstdlibdetection.h
global/qswap.h
global/qsysinfo.cpp global/qsysinfo.h
global/qsystemdetection.h

View File

@ -0,0 +1,60 @@
// Copyright (C) 2025 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#if 0
#pragma qt_class(QtStdLibDetection)
#pragma qt_sync_skip_header_check
#pragma qt_sync_stop_processing
#endif
#ifndef QSTDLIBDETECTION_H
#define QSTDLIBDETECTION_H
#include <QtCore/qtconfiginclude.h>
#ifdef __cplusplus
/* If <version> exists, qtconfiginclude.h will have included it. */
/* If not, we need to include _something_, and <utility> is included by qcompilerdetection.h, too */
#if !__has_include(<version>)
# include <utility>
#endif
/*
The std lib, must be one of: (Q_STL_x)
LIBCPP - libc++ (shipped with Clang, e.g.)
LIBSTDCPP - libstdc++ (shipped with GCC, e.g.)
MSSTL - Microsoft STL
DINKUMWARE - Dinkumware (shipped with QNX, VxWorks, Integrity, origin of MSSTL)
STLPORT - STLport (merged with SGI)
SGI - The original STL
ROGUEWAVE - RogueWave ((used to be) popular on ARM?)
Not included:
EASTL - EASTL (this is not a drop-in STL, e.g. it doesn't have <vector>-style headers)
Should be sorted most to least authoritative.
*/
#if defined(_LIBCPP_VERSION) /* libc++ */
# define Q_STL_LIBCPP
#elif defined(_GLIBCXX_RELEASE) /* libstdc++ */
# define Q_STL_LIBSTDCPP
#elif defined(_MSVC_STL_VERSION) /* MSSTL (must be before Dinkumware) */
# define Q_STL_MSSTL
#elif defined(_YVALS) || defined(_CPPLIB_VER) /* Dinkumware */
# define Q_STL_DINKUMWARE
#elif defined(_STLPORT_VERSION) /* STLport, cf. _stlport_version.h */
# define Q_STL_STLPORT
#elif defined(__SGI_STL) /* must be after STLport, which mimics as SGI STL */
# define Q_STL_SGI
#elif defined(_RWSTD_VER) /* RogueWave, at least as contributed to Apache stdcxx, cf. rw/_config.h */
# define Q_STL_ROGUEWAVE
#else
# error Unknown std library implementation, please file a report at bugreports.qt.io.
#endif
#endif // __cplusplus
#endif // QSTDLIBDETECTION_H