diff --git a/cmake/QtProcessConfigureArgs.cmake b/cmake/QtProcessConfigureArgs.cmake index 97bf49efbed..55980f275b7 100644 --- a/cmake/QtProcessConfigureArgs.cmake +++ b/cmake/QtProcessConfigureArgs.cmake @@ -910,6 +910,7 @@ translate_boolean_input(ccache QT_USE_CCACHE) translate_boolean_input(vcpkg QT_USE_VCPKG) translate_boolean_input(shared BUILD_SHARED_LIBS) translate_boolean_input(warnings_are_errors WARNINGS_ARE_ERRORS) +translate_boolean_input(qtinlinenamespace QT_INLINE_NAMESPACE) translate_string_input(qt_namespace QT_NAMESPACE) translate_string_input(qt_libinfix QT_LIBINFIX) translate_string_input(qreal QT_COORD_TYPE) diff --git a/cmake/configure-cmake-mapping.md b/cmake/configure-cmake-mapping.md index 28da5a17a0f..d504bd8d4be 100644 --- a/cmake/configure-cmake-mapping.md +++ b/cmake/configure-cmake-mapping.md @@ -45,6 +45,7 @@ The following table describes the mapping of configure options to CMake argument | -device-option | -DQT_QMAKE_DEVICE_OPTIONS=key1=value1;key2=value2 | Only used for generation qmake-compatibility files. | | | | The device options are written into mkspecs/qdevice.pri. | | -appstore-compliant | -DFEATURE_appstore_compliant=ON | | +| -qtinlinenamespace | -DQT_INLINE_NAMESPACE=ON | Make the namespace specified by -qtnamespace an inline one. | | -qtnamespace | -DQT_NAMESPACE= | | | -qtlibinfix | -DQT_LIBINFIX= | | | -coverage | -DINPUT_coverage= | Enables code coverage using the specified tool. | diff --git a/config_help.txt b/config_help.txt index a5f8cd62df1..13fc516da5f 100644 --- a/config_help.txt +++ b/config_help.txt @@ -101,6 +101,7 @@ Build options: -qt-host-path . Specify path to a Qt host build for cross-compiling. -qtnamespace .. Wrap all Qt library code in 'namespace {...}'. + -qtinlinenamespace ... Make -qtnamespace an inline namespace -qtlibinfix .. Rename all libQt6*.so to libQt6*.so. -coverage ..... Instrument with the code coverage tool. diff --git a/qt_cmdline.cmake b/qt_cmdline.cmake index 11ba47854a1..9c023614a9a 100644 --- a/qt_cmdline.cmake +++ b/qt_cmdline.cmake @@ -101,6 +101,7 @@ qt_commandline_option(platform TYPE string) qt_commandline_option(plugin-manifests TYPE boolean) qt_commandline_option(profile TYPE boolean) qt_commandline_option(qreal TYPE string) +qt_commandline_option(qtinlinenamespace TYPE boolean) qt_commandline_option(qtlibinfix TYPE string NAME qt_libinfix) qt_commandline_option(qtnamespace TYPE string NAME qt_namespace) qt_commandline_option(reduce-exports TYPE boolean NAME reduce_exports) diff --git a/src/corelib/CMakeLists.txt b/src/corelib/CMakeLists.txt index 98bca333dbe..daf98e929a6 100644 --- a/src/corelib/CMakeLists.txt +++ b/src/corelib/CMakeLists.txt @@ -350,7 +350,11 @@ _qt_internal_setup_deploy_support() add_dependencies(Core qmodule_pri) if (NOT QT_NAMESPACE STREQUAL "") - target_compile_definitions(Core PUBLIC "QT_NAMESPACE=${QT_NAMESPACE}") + set(core_namespace_defs "QT_NAMESPACE=${QT_NAMESPACE}") + if(QT_INLINE_NAMESPACE) + list(APPEND core_namespace_defs QT_INLINE_NAMESPACE) + endif() + target_compile_definitions(Core PUBLIC ${core_namespace_defs}) set_target_properties(Core PROPERTIES _qt_namespace "${QT_NAMESPACE}") set_property(TARGET Core APPEND PROPERTY EXPORT_PROPERTIES _qt_namespace) endif() diff --git a/src/corelib/global/qtconfigmacros.h b/src/corelib/global/qtconfigmacros.h index 6080562ab47..ee7ebca52bd 100644 --- a/src/corelib/global/qtconfigmacros.h +++ b/src/corelib/global/qtconfigmacros.h @@ -105,6 +105,22 @@ # define QT_FORWARD_DECLARE_CLASS(name) class name; # define QT_FORWARD_DECLARE_STRUCT(name) struct name; +#elif defined(QT_INLINE_NAMESPACE) /* user inline namespace FIXME in Qt 7: Default */ + +# define QT_PREPEND_NAMESPACE(name) ::QT_NAMESPACE::name +# define QT_USE_NAMESPACE +# define QT_BEGIN_NAMESPACE inline namespace QT_NAMESPACE { +# define QT_END_NAMESPACE } +# define QT_BEGIN_INCLUDE_NAMESPACE } +# define QT_END_INCLUDE_NAMESPACE inline namespace QT_NAMESPACE { +# define QT_FORWARD_DECLARE_CLASS(name) \ +QT_BEGIN_NAMESPACE class name; QT_END_NAMESPACE + +# define QT_FORWARD_DECLARE_STRUCT(name) \ +QT_BEGIN_NAMESPACE struct name; QT_END_NAMESPACE + +inline namespace QT_NAMESPACE {} + #else /* user namespace */ # define QT_PREPEND_NAMESPACE(name) ::QT_NAMESPACE::name diff --git a/src/tools/rcc/rcc.cpp b/src/tools/rcc/rcc.cpp index 14c4979b6da..444e9c4ae55 100644 --- a/src/tools/rcc/rcc.cpp +++ b/src/tools/rcc/rcc.cpp @@ -1382,7 +1382,9 @@ bool RCCResourceLibrary::writeInitializer() "# define QT_RCC_MANGLE_NAMESPACE(name) name\n" "#endif\n\n"); - writeString("#ifdef QT_NAMESPACE\n" + writeString("#if defined(QT_INLINE_NAMESPACE)\n" + "inline namespace QT_NAMESPACE {\n" + "#elif defined(QT_NAMESPACE)\n" "namespace QT_NAMESPACE {\n" "#endif\n\n"); } diff --git a/tests/auto/tools/rcc/data/images/images.expected b/tests/auto/tools/rcc/data/images/images.expected index 15a08b77a20..b30c6ce6230 100644 --- a/tests/auto/tools/rcc/data/images/images.expected +++ b/tests/auto/tools/rcc/data/images/images.expected @@ -115,7 +115,9 @@ TIMESTAMP:images/subdir/triangle.png # define QT_RCC_MANGLE_NAMESPACE(name) name #endif -#ifdef QT_NAMESPACE +#if defined(QT_INLINE_NAMESPACE) +inline namespace QT_NAMESPACE { +#elif defined(QT_NAMESPACE) namespace QT_NAMESPACE { #endif diff --git a/tests/auto/tools/rcc/data/images/images.expected32 b/tests/auto/tools/rcc/data/images/images.expected32 index 8b7c7e420ff..7e98fdd4fca 100644 --- a/tests/auto/tools/rcc/data/images/images.expected32 +++ b/tests/auto/tools/rcc/data/images/images.expected32 @@ -115,7 +115,9 @@ TIMESTAMP:images/subdir/triangle.png # define QT_RCC_MANGLE_NAMESPACE(name) name #endif -#ifdef QT_NAMESPACE +#if defined(QT_INLINE_NAMESPACE) +inline namespace QT_NAMESPACE { +#elif defined(QT_NAMESPACE) namespace QT_NAMESPACE { #endif diff --git a/tests/auto/tools/rcc/data/sizes/size-0.expected b/tests/auto/tools/rcc/data/sizes/size-0.expected index 0c38ee797cc..79defe7868a 100644 --- a/tests/auto/tools/rcc/data/sizes/size-0.expected +++ b/tests/auto/tools/rcc/data/sizes/size-0.expected @@ -57,7 +57,9 @@ TIMESTAMP:data/data-0.txt # define QT_RCC_MANGLE_NAMESPACE(name) name #endif -#ifdef QT_NAMESPACE +#if defined(QT_INLINE_NAMESPACE) +inline namespace QT_NAMESPACE { +#elif defined(QT_NAMESPACE) namespace QT_NAMESPACE { #endif diff --git a/tests/auto/tools/rcc/data/sizes/size-1.expected b/tests/auto/tools/rcc/data/sizes/size-1.expected index c29a378f44a..925de99c325 100644 --- a/tests/auto/tools/rcc/data/sizes/size-1.expected +++ b/tests/auto/tools/rcc/data/sizes/size-1.expected @@ -58,7 +58,9 @@ TIMESTAMP:data/data-1.txt # define QT_RCC_MANGLE_NAMESPACE(name) name #endif -#ifdef QT_NAMESPACE +#if defined(QT_INLINE_NAMESPACE) +inline namespace QT_NAMESPACE { +#elif defined(QT_NAMESPACE) namespace QT_NAMESPACE { #endif diff --git a/tests/auto/tools/rcc/data/sizes/size-2-0-35-1.expected b/tests/auto/tools/rcc/data/sizes/size-2-0-35-1.expected index 097572504d4..d858e15dbae 100644 --- a/tests/auto/tools/rcc/data/sizes/size-2-0-35-1.expected +++ b/tests/auto/tools/rcc/data/sizes/size-2-0-35-1.expected @@ -95,7 +95,9 @@ TIMESTAMP:data/data-1.txt # define QT_RCC_MANGLE_NAMESPACE(name) name #endif -#ifdef QT_NAMESPACE +#if defined(QT_INLINE_NAMESPACE) +inline namespace QT_NAMESPACE { +#elif defined(QT_NAMESPACE) namespace QT_NAMESPACE { #endif diff --git a/tests/auto/tools/rcc/data/sizes/size-2-0-35-1.expected32 b/tests/auto/tools/rcc/data/sizes/size-2-0-35-1.expected32 index a779dc07c83..a67e0ffc6e4 100644 --- a/tests/auto/tools/rcc/data/sizes/size-2-0-35-1.expected32 +++ b/tests/auto/tools/rcc/data/sizes/size-2-0-35-1.expected32 @@ -95,7 +95,9 @@ TIMESTAMP:data/data-1.txt # define QT_RCC_MANGLE_NAMESPACE(name) name #endif -#ifdef QT_NAMESPACE +#if defined(QT_INLINE_NAMESPACE) +inline namespace QT_NAMESPACE { +#elif defined(QT_NAMESPACE) namespace QT_NAMESPACE { #endif