diff options
Diffstat (limited to 'cmake/QtPriHelpers.cmake')
-rw-r--r-- | cmake/QtPriHelpers.cmake | 323 |
1 files changed, 258 insertions, 65 deletions
diff --git a/cmake/QtPriHelpers.cmake b/cmake/QtPriHelpers.cmake index daeb62ff8f..b5e77c1b68 100644 --- a/cmake/QtPriHelpers.cmake +++ b/cmake/QtPriHelpers.cmake @@ -1,3 +1,6 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + # Extracts the 3rdparty libraries for the module ${module_name} # and stores the information in cmake language in # ${output_root_dir}/$<CONFIG>/${output_file_name}. @@ -11,7 +14,7 @@ function(qt_generate_qmake_libraries_pri_content module_name output_root_dir out set(implicit_include_dirs_regex "") foreach(dir ${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES}) qt_re_escape(regex "${dir}") - list(APPEND implicit_include_dirs_regex ${regex}) + list(APPEND implicit_include_dirs_regex "^${regex}$") endforeach() list(JOIN implicit_include_dirs_regex "|" implicit_include_dirs_regex) @@ -23,9 +26,14 @@ function(qt_generate_qmake_libraries_pri_content module_name output_root_dir out set(lib_incdir "") set(lib_libdir "") set(lib_libs "") + set(seen_targets "") while(lib_targets) list(POP_BACK lib_targets lib_target) if(TARGET ${lib_target}) + if(${lib_target} IN_LIST seen_targets) + continue() + endif() + list(APPEND seen_targets ${lib_target}) get_target_property(lib_target_type ${lib_target} TYPE) if(lib_target_type STREQUAL "INTERFACE_LIBRARY") get_target_property(iface_libs ${lib_target} INTERFACE_LINK_LIBRARIES) @@ -36,7 +44,16 @@ function(qt_generate_qmake_libraries_pri_content module_name output_root_dir out list(APPEND lib_libs "$<TARGET_LINKER_FILE:${lib_target}>") endif() list(APPEND lib_libdir "$<TARGET_PROPERTY:${lib_target},INTERFACE_LINK_DIRECTORIES>") - list(APPEND lib_incdir "$<TARGET_PROPERTY:${lib_target},INTERFACE_INCLUDE_DIRECTORIES>") + + get_target_property(skip_include_dir "${lib_target}" _qt_skip_include_dir_for_pri) + if(skip_include_dir) + set(target_include_dir "") + else() + set(target_include_dir + "$<TARGET_PROPERTY:${lib_target},INTERFACE_INCLUDE_DIRECTORIES>") + endif() + + list(APPEND lib_incdir "${target_include_dir}") list(APPEND lib_defines "$<TARGET_PROPERTY:${lib_target},INTERFACE_COMPILE_DEFINITIONS>") else() if(lib_target MATCHES "/([^/]+).framework$") @@ -81,13 +98,45 @@ set(QMAKE_DEPENDS_${uclib}_LD, ${deps}) endfunction() # Retrieves the public Qt module dependencies of the given Qt module or Qt Private module. +# The returned dependencies are "config module names", not target names. +# +# PRIVATE (OPTIONAL): +# Retrieve private dependencies only. Dependencies that appear in both, LINK_LIBRARIES and +# INTERFACE_LINK_LIBRARIES are discarded. +# function(qt_get_direct_module_dependencies target out_var) + cmake_parse_arguments(arg "PRIVATE" "" "" ${ARGN}) set(dependencies "") - get_target_property(libs ${target} INTERFACE_LINK_LIBRARIES) + get_target_property(target_type ${target} TYPE) + if(arg_PRIVATE) + if(target_type STREQUAL "INTERFACE_LIBRARY") + set(libs) + else() + get_target_property(libs ${target} LINK_LIBRARIES) + list(REMOVE_DUPLICATES libs) + endif() + get_target_property(public_libs ${target} INTERFACE_LINK_LIBRARIES) + list(REMOVE_DUPLICATES public_libs) + + # Remove all Qt::Foo and Qt6::Foo from libs that also appear in public_libs. + set(libs_to_remove "") + foreach(lib IN LISTS public_libs) + list(APPEND libs_to_remove "${lib}") + if(lib MATCHES "^Qt::(.*)") + list(APPEND libs_to_remove "${QT_CMAKE_EXPORT_NAMESPACE}::${CMAKE_MATCH_1}") + elseif(lib MATCHES "^{QT_CMAKE_EXPORT_NAMESPACE}::(.*)") + list(APPEND libs_to_remove "Qt::${CMAKE_MATCH_1}") + endif() + endforeach() + + list(REMOVE_DUPLICATES libs_to_remove) + list(REMOVE_ITEM libs ${libs_to_remove}) + else() + get_target_property(libs ${target} INTERFACE_LINK_LIBRARIES) + endif() if(NOT libs) set(libs "") endif() - get_target_property(target_type ${target} TYPE) while(libs) list(POP_FRONT libs lib) string(GENEX_STRIP "${lib}" lib) @@ -95,13 +144,10 @@ function(qt_get_direct_module_dependencies target out_var) continue() endif() get_target_property(lib_type ${lib} TYPE) - get_target_property(is_versionless_target ${lib} _qt_is_versionless_target) - if (lib_type STREQUAL "INTERFACE_LIBRARY" AND is_versionless_target) - # Found a version-less target like Qt::Core outside of qtbase. - # Skip this one and use what this target points to, e.g. Qt6::Core. - # Make sure to process Private interface libraries as-is. - get_target_property(ifacelibs ${lib} INTERFACE_LINK_LIBRARIES) - list(PREPEND libs ${ifacelibs}) + get_target_property(aliased_target ${lib} ALIASED_TARGET) + if(TARGET "${aliased_target}") + # If versionless target is alias, use what the alias points to. + list(PREPEND libs "${aliased_target}") continue() endif() if(lib_type STREQUAL "OBJECT_LIBRARY") @@ -120,14 +166,35 @@ function(qt_get_direct_module_dependencies target out_var) endfunction() # Return a list of qmake library names for a given list of targets. -# For example, Vulkan::Vulkan_nolink is mapped to vulkan/nolink. +# For example, Foo::Foo_nolink is mapped to foo/nolink. +# Also targets with the _qt_is_nolink_target property are mapped to nolink as well. function(qt_internal_map_targets_to_qmake_libs out_var) set(result "") foreach(target ${ARGN}) + # Unwrap optional targets. Needed for Vulkan. + if(target MATCHES "^\\$<TARGET_NAME_IF_EXISTS:(.*)>$") + set(target ${CMAKE_MATCH_1}) + endif() + + set(is_no_link_target FALSE) + + # First case of detecting nolink targets (possibly not needed anymore) string(REGEX REPLACE "_nolink$" "" stripped_target "${target}") + if(NOT target STREQUAL stripped_target) + set(is_no_link_target TRUE) + endif() + + # Second case of detecting nolink targets. + if(TARGET "${target}") + get_target_property(marked_as_no_link_target "${target}" _qt_is_nolink_target) + if(marked_as_no_link_target) + set(is_no_link_target TRUE) + endif() + endif() + qt_internal_map_target_to_qmake_lib(${stripped_target} qmake_lib) if(NOT "${qmake_lib}" STREQUAL "") - if(NOT target STREQUAL stripped_target) + if(is_no_link_target) string(APPEND qmake_lib "/nolink") endif() list(APPEND result "${qmake_lib}") @@ -136,9 +203,63 @@ function(qt_internal_map_targets_to_qmake_libs out_var) set(${out_var} "${result}" PARENT_SCOPE) endfunction() +# Retrieve the runtime dependencies of module ${target}. +# The runtime dependencies are what in CMake is called IMPORTED_LINK_DEPENDENT_LIBRARIES. +# This function returns the dependencies in out_var, separated by space. +# +# PUBLIC_DEPENDENCIES: +# List of the module's public dependencies. +# The dependencies are expected to be config module names. +# +# PUBLIC (OPTIONAL): +# Specifies that target is a public module. +# If not specified, a private module is assumed. +# +function(qt_internal_get_module_run_dependencies out_var target) + cmake_parse_arguments(arg "PUBLIC" "" "PUBLIC_DEPENDENCIES" ${ARGN}) + + # Private dependencies of the module are runtime dependencies. + qt_get_direct_module_dependencies(${target} run_dependencies PRIVATE) + + # If ${target} is a public module then public dependencies + # of the private module are also runtime dependencies. + if(arg_PUBLIC AND TARGET ${target}Private) + qt_get_direct_module_dependencies(${target}Private qt_for_private) + + # FooPrivate depends on Foo, but we must not record this dependency in run_depends. + get_target_property(config_module_name ${target} _qt_config_module_name) + list(REMOVE_ITEM qt_for_private ${config_module_name}) + + list(APPEND run_dependencies ${qt_for_private}) + endif() + + list(REMOVE_DUPLICATES run_dependencies) + + # If foo-private is a private dependency and foo is a public dependency, + # we don't have to add foo-private as runtime dependency. + set(deps_to_remove "") + foreach(dep IN LISTS run_dependencies) + if(NOT dep MATCHES "(.*)_private$") + continue() + endif() + + # Is foo a public dependency? + list(FIND arg_PUBLIC_DEPENDENCIES "${CMAKE_MATCH_1}" idx) + if(idx GREATER -1) + list(APPEND deps_to_remove "${dep}") + endif() + endforeach() + if(NOT "${deps_to_remove}" STREQUAL "") + list(REMOVE_ITEM run_dependencies ${deps_to_remove}) + endif() + + list(JOIN run_dependencies " " run_dependencies) + set("${out_var}" "${run_dependencies}" PARENT_SCOPE) +endfunction() + # Generates module .pri files for consumption by qmake function(qt_generate_module_pri_file target) - set(flags INTERNAL_MODULE HEADER_MODULE NO_PRIVATE_MODULE) + set(flags INTERNAL_MODULE NO_PRIVATE_MODULE) set(options) set(multiopts) cmake_parse_arguments(arg "${flags}" "${options}" "${multiopts}" ${ARGN}) @@ -147,7 +268,13 @@ function(qt_generate_module_pri_file target) set(pri_files) set(property_prefix) - if(arg_HEADER_MODULE) + + get_target_property(target_type ${target} TYPE) + set(is_interface_lib FALSE) + if(target_type STREQUAL "INTERFACE_LIBRARY") + set(is_interface_lib TRUE) + endif() + if(is_interface_lib) set(property_prefix "INTERFACE_") endif() @@ -198,13 +325,15 @@ function(qt_generate_module_pri_file target) list(APPEND module_internal_config staticlib) endif() - # TODO: Add the value 'ltcg' to module_internal_config if LTCG is turned on. + if(QT_FEATURE_ltcg) + list(APPEND module_internal_config ltcg) + endif() list(JOIN module_internal_config " " joined_module_internal_config) get_target_property(config_module_name ${target} _qt_config_module_name) get_target_property(qmake_module_config ${target} ${property_prefix}QT_QMAKE_MODULE_CONFIG) - if (arg_HEADER_MODULE) + if (is_interface_lib) list(APPEND qmake_module_config "no_link") endif() if(qmake_module_config) @@ -221,21 +350,20 @@ function(qt_generate_module_pri_file target) set(public_module_frameworks "${framework_base_path}") set(private_module_includes "${framework_base_path}/${fw_private_header_dir} \ ${framework_base_path}/${fw_private_module_header_dir}") - set(module_name_in_pri "${module}") else() set(public_module_includes "$$QT_MODULE_INCLUDE_BASE $$QT_MODULE_INCLUDE_BASE/${module}") set(public_module_frameworks "") - set(private_module_includes "$$QT_MODULE_INCLUDE_BASE/${module}/${PROJECT_VERSION} $$QT_MODULE_INCLUDE_BASE/${module}/${PROJECT_VERSION}/${module}") - set(module_name_in_pri "${module_versioned}") + set(private_module_includes "$$QT_MODULE_INCLUDE_BASE/${module_versioned_include_dir} \ +$$QT_MODULE_INCLUDE_BASE/${module_versioned_inner_include_dir}") endif() - if(arg_HEADER_MODULE) + if(is_interface_lib) set(module_name_in_pri "") else() - set(module_name_in_pri "${module_name_in_pri}${QT_LIBINFIX}") + get_target_property(module_name_in_pri ${target} OUTPUT_NAME) endif() - get_target_property(hasModuleHeaders ${target} INTERFACE_MODULE_HAS_HEADERS) + get_target_property(hasModuleHeaders ${target} _qt_module_has_headers) if (NOT hasModuleHeaders) unset(public_module_includes) unset(private_module_includes) @@ -246,15 +374,14 @@ ${framework_base_path}/${fw_private_module_header_dir}") set(config_module_name_base "${config_module_name}") if (arg_INTERNAL_MODULE) - string(APPEND config_module_name "_private") # Internal module pri needs to provide private headers - set(public_module_includes "${private_module_includes}") + set(public_module_includes "${public_module_includes} ${private_module_includes}") endif() qt_path_join(target_path ${QT_BUILD_DIR} ${INSTALL_MKSPECSDIR}/modules) unset(private_module_frameworks) - if(arg_HEADER_MODULE) + if(is_interface_lib) set(module_plugin_types "") else() get_target_property(module_plugin_types ${target} QMAKE_MODULE_PLUGIN_TYPES) @@ -271,8 +398,8 @@ ${framework_base_path}/${fw_private_module_header_dir}") "\nQT.${config_module_name}.plugin_types = ${module_plugin_types}") endif() - qt_get_direct_module_dependencies(${target} public_module_dependencies) - list(JOIN public_module_dependencies " " public_module_dependencies) + qt_get_direct_module_dependencies(${target} public_module_dependencies_list) + list(JOIN public_module_dependencies_list " " public_module_dependencies) set(public_module_dependencies "${module_depends} ${public_module_dependencies}") qt_path_join(pri_file_name "${target_path}" "qt_lib_${config_module_name}.pri") @@ -299,10 +426,12 @@ ${framework_base_path}/${fw_private_module_header_dir}") qt_internal_map_targets_to_qmake_libs(module_uses ${dep_targets}) list(JOIN module_uses " " joined_module_uses) - file(GENERATE - OUTPUT "${pri_file_name}" - CONTENT - "QT.${config_module_name}.VERSION = ${PROJECT_VERSION} + # Retrieve the public module's runtime dependencies. + qt_internal_get_module_run_dependencies(public_module_run_dependencies ${target} + PUBLIC + PUBLIC_DEPENDENCIES "${public_module_dependencies_list}") + + set(content "QT.${config_module_name}.VERSION = ${PROJECT_VERSION} QT.${config_module_name}.name = ${module} QT.${config_module_name}.module = ${module_name_in_pri} QT.${config_module_name}.libs = $$QT_MODULE_LIB_BASE @@ -311,7 +440,13 @@ QT.${config_module_name}.includes = ${public_module_includes} QT.${config_module_name}.frameworks = ${public_module_frameworks} QT.${config_module_name}.bins = $$QT_MODULE_BIN_BASE${module_plugin_types_assignment} QT.${config_module_name}.depends = ${public_module_dependencies} -QT.${config_module_name}.uses = ${joined_module_uses} +") + if(NOT "${public_module_run_dependencies}" STREQUAL "") + string(APPEND content + "QT.${config_module_name}.run_depends = ${public_module_run_dependencies}\n") + endif() + string(APPEND content + "QT.${config_module_name}.uses = ${joined_module_uses} QT.${config_module_name}.module_config = ${joined_module_internal_config}${module_build_config} QT.${config_module_name}.DEFINES = ${joined_target_defines} QT.${config_module_name}.enabled_features = ${enabled_features} @@ -319,8 +454,8 @@ QT.${config_module_name}.disabled_features = ${disabled_features}${extra_assignm QT_CONFIG += ${enabled_features} QT_MODULES += ${config_module_name_base} ${module_pri_extra_content} -" - ) +") + file(GENERATE OUTPUT "${pri_file_name}" CONTENT "${content}") if (NOT arg_NO_PRIVATE_MODULE AND NOT arg_INTERNAL_MODULE) set(pri_data_cmake_file "qt_lib_${config_module_name}_private.cmake") @@ -330,7 +465,7 @@ ${module_pri_extra_content} set(private_pri_file_name "qt_lib_${config_module_name}_private.pri") set(private_module_dependencies "") - if(NOT arg_HEADER_MODULE) + if(NOT is_interface_lib) qt_get_direct_module_dependencies(${target}Private private_module_dependencies) endif() list(JOIN private_module_dependencies " " private_module_dependencies) @@ -344,22 +479,33 @@ ${module_pri_extra_content} qt_internal_map_targets_to_qmake_libs(private_module_uses ${dep_targets}) list(JOIN private_module_uses " " joined_private_module_uses) + # Retrieve the private module's runtime dependencies. + qt_internal_get_module_run_dependencies(private_module_run_dependencies ${target}Private + PUBLIC_DEPENDENCIES "${dep_targets}") + # Generate a preliminary qt_lib_XXX_private.pri file - file(GENERATE - OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${private_pri_file_name}" - CONTENT - "QT.${config_module_name}_private.VERSION = ${PROJECT_VERSION} + set(content + "QT.${config_module_name}_private.VERSION = ${PROJECT_VERSION} QT.${config_module_name}_private.name = ${module} QT.${config_module_name}_private.module = QT.${config_module_name}_private.libs = $$QT_MODULE_LIB_BASE QT.${config_module_name}_private.includes = ${private_module_includes} QT.${config_module_name}_private.frameworks = ${private_module_frameworks} QT.${config_module_name}_private.depends = ${private_module_dependencies} -QT.${config_module_name}_private.uses = ${joined_private_module_uses} +") + if(NOT "${private_module_run_dependencies}" STREQUAL "") + string(APPEND content + "QT.${config_module_name}_private.run_depends = ${private_module_run_dependencies} +") + endif() + string(APPEND content + "QT.${config_module_name}_private.uses = ${joined_private_module_uses} QT.${config_module_name}_private.module_config = ${joined_module_internal_config} QT.${config_module_name}_private.enabled_features = ${enabled_private_features} -QT.${config_module_name}_private.disabled_features = ${disabled_private_features}" - ) +QT.${config_module_name}_private.disabled_features = ${disabled_private_features}") + file(GENERATE + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${private_pri_file_name}" + CONTENT "${content}") if(QT_GENERATOR_IS_MULTI_CONFIG) set(configs ${CMAKE_CONFIGURATION_TYPES}) @@ -381,8 +527,10 @@ QT.${config_module_name}_private.disabled_features = ${disabled_private_features ${CMAKE_STATIC_LIBRARY_SUFFIX}) if(MSVC) set(link_library_flag "-l") + file(TO_CMAKE_PATH "$ENV{LIB};${CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES}" implicit_link_directories) else() set(link_library_flag ${CMAKE_LINK_LIBRARY_FLAG}) + set(implicit_link_directories ${CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES}) endif() add_custom_command( OUTPUT "${private_pri_file_path}" @@ -394,15 +542,18 @@ QT.${config_module_name}_private.disabled_features = ${disabled_private_features "-DLIBRARY_SUFFIXES=${library_suffixes}" "-DLINK_LIBRARY_FLAG=${link_library_flag}" "-DCONFIGS=${configs}" - "-DIMPLICIT_LINK_DIRECTORIES=${CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES}" + "-DIMPLICIT_LINK_DIRECTORIES=${implicit_link_directories}" -P "${QT_CMAKE_DIR}/QtGenerateLibPri.cmake" VERBATIM) - add_custom_target(${target}_lib_pri DEPENDS "${private_pri_file_path}") - if(arg_HEADER_MODULE) - add_dependencies(${target}_timestamp ${target}_lib_pri) - else() - add_dependencies(${target} ${target}_lib_pri) + # add_dependencies has no effect when adding interface libraries. So need to add the + # '_lib_pri' targets to ALL to make sure that the related rules executed. + unset(add_pri_target_to_all) + if(is_interface_lib) + set(add_pri_target_to_all ALL) endif() + add_custom_target(${target}_lib_pri ${add_pri_target_to_all} + DEPENDS "${private_pri_file_path}") + add_dependencies(${target} ${target}_lib_pri) endif() qt_install(FILES "${pri_files}" DESTINATION ${INSTALL_MKSPECSDIR}/modules) @@ -456,12 +607,21 @@ endfunction() # - generic # - platform, if the plugin is not the default QPA plugin # Otherwise, this variable is empty. -function(qt_generate_plugin_pri_file target pri_file_var) +function(qt_generate_plugin_pri_file target) get_target_property(plugin_name ${target} OUTPUT_NAME) get_target_property(plugin_type ${target} QT_PLUGIN_TYPE) get_target_property(qmake_plugin_type ${target} QT_QMAKE_PLUGIN_TYPE) get_target_property(default_plugin ${target} QT_DEFAULT_PLUGIN) get_target_property(plugin_class_name ${target} QT_PLUGIN_CLASS_NAME) + get_target_property(plugin_pri_extra_content ${target} QT_PLUGIN_PRI_EXTRA_CONTENT) + + foreach(var plugin_pri_extra_content) + if(${var} STREQUAL "${var}-NOTFOUND") + set(${var} "") + else() + string(REPLACE ";" "\n" ${var} "${${var}}") + endif() + endforeach() set(plugin_extends "") if(NOT default_plugin) @@ -478,16 +638,28 @@ function(qt_generate_plugin_pri_file target pri_file_var) list(REMOVE_DUPLICATES plugin_deps) list(JOIN plugin_deps " " plugin_deps) + list(APPEND module_config v2) + get_target_property(target_type ${target} TYPE) + if(target_type STREQUAL "STATIC_LIBRARY") + list(APPEND module_config staticlib) + endif() + list(JOIN module_config " " module_config) + qt_path_join(pri_target_path ${QT_BUILD_DIR} ${INSTALL_MKSPECSDIR}/modules) qt_path_join(pri_file "${pri_target_path}" "qt_plugin_${plugin_name}.pri") - qt_configure_file(OUTPUT "${pri_file}" - CONTENT "QT_PLUGIN.${plugin_name}.TYPE = ${qmake_plugin_type} + + set(content "QT_PLUGIN.${plugin_name}.TYPE = ${qmake_plugin_type} QT_PLUGIN.${plugin_name}.EXTENDS = ${plugin_extends} QT_PLUGIN.${plugin_name}.DEPENDS = ${plugin_deps} QT_PLUGIN.${plugin_name}.CLASS_NAME = ${plugin_class_name} +QT_PLUGIN.${plugin_name}.module_config = ${module_config} QT_PLUGINS += ${plugin_name} -") - set(${pri_file_var} "${pri_file}" PARENT_SCOPE) +${plugin_pri_extra_content}" +) + + file(GENERATE OUTPUT "${pri_file}" CONTENT "${content}") + + qt_install(FILES "${pri_file}" DESTINATION "${INSTALL_MKSPECSDIR}/modules") endfunction() # Creates mkspecs/qconfig.pri which contains public global features among other things. @@ -577,6 +749,10 @@ QT_PATCH_VERSION = ${PROJECT_VERSION_PATCH} set(compiler_version_major_var_name "QT_APPLE_CLANG_MAJOR_VERSION") set(compiler_version_minor_var_name "QT_APPLE_CLANG_MINOR_VERSION") set(compiler_version_patch_var_name "QT_APPLE_CLANG_PATCH_VERSION") + elseif(IntelLLVM) + set(compiler_version_major_var_name "QT_INTELLLVM_MAJOR_VERSION") + set(compiler_version_minor_var_name "QT_INTELLLVM_MINOR_VERSION") + set(compiler_version_patch_var_name "QT_INTELLLVM_PATCH_VERSION") elseif(CLANG) set(compiler_version_major_var_name "QT_CLANG_MAJOR_VERSION") set(compiler_version_minor_var_name "QT_CLANG_MINOR_VERSION") @@ -585,10 +761,6 @@ QT_PATCH_VERSION = ${PROJECT_VERSION_PATCH} set(compiler_version_major_var_name "QT_GCC_MAJOR_VERSION") set(compiler_version_minor_var_name "QT_GCC_MINOR_VERSION") set(compiler_version_patch_var_name "QT_GCC_PATCH_VERSION") - elseif(ICC) - set(compiler_version_major_var_name "QT_ICC_MAJOR_VERSION") - set(compiler_version_minor_var_name "QT_ICC_MINOR_VERSION") - set(compiler_version_patch_var_name "QT_ICC_PATCH_VERSION") elseif(MSVC) set(compiler_version_major_var_name "QT_MSVC_MAJOR_VERSION") set(compiler_version_minor_var_name "QT_MSVC_MINOR_VERSION") @@ -606,8 +778,23 @@ QT_PATCH_VERSION = ${PROJECT_VERSION_PATCH} if(APPLE) list(APPEND extra_statements "QT_MAC_SDK_VERSION = ${QT_MAC_SDK_VERSION}") - list(APPEND extra_statements - "QMAKE_MACOSX_DEPLOYMENT_TARGET = ${CMAKE_OSX_DEPLOYMENT_TARGET}") + if(NOT CMAKE_SYSTEM_NAME OR CMAKE_SYSTEM_NAME STREQUAL "Darwin") + # macOS + list(APPEND extra_statements + "QMAKE_MACOSX_DEPLOYMENT_TARGET = ${CMAKE_OSX_DEPLOYMENT_TARGET}") + list(APPEND extra_statements + "QT_MAC_SDK_VERSION_MIN = ${QT_SUPPORTED_MIN_MACOS_SDK_VERSION}") + list(APPEND extra_statements + "QT_MAC_SDK_VERSION_MAX = ${QT_SUPPORTED_MAX_MACOS_SDK_VERSION}") + elseif(CMAKE_SYSTEM_NAME STREQUAL iOS) + list(APPEND extra_statements + "QMAKE_IOS_DEPLOYMENT_TARGET = ${CMAKE_OSX_DEPLOYMENT_TARGET}") + list(APPEND extra_statements + "QT_MAC_SDK_VERSION_MIN = ${QT_SUPPORTED_MIN_IOS_SDK_VERSION}") + list(APPEND extra_statements + "QT_MAC_SDK_VERSION_MAX = ${QT_SUPPORTED_MAX_IOS_SDK_VERSION}") + endif() + if (CMAKE_OSX_ARCHITECTURES) list(APPEND architectures "${CMAKE_OSX_ARCHITECTURES}") string (REPLACE ";" " " architectures "${architectures}") @@ -651,11 +838,15 @@ function(qt_generate_global_device_pri_file) # Write android specific device info. if(ANDROID) + file(TO_CMAKE_PATH ${ANDROID_SDK_ROOT} ANDROID_SDK_ROOT) string(APPEND content "DEFAULT_ANDROID_SDK_ROOT = ${ANDROID_SDK_ROOT}\n") + file(TO_CMAKE_PATH ${ANDROID_NDK} ANDROID_NDK) string(APPEND content "DEFAULT_ANDROID_NDK_ROOT = ${ANDROID_NDK}\n") set(android_platform "android-23") - if(ANDROID_NATIVE_API_LEVEL) + if(ANDROID_PLATFORM) + set(android_platform "${ANDROID_PLATFORM}") + elseif(ANDROID_NATIVE_API_LEVEL) set(android_platform "android-${ANDROID_NATIVE_API_LEVEL}") endif() string(APPEND content "DEFAULT_ANDROID_PLATFORM = ${android_platform}\n") @@ -673,8 +864,8 @@ function(qt_generate_global_device_pri_file) endif() endif() - if(QT_UIKIT_SDK) - string(APPEND content "QMAKE_MAC_SDK = ${QT_UIKIT_SDK}\n") + if(QT_APPLE_SDK) + string(APPEND content "QMAKE_MAC_SDK = ${QT_APPLE_SDK}\n") endif() set(gcc_machine_dump "") @@ -698,7 +889,7 @@ function(qt_get_build_parts out_var) list(APPEND parts "tests") endif() - if(NOT CMAKE_CROSSCOMPILING OR QT_BUILD_TOOLS_WHEN_CROSSCOMPILING) + if(NOT CMAKE_CROSSCOMPILING OR QT_FORCE_BUILD_TOOLS) list(APPEND parts "tools") endif() @@ -804,8 +995,10 @@ CONFIG += ${private_config_joined} ${CMAKE_STATIC_LIBRARY_SUFFIX}) if(MSVC) set(link_library_flag "-l") + file(TO_CMAKE_PATH "$ENV{LIB};${CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES}" implicit_link_directories) else() set(link_library_flag ${CMAKE_LINK_LIBRARY_FLAG}) + set(implicit_link_directories ${CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES}) endif() add_custom_command( OUTPUT "${qmodule_pri_target_path}" @@ -817,7 +1010,7 @@ CONFIG += ${private_config_joined} "-DLIBRARY_SUFFIXES=${library_suffixes}" "-DLINK_LIBRARY_FLAG=${link_library_flag}" "-DCONFIGS=${configs}" - "-DIMPLICIT_LINK_DIRECTORIES=${CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES}" + "-DIMPLICIT_LINK_DIRECTORIES=${implicit_link_directories}" -P "${QT_CMAKE_DIR}/QtGenerateLibPri.cmake" VERBATIM) add_custom_target(qmodule_pri DEPENDS "${qmodule_pri_target_path}") |