A previous commit disabled QT_SUPPORTS_INT128 if the Standard Library doesn't properly specialize <type_traits> and <limits> for the 128-bit types, like libstdc++ in strict mode. As a consequence, we now need to compile Qt in non-strict mode so QT_SUPPORTS_INT128 is true when building Qt, at least if the compiler supports 128-bit integers in principle. Statically assert that QT_SUPPORTS_INT128 is defined if the compiler in principle supports it, to catch other problematic platforms early. We have a few out-of-line implementations that should be built if the compiler supports int128 in principle, so that Qt users are free to use the types if their compiler supports them and not run into missing support in the Qt library. This patch ensures this. Compiling in non-strict mode removes the early warning we were getting from it, but a) headersclean still uses strict mode, so at least our headers are regularly checked and b) this is a cross-platform project; if we were to use platform-specific extensions unprotected, other platform's compilers will still complain. Fixes: QTBUG-119901 Change-Id: I974f95ca0f26085dd0fe5ceb8bbef4f62467979a Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> (cherry picked from commit 30e04340dac26ebd09f9bc8ceb598e873ab63ba7) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
448 lines
14 KiB
CMake
448 lines
14 KiB
CMake
macro(qt_internal_get_add_library_option_args option_args)
|
|
set(${option_args}
|
|
SHARED
|
|
STATIC
|
|
MODULE
|
|
INTERFACE
|
|
NO_UNITY_BUILD
|
|
)
|
|
endmacro()
|
|
|
|
# Helper to create a library using the public _qt_internal_add_library function.
|
|
#
|
|
# The difference to _qt_internal_add_library is that MODULE is replaced with STATIC in a static
|
|
# Qt build.
|
|
# Everything else is just prepation for option validating.
|
|
function(qt_internal_add_common_qt_library_helper target)
|
|
qt_internal_get_add_library_option_args(option_args)
|
|
cmake_parse_arguments(PARSE_ARGV 1 arg
|
|
"${option_args}"
|
|
""
|
|
""
|
|
)
|
|
_qt_internal_validate_all_args_are_parsed(arg)
|
|
|
|
if(arg_SHARED)
|
|
set(arg_SHARED SHARED)
|
|
else()
|
|
set(arg_SHARED "")
|
|
endif()
|
|
|
|
if(arg_MODULE)
|
|
set(arg_MODULE MODULE)
|
|
else()
|
|
set(arg_MODULE "")
|
|
endif()
|
|
|
|
if(arg_STATIC)
|
|
set(arg_STATIC STATIC)
|
|
else()
|
|
set(arg_STATIC "")
|
|
endif()
|
|
|
|
if(arg_INTERFACE)
|
|
set(arg_INTERFACE INTERFACE)
|
|
else()
|
|
set(arg_INTERFACE "")
|
|
endif()
|
|
|
|
if(arg_MODULE AND NOT BUILD_SHARED_LIBS)
|
|
set(arg_MODULE STATIC)
|
|
endif()
|
|
|
|
_qt_internal_add_library(${target} ${arg_STATIC} ${arg_SHARED} ${arg_MODULE} ${arg_INTERFACE})
|
|
|
|
if(arg_NO_UNITY_BUILD)
|
|
set_property(TARGET "${target}" PROPERTY UNITY_BUILD OFF)
|
|
endif()
|
|
|
|
qt_internal_mark_as_internal_library(${target})
|
|
endfunction()
|
|
|
|
# Wrapper function to create a regular cmake target and forward all the
|
|
# arguments collected by the conversion script.
|
|
function(qt_internal_add_cmake_library target)
|
|
qt_internal_get_add_library_option_args(option_args)
|
|
set(single_args
|
|
OUTPUT_DIRECTORY
|
|
ARCHIVE_INSTALL_DIRECTORY
|
|
INSTALL_DIRECTORY
|
|
)
|
|
set(multi_args
|
|
${__default_private_args}
|
|
${__default_public_args}
|
|
)
|
|
|
|
cmake_parse_arguments(PARSE_ARGV 1 arg
|
|
"${option_args}"
|
|
"${single_args}"
|
|
"${multi_args}"
|
|
)
|
|
_qt_internal_validate_all_args_are_parsed(arg)
|
|
_qt_internal_validate_no_unity_build(arg)
|
|
|
|
qt_remove_args(library_helper_args
|
|
ARGS_TO_REMOVE
|
|
${single_args}
|
|
${multi_args}
|
|
ALL_ARGS
|
|
${option_args}
|
|
${single_args}
|
|
${multi_args}
|
|
ARGS
|
|
${ARGN}
|
|
)
|
|
|
|
qt_internal_add_common_qt_library_helper(${target} ${library_helper_args})
|
|
|
|
qt_skip_warnings_are_errors_when_repo_unclean("${target}")
|
|
|
|
if (arg_OUTPUT_DIRECTORY)
|
|
set_target_properties(${target} PROPERTIES
|
|
ARCHIVE_OUTPUT_DIRECTORY ${arg_OUTPUT_DIRECTORY}
|
|
RUNTIME_OUTPUT_DIRECTORY ${arg_OUTPUT_DIRECTORY}
|
|
LIBRARY_OUTPUT_DIRECTORY ${arg_OUTPUT_DIRECTORY}
|
|
)
|
|
endif()
|
|
|
|
qt_internal_extend_target("${target}"
|
|
SOURCES ${arg_SOURCES}
|
|
INCLUDE_DIRECTORIES
|
|
${arg_INCLUDE_DIRECTORIES}
|
|
SYSTEM_INCLUDE_DIRECTORIES
|
|
${arg_SYSTEM_INCLUDE_DIRECTORIES}
|
|
PUBLIC_INCLUDE_DIRECTORIES
|
|
${arg_PUBLIC_INCLUDE_DIRECTORIES}
|
|
PUBLIC_DEFINES
|
|
${arg_PUBLIC_DEFINES}
|
|
DEFINES
|
|
${arg_DEFINES}
|
|
PUBLIC_LIBRARIES ${arg_PUBLIC_LIBRARIES}
|
|
LIBRARIES ${arg_LIBRARIES} Qt::PlatformCommonInternal
|
|
COMPILE_OPTIONS ${arg_COMPILE_OPTIONS}
|
|
PUBLIC_COMPILE_OPTIONS ${arg_PUBLIC_COMPILE_OPTIONS}
|
|
LINK_OPTIONS ${arg_LINK_OPTIONS}
|
|
PUBLIC_LINK_OPTIONS ${arg_PUBLIC_LINK_OPTIONS}
|
|
MOC_OPTIONS ${arg_MOC_OPTIONS}
|
|
ENABLE_AUTOGEN_TOOLS ${arg_ENABLE_AUTOGEN_TOOLS}
|
|
DISABLE_AUTOGEN_TOOLS ${arg_DISABLE_AUTOGEN_TOOLS}
|
|
NO_UNITY_BUILD # Disabled by default
|
|
)
|
|
endfunction()
|
|
|
|
# This function replaces qmake's qt_helper_lib feature. It is intended to
|
|
# compile 3rdparty libraries as part of the build.
|
|
#
|
|
function(qt_internal_add_3rdparty_library target)
|
|
qt_internal_get_add_library_option_args(library_option_args)
|
|
|
|
set(option_args
|
|
EXCEPTIONS
|
|
INSTALL
|
|
SKIP_AUTOMOC
|
|
${__qt_internal_sbom_optional_args}
|
|
)
|
|
set(single_args
|
|
OUTPUT_DIRECTORY
|
|
QMAKE_LIB_NAME
|
|
${__qt_internal_sbom_single_args}
|
|
)
|
|
set(multi_args
|
|
${__default_private_args}
|
|
${__default_public_args}
|
|
${__qt_internal_sbom_multi_args}
|
|
)
|
|
|
|
cmake_parse_arguments(PARSE_ARGV 1 arg
|
|
"${library_option_args};${option_args}"
|
|
"${single_args}"
|
|
"${multi_args}"
|
|
)
|
|
_qt_internal_validate_all_args_are_parsed(arg)
|
|
_qt_internal_validate_no_unity_build(arg)
|
|
|
|
qt_remove_args(library_helper_args
|
|
ARGS_TO_REMOVE
|
|
${option_args}
|
|
${single_args}
|
|
${multi_args}
|
|
ALL_ARGS
|
|
${library_option_args}
|
|
${option_args}
|
|
${single_args}
|
|
${multi_args}
|
|
ARGS
|
|
${ARGN}
|
|
)
|
|
|
|
qt_internal_add_common_qt_library_helper(${target} ${library_helper_args})
|
|
|
|
set_target_properties(${target} PROPERTIES
|
|
_qt_module_interface_name "${target}"
|
|
_qt_package_version "${PROJECT_VERSION}"
|
|
_qt_package_name "${INSTALL_CMAKE_NAMESPACE}${target}"
|
|
_qt_module_is_3rdparty_library TRUE
|
|
)
|
|
|
|
set(export_properties
|
|
"_qt_module_interface_name"
|
|
"_qt_package_version"
|
|
"_qt_package_name"
|
|
"_qt_module_is_3rdparty_library"
|
|
)
|
|
|
|
set_property(TARGET ${target}
|
|
APPEND PROPERTY
|
|
EXPORT_PROPERTIES "${export_properties}")
|
|
|
|
qt_internal_add_qt_repo_known_module(${target})
|
|
qt_internal_add_target_aliases(${target})
|
|
|
|
qt_skip_warnings_are_errors_when_repo_unclean("${target}")
|
|
|
|
set_target_properties(${target} PROPERTIES
|
|
LIBRARY_OUTPUT_DIRECTORY "${QT_BUILD_DIR}/${INSTALL_LIBDIR}"
|
|
RUNTIME_OUTPUT_DIRECTORY "${QT_BUILD_DIR}/${INSTALL_BINDIR}"
|
|
ARCHIVE_OUTPUT_DIRECTORY "${QT_BUILD_DIR}/${INSTALL_LIBDIR}"
|
|
VERSION ${PROJECT_VERSION}
|
|
SOVERSION ${PROJECT_VERSION_MAJOR}
|
|
_qt_module_skip_depends_include TRUE
|
|
)
|
|
set_property(TARGET "${target}"
|
|
APPEND PROPERTY EXPORT_PROPERTIES _qt_module_is_3rdparty_library)
|
|
set_property(TARGET "${target}"
|
|
APPEND PROPERTY EXPORT_PROPERTIES _qt_module_skip_depends_include)
|
|
|
|
qt_handle_multi_config_output_dirs("${target}")
|
|
|
|
set_target_properties(${target} PROPERTIES
|
|
OUTPUT_NAME "${INSTALL_CMAKE_NAMESPACE}${target}"
|
|
)
|
|
|
|
if(NOT arg_INTERFACE)
|
|
qt_set_common_target_properties(${target})
|
|
endif()
|
|
|
|
if(NOT arg_SKIP_AUTOMOC)
|
|
qt_autogen_tools_initial_setup(${target})
|
|
endif()
|
|
|
|
if(NOT arg_EXCEPTIONS AND NOT arg_INTERFACE)
|
|
qt_internal_set_exceptions_flags("${target}" FALSE)
|
|
elseif(arg_EXCEPTIONS)
|
|
qt_internal_set_exceptions_flags("${target}" TRUE)
|
|
endif()
|
|
|
|
qt_internal_extend_target("${target}"
|
|
SOURCES ${arg_SOURCES}
|
|
INCLUDE_DIRECTORIES
|
|
${arg_INCLUDE_DIRECTORIES}
|
|
PUBLIC_INCLUDE_DIRECTORIES
|
|
${arg_PUBLIC_INCLUDE_DIRECTORIES}
|
|
PUBLIC_DEFINES
|
|
${arg_PUBLIC_DEFINES}
|
|
DEFINES
|
|
${arg_DEFINES}
|
|
PUBLIC_LIBRARIES ${arg_PUBLIC_LIBRARIES}
|
|
LIBRARIES ${arg_LIBRARIES} Qt::PlatformModuleInternal
|
|
COMPILE_OPTIONS ${arg_COMPILE_OPTIONS}
|
|
PUBLIC_COMPILE_OPTIONS ${arg_PUBLIC_COMPILE_OPTIONS}
|
|
LINK_OPTIONS ${arg_LINK_OPTIONS}
|
|
PUBLIC_LINK_OPTIONS ${arg_PUBLIC_LINK_OPTIONS}
|
|
MOC_OPTIONS ${arg_MOC_OPTIONS}
|
|
ENABLE_AUTOGEN_TOOLS ${arg_ENABLE_AUTOGEN_TOOLS}
|
|
DISABLE_AUTOGEN_TOOLS ${arg_DISABLE_AUTOGEN_TOOLS}
|
|
NO_UNITY_BUILD
|
|
)
|
|
|
|
if(NOT BUILD_SHARED_LIBS OR arg_INSTALL)
|
|
set(will_install TRUE)
|
|
else()
|
|
set(will_install FALSE)
|
|
endif()
|
|
|
|
if(will_install)
|
|
qt_generate_3rdparty_lib_pri_file("${target}" "${arg_QMAKE_LIB_NAME}" pri_file)
|
|
if(pri_file)
|
|
qt_install(FILES "${pri_file}" DESTINATION "${INSTALL_MKSPECSDIR}/modules")
|
|
endif()
|
|
|
|
set(path_suffix "${INSTALL_CMAKE_NAMESPACE}${target}")
|
|
qt_path_join(config_build_dir ${QT_CONFIG_BUILD_DIR} ${path_suffix})
|
|
qt_path_join(config_install_dir ${QT_CONFIG_INSTALL_DIR} ${path_suffix})
|
|
set(export_name "${INSTALL_CMAKE_NAMESPACE}${target}Targets")
|
|
|
|
qt_internal_get_min_new_policy_cmake_version(min_new_policy_version)
|
|
qt_internal_get_max_new_policy_cmake_version(max_new_policy_version)
|
|
configure_package_config_file(
|
|
"${QT_CMAKE_DIR}/Qt3rdPartyLibraryConfig.cmake.in"
|
|
"${config_build_dir}/${INSTALL_CMAKE_NAMESPACE}${target}Config.cmake"
|
|
INSTALL_DESTINATION "${config_install_dir}"
|
|
)
|
|
|
|
write_basic_package_version_file(
|
|
"${config_build_dir}/${INSTALL_CMAKE_NAMESPACE}${target}ConfigVersionImpl.cmake"
|
|
VERSION ${PROJECT_VERSION}
|
|
COMPATIBILITY AnyNewerVersion
|
|
)
|
|
qt_internal_write_qt_package_version_file(
|
|
"${INSTALL_CMAKE_NAMESPACE}${target}"
|
|
"${config_build_dir}/${INSTALL_CMAKE_NAMESPACE}${target}ConfigVersion.cmake"
|
|
)
|
|
|
|
qt_install(FILES
|
|
"${config_build_dir}/${INSTALL_CMAKE_NAMESPACE}${target}Config.cmake"
|
|
"${config_build_dir}/${INSTALL_CMAKE_NAMESPACE}${target}ConfigVersion.cmake"
|
|
"${config_build_dir}/${INSTALL_CMAKE_NAMESPACE}${target}ConfigVersionImpl.cmake"
|
|
DESTINATION "${config_install_dir}"
|
|
COMPONENT Devel
|
|
)
|
|
|
|
qt_install(TARGETS ${target}
|
|
EXPORT "${export_name}"
|
|
RUNTIME DESTINATION ${INSTALL_BINDIR}
|
|
LIBRARY DESTINATION ${INSTALL_LIBDIR}
|
|
ARCHIVE DESTINATION ${INSTALL_LIBDIR}
|
|
)
|
|
|
|
qt_install(EXPORT ${export_name}
|
|
NAMESPACE "${QT_CMAKE_EXPORT_NAMESPACE}::"
|
|
DESTINATION "${config_install_dir}"
|
|
)
|
|
|
|
qt_internal_export_additional_targets_file(
|
|
TARGETS ${target}
|
|
EXPORT_NAME_PREFIX ${INSTALL_CMAKE_NAMESPACE}${target}
|
|
CONFIG_INSTALL_DIR "${config_install_dir}"
|
|
)
|
|
|
|
qt_internal_export_modern_cmake_config_targets_file(
|
|
TARGETS ${target}
|
|
EXPORT_NAME_PREFIX ${INSTALL_CMAKE_NAMESPACE}${target}
|
|
CONFIG_BUILD_DIR "${config_build_dir}"
|
|
CONFIG_INSTALL_DIR "${config_install_dir}"
|
|
)
|
|
|
|
set(debug_install_dir "${INSTALL_LIBDIR}")
|
|
if (MINGW)
|
|
set(debug_install_dir "${INSTALL_BINDIR}")
|
|
endif()
|
|
qt_enable_separate_debug_info(${target} "${debug_install_dir}")
|
|
qt_internal_install_pdb_files(${target} "${INSTALL_LIBDIR}")
|
|
endif()
|
|
|
|
if(BUILD_SHARED_LIBS AND MSVC)
|
|
set_target_properties(${target} PROPERTIES
|
|
INTERPROCEDURAL_OPTIMIZATION OFF
|
|
)
|
|
endif()
|
|
|
|
if(QT_GENERATE_SBOM)
|
|
set(sbom_args "")
|
|
list(APPEND sbom_args TYPE QT_THIRD_PARTY_MODULE)
|
|
|
|
if(NOT will_install)
|
|
list(APPEND sbom_args NO_INSTALL)
|
|
endif()
|
|
|
|
qt_get_cmake_configurations(configs)
|
|
foreach(config IN LISTS configs)
|
|
_qt_internal_sbom_append_multi_config_aware_single_arg_option(
|
|
RUNTIME_PATH
|
|
"${INSTALL_BINDIR}"
|
|
"${config}"
|
|
sbom_args
|
|
)
|
|
_qt_internal_sbom_append_multi_config_aware_single_arg_option(
|
|
LIBRARY_PATH
|
|
"${INSTALL_LIBDIR}"
|
|
"${config}"
|
|
sbom_args
|
|
)
|
|
_qt_internal_sbom_append_multi_config_aware_single_arg_option(
|
|
ARCHIVE_PATH
|
|
"${INSTALL_LIBDIR}"
|
|
"${config}"
|
|
sbom_args
|
|
)
|
|
endforeach()
|
|
|
|
_qt_internal_forward_function_args(
|
|
FORWARD_APPEND
|
|
FORWARD_PREFIX arg
|
|
FORWARD_OUT_VAR sbom_args
|
|
FORWARD_OPTIONS
|
|
${__qt_internal_sbom_optional_args}
|
|
FORWARD_SINGLE
|
|
${__qt_internal_sbom_single_args}
|
|
FORWARD_MULTI
|
|
${__qt_internal_sbom_multi_args}
|
|
)
|
|
|
|
_qt_internal_extend_sbom(${target} ${sbom_args})
|
|
endif()
|
|
|
|
qt_add_list_file_finalizer(qt_internal_finalize_3rdparty_library ${target})
|
|
endfunction()
|
|
|
|
function(qt_internal_finalize_3rdparty_library target)
|
|
_qt_internal_finalize_sbom(${target})
|
|
endfunction()
|
|
|
|
function(qt_install_3rdparty_library_wrap_config_extra_file target)
|
|
if(TARGET "${target}")
|
|
set(use_bundled "ON")
|
|
else()
|
|
set(use_bundled "OFF")
|
|
endif()
|
|
|
|
set(QT_USE_BUNDLED_${target} "${use_bundled}" CACHE INTERNAL "")
|
|
set(extra_cmake_code "set(QT_USE_BUNDLED_${target} ${use_bundled} CACHE INTERNAL \"\")")
|
|
configure_file(
|
|
"${QT_CMAKE_DIR}/QtFindWrapConfigExtra.cmake.in"
|
|
"${QT_CONFIG_BUILD_DIR}/${INSTALL_CMAKE_NAMESPACE}/FindWrap${target}ConfigExtra.cmake"
|
|
@ONLY
|
|
)
|
|
|
|
qt_install(FILES
|
|
"${QT_CONFIG_BUILD_DIR}/${INSTALL_CMAKE_NAMESPACE}/FindWrap${target}ConfigExtra.cmake"
|
|
DESTINATION "${QT_CONFIG_INSTALL_DIR}/${INSTALL_CMAKE_NAMESPACE}"
|
|
COMPONENT Devel
|
|
)
|
|
endfunction()
|
|
|
|
# This function implements qmake's qt_helper_lib MODULE_EXT_HEADERS and MODULE_EXT_HEADERS_DIR features.
|
|
# It creates a header-only module exposing a subset or all headers of a 3rd-party library.
|
|
function(qt_internal_add_3rdparty_header_module target)
|
|
set(single_args
|
|
EXTERNAL_HEADERS_DIR
|
|
)
|
|
set(multi_args
|
|
EXTERNAL_HEADERS
|
|
)
|
|
cmake_parse_arguments(PARSE_ARGV 1 arg
|
|
"${option_args}"
|
|
"${single_args}"
|
|
"${multi_args}"
|
|
)
|
|
_qt_internal_validate_all_args_are_parsed(arg)
|
|
|
|
qt_internal_add_module(${target}
|
|
INTERNAL_MODULE
|
|
HEADER_MODULE
|
|
NO_CONFIG_HEADER_FILE
|
|
NO_GENERATE_CPP_EXPORTS
|
|
EXTERNAL_HEADERS ${arg_EXTERNAL_HEADERS}
|
|
EXTERNAL_HEADERS_DIR ${arg_EXTERNAL_HEADERS_DIR}
|
|
)
|
|
|
|
set_target_properties(${target} PROPERTIES
|
|
_qt_module_is_3rdparty_header_library TRUE
|
|
_qt_module_skip_depends_include TRUE
|
|
)
|
|
set_property(TARGET "${target}"
|
|
APPEND PROPERTY EXPORT_PROPERTIES _qt_module_is_3rdparty_header_library)
|
|
set_property(TARGET "${target}"
|
|
APPEND PROPERTY EXPORT_PROPERTIES _qt_module_skip_depends_include)
|
|
endfunction()
|