summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cmake/FindWrapOpenSSLHeaders.cmake3
-rw-r--r--cmake/FindWrapVulkanHeaders.cmake6
-rw-r--r--cmake/QtFindPackageHelpers.cmake23
-rw-r--r--cmake/QtPostProcessHelpers.cmake8
-rw-r--r--cmake/QtPriHelpers.cmake36
-rw-r--r--cmake/QtPublicWalkLibsHelpers.cmake7
-rw-r--r--cmake/QtTargetHelpers.cmake37
-rw-r--r--src/gui/CMakeLists.txt6
-rw-r--r--src/opengl/CMakeLists.txt6
9 files changed, 124 insertions, 8 deletions
diff --git a/cmake/FindWrapOpenSSLHeaders.cmake b/cmake/FindWrapOpenSSLHeaders.cmake
index ea422a68ba..afaf77ac48 100644
--- a/cmake/FindWrapOpenSSLHeaders.cmake
+++ b/cmake/FindWrapOpenSSLHeaders.cmake
@@ -28,6 +28,9 @@ if(OPENSSL_INCLUDE_DIR)
add_library(WrapOpenSSLHeaders::WrapOpenSSLHeaders INTERFACE IMPORTED)
target_include_directories(WrapOpenSSLHeaders::WrapOpenSSLHeaders INTERFACE
${OPENSSL_INCLUDE_DIR})
+
+ set_target_properties(WrapOpenSSLHeaders::WrapOpenSSLHeaders PROPERTIES
+ _qt_is_nolink_target TRUE)
endif()
include(FindPackageHandleStandardArgs)
diff --git a/cmake/FindWrapVulkanHeaders.cmake b/cmake/FindWrapVulkanHeaders.cmake
index 766f1e29eb..ccbcf7f708 100644
--- a/cmake/FindWrapVulkanHeaders.cmake
+++ b/cmake/FindWrapVulkanHeaders.cmake
@@ -18,6 +18,12 @@ if(Vulkan_INCLUDE_DIR)
target_include_directories(WrapVulkanHeaders::WrapVulkanHeaders INTERFACE
${Vulkan_INCLUDE_DIR})
+ set_target_properties(WrapVulkanHeaders::WrapVulkanHeaders PROPERTIES
+ _qt_is_nolink_target TRUE)
+
+ set_target_properties(WrapVulkanHeaders::WrapVulkanHeaders PROPERTIES
+ _qt_skip_include_dir_for_pri TRUE)
+
# Also propagate MoltenVK include directory on Apple platforms if found.
# Assumes the folder structure of the LunarG Vulkan SDK.
if(APPLE)
diff --git a/cmake/QtFindPackageHelpers.cmake b/cmake/QtFindPackageHelpers.cmake
index 9f8ae1a9a9..da0b19a8d5 100644
--- a/cmake/QtFindPackageHelpers.cmake
+++ b/cmake/QtFindPackageHelpers.cmake
@@ -269,6 +269,29 @@ function(qt_record_extra_qt_main_tools_package_dependency main_target_name
"${main_target_name}" "${qtfied_package_name_versioned}" "${dep_package_version}")
endfunction()
+# Record an extra 3rd party target as a dependency for ${main_target_name}.
+#
+# Adds a find_package(${dep_target_package_name}) in ${main_target_name}Dependencies.cmake.
+#
+# Needed to record a dependency on the package that provides WrapVulkanHeaders::WrapVulkanHeaders.
+# The package version, components, whether the package is optional, etc, are queried from the
+# ${dep_target} target properties.
+function(qt_record_extra_third_party_dependency main_target_name dep_target)
+ if(NOT TARGET "${main_target_name}")
+ qt_get_tool_target_name(main_target_name "${main_target_name}")
+ endif()
+ if(TARGET "${main_target_name}")
+ get_target_property(extra_deps "${main_target_name}" _qt_extra_third_party_dep_targets)
+ if(NOT extra_deps)
+ set(extra_deps "")
+ endif()
+
+ list(APPEND extra_deps "${dep_target}")
+ set_target_properties("${main_target_name}" PROPERTIES _qt_extra_third_party_dep_targets
+ "${extra_deps}")
+ endif()
+endfunction()
+
# This function stores the list of Qt targets a library depend on,
# along with their version info, for usage in ${target}Depends.cmake file
function(qt_register_target_dependencies target public_libs private_libs)
diff --git a/cmake/QtPostProcessHelpers.cmake b/cmake/QtPostProcessHelpers.cmake
index 5d3e949206..248989c81c 100644
--- a/cmake/QtPostProcessHelpers.cmake
+++ b/cmake/QtPostProcessHelpers.cmake
@@ -25,7 +25,7 @@ macro(qt_collect_third_party_deps target)
endif()
unset(_target_is_static)
- foreach(dep ${${depends_var}} ${optional_public_depends})
+ foreach(dep ${${depends_var}} ${optional_public_depends} ${extra_third_party_deps})
# Gather third party packages that should be found when using the Qt module.
# Also handle nolink target dependencies.
string(REGEX REPLACE "_nolink$" "" base_dep "${dep}")
@@ -138,6 +138,12 @@ function(qt_internal_create_module_depends_file target)
list(APPEND target_deps "${extra_depends}")
endif()
+ # Extra 3rd party targets who's packages should be considered dependencies.
+ get_target_property(extra_third_party_deps "${target}" _qt_extra_third_party_dep_targets)
+ if(NOT extra_third_party_deps)
+ set(extra_third_party_deps "")
+ endif()
+
# Used for assembling the content of an include/Module/ModuleDepends.h header.
set(qtdeps "")
diff --git a/cmake/QtPriHelpers.cmake b/cmake/QtPriHelpers.cmake
index 49d7310db4..fa31ea9a5c 100644
--- a/cmake/QtPriHelpers.cmake
+++ b/cmake/QtPriHelpers.cmake
@@ -36,7 +36,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$")
@@ -120,14 +129,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}")
diff --git a/cmake/QtPublicWalkLibsHelpers.cmake b/cmake/QtPublicWalkLibsHelpers.cmake
index 19eef91356..7267bc9677 100644
--- a/cmake/QtPublicWalkLibsHelpers.cmake
+++ b/cmake/QtPublicWalkLibsHelpers.cmake
@@ -148,6 +148,13 @@ function(__qt_internal_walk_libs
continue()
endif()
+ # Skip optional dependencies for now. They are likely to be handled manually for prl
+ # file purposes (like nolink handling). And for one of the other operations, we don't
+ # have a use case yet. This might be revisited.
+ if(lib MATCHES "^\\$<TARGET_NAME_IF_EXISTS:")
+ continue()
+ endif()
+
# Strip any directory scope tokens.
__qt_internal_strip_target_directory_scope_token("${lib}" lib)
diff --git a/cmake/QtTargetHelpers.cmake b/cmake/QtTargetHelpers.cmake
index 75642c70b0..96d6982319 100644
--- a/cmake/QtTargetHelpers.cmake
+++ b/cmake/QtTargetHelpers.cmake
@@ -772,3 +772,40 @@ function(qt_internal_link_internal_platform_for_object_library target)
# Achieve this by compiling the cpp files with the PlatformModuleInternal compile flags.
target_link_libraries("${target}" PRIVATE Qt::PlatformModuleInternal)
endfunction()
+
+
+# Use ${dep_target}'s include dirs when building ${target} and optionally propagate the include
+# dirs to consumers of ${target}.
+
+# Assumes ${dep_target} is an INTERFACE_LIBRARY that only propagates include dirs and ${target}
+# is a Qt module / plugin.
+#
+# Building ${target} requires ${dep_target}'s include dirs.
+#
+# User projects that don't have ${dep_target}'s headers installed in their system should still
+# configure successfully.
+#
+# To achieve that, consumers of ${target} will only get the include directories of ${dep_target}
+# if the latter package and target exists.
+#
+# A find_package(dep_target) dependency is added to ${target}'s ModuleDependencies.cmake file.
+#
+# We use target_include_directories(PRIVATE) instead of target_link_libraries(PRIVATE) because the
+# latter would propagate a mandatory LINK_ONLY dependency on the ${dep_target} in a static Qt build.
+#
+# The main use case is for propagating WrapVulkanHeaders::WrapVulkanHeaders.
+function(qt_internal_add_target_include_dirs_and_optionally_propagate target dep_target)
+ if(NOT TARGET "${target}")
+ message(FATAL_ERROR "${target} is not a valid target.")
+ endif()
+ if(NOT TARGET "${dep_target}")
+ message(FATAL_ERROR "${dep_target} is not a valid target.")
+ endif()
+
+ target_include_directories("${target}" PRIVATE
+ "$<TARGET_PROPERTY:${dep_target},INTERFACE_INCLUDE_DIRECTORIES>")
+
+ target_link_libraries("${target}" INTERFACE "$<TARGET_NAME_IF_EXISTS:${dep_target}>")
+
+ qt_record_extra_third_party_dependency("${target}" "${dep_target}")
+endfunction()
diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt
index 1befa1612d..378ea3e321 100644
--- a/src/gui/CMakeLists.txt
+++ b/src/gui/CMakeLists.txt
@@ -869,9 +869,11 @@ qt_internal_extend_target(Gui CONDITION QT_FEATURE_vulkan
vulkan/qvulkanfunctions.cpp
vulkan/qvulkaninstance.cpp vulkan/qvulkaninstance.h
vulkan/qvulkanwindow.cpp vulkan/qvulkanwindow.h vulkan/qvulkanwindow_p.h
- PUBLIC_LIBRARIES
- WrapVulkanHeaders::WrapVulkanHeaders
)
+if(QT_FEATURE_vulkan)
+ qt_internal_add_target_include_dirs_and_optionally_propagate(
+ Gui WrapVulkanHeaders::WrapVulkanHeaders)
+endif()
#### Keys ignored in scope 111:.:vulkan:vulkan/vulkan.pri:QT_FEATURE_vkgen:
# special case begin
diff --git a/src/opengl/CMakeLists.txt b/src/opengl/CMakeLists.txt
index 11345b5dc1..03ace0cad7 100644
--- a/src/opengl/CMakeLists.txt
+++ b/src/opengl/CMakeLists.txt
@@ -90,9 +90,11 @@ qt_internal_extend_target(OpenGL CONDITION NOT QT_FEATURE_opengles2
qt_internal_extend_target(OpenGL CONDITION QT_FEATURE_vulkan
SOURCES
qvkconvenience.cpp qvkconvenience_p.h
- PUBLIC_LIBRARIES
- WrapVulkanHeaders::WrapVulkanHeaders
)
+if(QT_FEATURE_vulkan)
+ qt_internal_add_target_include_dirs_and_optionally_propagate(
+ OpenGL WrapVulkanHeaders::WrapVulkanHeaders)
+endif()
qt_internal_extend_target(OpenGL CONDITION QT_FEATURE_egl
SOURCES