diff options
Diffstat (limited to 'cmake')
-rw-r--r-- | cmake/QtModuleHelpers.cmake | 109 | ||||
-rw-r--r-- | cmake/modulecppexports.h.in | 6 | ||||
-rw-r--r-- | cmake/modulecppexports_p.h.in | 58 |
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 |