8602a224b6
Static Qt builds are not covered by BC guarantees, but since all 'libraries' are linked into a single executable, we face in all users of the library the same ODR violation that we faced within the implementation DLL: we can't define the same symbol as inline in some TUs and out-of-line in others. In the past, we decided to always inline in static builds, but that breaks users which, by Hyrum's Law, have come to depend on the non-existent BC guarantees for static Qt builds. By switching to never inline¹ in static builds, we restore BC for such users. The performance issues should be minimal, since LTO will anyway inline whatever it wants, independent on how it was declared. ¹ except when the deprecation point has passed over the Qt version the API was inlined (-disable-deprecated-up-to configure switch). [ChangeLog][QtCore] Restored binary compatibility for static Qt builds broken by the QT_INLINE_SINCE mechanism. Qt still does not guarantee BC for static build configurations otherwise. Fixes: QTBUG-109449 Pick-to: 6.5 6.4 Change-Id: Ie3fa62621b74dc5e9dac301b9882c0e3c3999eaf Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
49 lines
1.9 KiB
C
49 lines
1.9 KiB
C
// Copyright (C) 2022 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
|
|
|
|
#include <QtCore/qglobal.h>
|
|
|
|
#ifndef @header_base_name_upper@_H
|
|
#define @header_base_name_upper@_H
|
|
|
|
#if defined(QT_SHARED) || !defined(QT_STATIC)
|
|
# if defined(QT_BUILD_@module_define_infix@_LIB)
|
|
# define Q_@module_define_infix@_EXPORT Q_DECL_EXPORT
|
|
# else
|
|
# define Q_@module_define_infix@_EXPORT Q_DECL_IMPORT
|
|
# endif
|
|
#else
|
|
# define Q_@module_define_infix@_EXPORT
|
|
#endif
|
|
|
|
#if !defined(QT_BUILD_@module_define_infix@_LIB) && !defined(QT_STATIC)
|
|
/* outside library → inline decl + defi */
|
|
/* static builds treat everything as part of the library, so they never inline */
|
|
# define QT_@module_define_infix@_INLINE_SINCE(major, minor) inline
|
|
# define QT_@module_define_infix@_INLINE_IMPL_SINCE(major, minor) 1
|
|
#elif defined(QT_@module_define_infix@_BUILD_REMOVED_API)
|
|
/* inside library, inside removed_api.cpp:
|
|
* keep deprecated API → non-inline decl;
|
|
* remove deprecated API → inline decl;
|
|
* definition is always available */
|
|
# define QT_@module_define_infix@_INLINE_SINCE(major, minor) \
|
|
QT_IF_DEPRECATED_SINCE(major, minor, inline, /* not inline */)
|
|
# define QT_@module_define_infix@_INLINE_IMPL_SINCE(major, minor) 1
|
|
#else
|
|
/* inside library, outside removed_api.cpp:
|
|
* keep deprecated API → non-inline decl, no defi;
|
|
* remove deprecated API → inline decl, defi */
|
|
# define QT_@module_define_infix@_INLINE_SINCE(major, minor) \
|
|
QT_IF_DEPRECATED_SINCE(major, minor, inline, /* not inline */)
|
|
# define QT_@module_define_infix@_INLINE_IMPL_SINCE(major, minor) \
|
|
QT_IF_DEPRECATED_SINCE(major, minor, 1, 0)
|
|
#endif
|
|
|
|
#ifdef QT_@module_define_infix@_BUILD_REMOVED_API
|
|
# define QT_@module_define_infix@_REMOVED_SINCE(major, minor) QT_DEPRECATED_SINCE(major, minor)
|
|
#else
|
|
# define QT_@module_define_infix@_REMOVED_SINCE(major, minor) 0
|
|
#endif
|
|
|
|
#endif // @header_base_name_upper@_H
|