summaryrefslogtreecommitdiffstats
path: root/cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake')
-rw-r--r--cmake/QtModuleHelpers.cmake109
-rw-r--r--cmake/modulecppexports.h.in6
-rw-r--r--cmake/modulecppexports_p.h.in58
3 files changed, 149 insertions, 24 deletions
diff --git a/cmake/QtModuleHelpers.cmake b/cmake/QtModuleHelpers.cmake
index eeebd05de9..39088a64fd 100644
--- a/cmake/QtModuleHelpers.cmake
+++ b/cmake/QtModuleHelpers.cmake
@@ -21,7 +21,6 @@ macro(qt_internal_get_internal_add_module_keywords option_args single_args multi
CONFIG_MODULE_NAME
PRECOMPILED_HEADER
CONFIGURE_FILE_PATH
- CPP_EXPORT_HEADER_NAME
${__default_target_info_args}
)
set(${multi_args}
@@ -35,6 +34,16 @@ macro(qt_internal_get_internal_add_module_keywords option_args single_args multi
)
endmacro()
+macro(qt_internal_get_generate_cpp_global_exports_keywords option_args single_args multi_args)
+ set(${option_args}
+ GENERATE_PRIVATE_CPP_EXPORTS
+ )
+ set(${single_args}
+ CPP_EXPORT_HEADER_BASE_NAME
+ )
+ set(${multi_args} "")
+endmacro()
+
# This is the main entry function for creating a Qt module, that typically
# consists of a library, public header files, private header files and configurable
# features.
@@ -62,9 +71,30 @@ endmacro()
#
function(qt_internal_add_module target)
qt_internal_get_internal_add_module_keywords(
- option_args
- single_args
- multi_args
+ module_option_args
+ module_single_args
+ module_multi_args
+ )
+
+ qt_internal_get_generate_cpp_global_exports_keywords(
+ cpp_exports_option_args
+ cpp_exports_single_args
+ cpp_exports_multi_args
+ )
+
+ set(option_args
+ ${module_option_args}
+ ${cpp_exports_option_args}
+ )
+
+ set(single_args
+ ${module_single_args}
+ ${cpp_exports_single_args}
+ )
+
+ set(multi_args
+ ${module_multi_args}
+ ${cpp_exports_multi_args}
)
qt_parse_all_arguments(arg "qt_internal_add_module"
@@ -154,15 +184,6 @@ function(qt_internal_add_module target)
string(REPLACE "-" "_" module_define_infix "${module_define_infix}")
string(REPLACE "." "_" module_define_infix "${module_define_infix}")
- if(arg_GENERATE_CPP_EXPORTS)
- if(arg_CPP_EXPORT_HEADER_NAME)
- set(cpp_export_header_name "CPP_EXPORT_HEADER_NAME;${arg_CPP_EXPORT_HEADER_NAME}")
- endif()
- qt_internal_generate_cpp_global_exports(${target} ${module_define_infix}
- "${cpp_export_header_name}"
- )
- endif()
-
set(property_prefix "INTERFACE_")
if(NOT arg_HEADER_MODULE)
qt_set_common_target_properties(${target})
@@ -316,6 +337,25 @@ function(qt_internal_add_module target)
### FIXME: Can we replace headers.pri?
qt_read_headers_pri("${module_build_interface_include_dir}" "module_headers")
+ if(arg_GENERATE_CPP_EXPORTS)
+ if(arg_CPP_EXPORT_HEADER_BASE_NAME)
+ set(cpp_export_header_base_name
+ "CPP_EXPORT_HEADER_BASE_NAME;${arg_CPP_EXPORT_HEADER_BASE_NAME}"
+ )
+ endif()
+ if(arg_GENERATE_PRIVATE_CPP_EXPORTS)
+ set(generate_private_cpp_export "GENERATE_PRIVATE_CPP_EXPORTS")
+ endif()
+ qt_internal_generate_cpp_global_exports(${target} ${module_define_infix}
+ generated_public_cpp_export
+ generated_private_cpp_export
+ "${cpp_export_header_base_name}"
+ "${generate_private_cpp_export}"
+ )
+ list(APPEND module_headers_public "${generated_public_cpp_export}")
+ list(APPEND module_headers_private "${generated_private_cpp_export}")
+ endif()
+
set(module_depends_header
"${module_build_interface_include_dir}/${module_include_name}Depends")
if(is_framework)
@@ -922,24 +962,51 @@ function(qt_describe_module target)
qt_install(FILES "${descfile_out}" DESTINATION "${install_dir}")
endfunction()
-function(qt_internal_generate_cpp_global_exports target module_define_infix)
+function(qt_internal_generate_cpp_global_exports target module_define_infix
+ out_public_header out_private_header)
+
+ qt_internal_get_generate_cpp_global_exports_keywords(
+ option_args
+ single_args
+ multi_args
+ )
+
cmake_parse_arguments(arg
- ""
- "CPP_EXPORT_HEADER_NAME"
- "" ${ARGN})
+ "${option_args}"
+ "${single_args}"
+ "${multi_args}" ${ARGN}
+ )
+
qt_internal_module_info(module "${target}")
- if(NOT arg_CPP_EXPORT_HEADER_NAME)
- set(arg_CPP_EXPORT_HEADER_NAME "qt${module_lower}exports.h")
+
+ set(header_base_name "qt${module_lower}exports")
+ if(arg_CPP_EXPORT_HEADER_BASE_NAME)
+ set(header_base_name "${arg_CPP_EXPORT_HEADER_BASE_NAME}")
endif()
+ # Is used as a part of the header guard define.
+ string(TOUPPER "${header_base_name}" header_base_name_upper)
set(generated_header_path
- "${module_build_interface_include_dir}/${arg_CPP_EXPORT_HEADER_NAME}"
+ "${module_build_interface_include_dir}/${header_base_name}.h"
)
configure_file("${QT_CMAKE_DIR}/modulecppexports.h.in"
"${generated_header_path}" @ONLY
)
+ set(${out_public_header} "${generated_header_path}" PARENT_SCOPE)
target_sources(${target} PRIVATE "${generated_header_path}")
- set_property(TARGET ${target} APPEND PROPERTY PUBLIC_HEADER "${generated_header_path}")
+
+ if(arg_GENERATE_PRIVATE_CPP_EXPORTS)
+ set(generated_private_header_path
+ "${module_build_interface_private_include_dir}/${header_base_name}_p.h"
+ )
+
+ configure_file("${QT_CMAKE_DIR}/modulecppexports_p.h.in"
+ "${generated_private_header_path}" @ONLY
+ )
+
+ set(${out_private_header} "${generated_private_header_path}" PARENT_SCOPE)
+ target_sources(${target} PRIVATE "${generated_private_header_path}")
+ endif()
endfunction()
diff --git a/cmake/modulecppexports.h.in b/cmake/modulecppexports.h.in
index fb5c0d918c..68b0353a97 100644
--- a/cmake/modulecppexports.h.in
+++ b/cmake/modulecppexports.h.in
@@ -37,8 +37,8 @@
**
****************************************************************************/
-#ifndef QT@module_define_infix@EXPORTS_H
-#define QT@module_define_infix@EXPORTS_H
+#ifndef @header_base_name_upper@_H
+#define @header_base_name_upper@_H
#include <QtCore/qglobal.h>
@@ -52,4 +52,4 @@
# define Q_@module_define_infix@_EXPORT
#endif
-#endif // QT@module_define_infix@EXPORTS_H
+#endif // @header_base_name_upper@_H
diff --git a/cmake/modulecppexports_p.h.in b/cmake/modulecppexports_p.h.in
new file mode 100644
index 0000000000..5912bbba70
--- /dev/null
+++ b/cmake/modulecppexports_p.h.in
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the @module@ module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef @header_base_name_upper@_P_H
+#define @header_base_name_upper@_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <@module_include_name@/@header_base_name@.h>
+
+#define Q_@module_define_infix@_PRIVATE_EXPORT Q_@module_define_infix@_EXPORT
+
+#endif // @header_base_name_upper@_P_H