summaryrefslogtreecommitdiffstats
path: root/cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake')
-rw-r--r--cmake/QtPrlHelpers.cmake64
-rw-r--r--cmake/QtTargetHelpers.cmake13
2 files changed, 64 insertions, 13 deletions
diff --git a/cmake/QtPrlHelpers.cmake b/cmake/QtPrlHelpers.cmake
index e3f66c0cc8..ed29557b93 100644
--- a/cmake/QtPrlHelpers.cmake
+++ b/cmake/QtPrlHelpers.cmake
@@ -16,6 +16,50 @@ function(qt_collect_libs target out_var)
set("${out_var}" "${${out_var}}" PARENT_SCOPE)
endfunction()
+# Extracts value from per-target dict key and assigns it to out_var.
+# Assumes dict_name to be an existing INTERFACE target.
+function(qt_internal_get_dict_key_values out_var target_infix dict_name dict_key)
+ get_target_property(values "${dict_name}" "INTERFACE_${target_infix}_${dict_key}")
+ set(${out_var} "${values}" PARENT_SCOPE)
+endfunction()
+
+# Assigns 'values' to per-target dict key, including for aliases of the target.
+# Assumes dict_name to be an existing INTERFACE target.
+function(qt_internal_memoize_values_in_dict target dict_name dict_key values)
+ # Memoize the computed values for the target as well as its aliases.
+ #
+ # Aka assigns the contents of ${values} to INTERFACE_Core, INTERFACE_Qt::Core,
+ # INTERFACE_Qt6::Core.
+ #
+ # Yes, i know it's crazy that target names are legal property names.
+ #
+ # Assigning for library aliases is needed to avoid multiple recomputation of values.
+ # Scenario in the context of qt_internal_walk_libs:
+ # 'values' are computed for Core target and memoized to INTERFACE_Core.
+ # When processing Gui, it depends on Qt::Core, but there are no values for INTERFACE_Qt::Core.
+ set_target_properties(${dict_name} PROPERTIES INTERFACE_${target}_${dict_key} "${values}")
+
+ get_target_property(versionless_alias "${target}" "_qt_versionless_alias")
+ if(versionless_alias)
+ qt_internal_get_dict_key_values(
+ versionless_values "${versionless_alias}" "${dict_name}" "${dict_key}")
+ if(versionless_values MATCHES "-NOTFOUND$")
+ set_target_properties(${dict_name}
+ PROPERTIES INTERFACE_${versionless_alias}_${dict_key} "${values}")
+ endif()
+ endif()
+
+ get_target_property(versionfull_alias "${target}" "_qt_versionfull_alias")
+ if(versionfull_alias)
+ qt_internal_get_dict_key_values(
+ versionfull_values "${versionfull_alias}" "${dict_name}" "${dict_key}")
+ if(versionfull_values MATCHES "-NOTFOUND$")
+ set_target_properties(${dict_name}
+ PROPERTIES INTERFACE_${versionfull_alias}_${dict_key} "${values}")
+ endif()
+ endif()
+endfunction()
+
# Walks a target's link libraries recursively, and performs some actions (poor man's polypmorphism)
#
# out_var is the name of the variable where the result will be assigned. The result is a list of
@@ -42,8 +86,9 @@ function(qt_internal_walk_libs target out_var dict_name operation)
if(NOT TARGET ${dict_name})
add_library(${dict_name} INTERFACE IMPORTED GLOBAL)
endif()
- get_target_property(libs ${dict_name} INTERFACE_${target})
- if(NOT libs)
+ qt_internal_get_dict_key_values(libs "${target}" "${dict_name}" "libs")
+
+ if(libs MATCHES "-NOTFOUND$")
unset(libs)
get_target_property(target_libs ${target} INTERFACE_LINK_LIBRARIES)
if(NOT target_libs)
@@ -112,17 +157,17 @@ function(qt_internal_walk_libs target out_var dict_name operation)
get_target_property(lib_target_type ${lib_target} TYPE)
if(lib_target_type STREQUAL "INTERFACE_LIBRARY")
qt_internal_walk_libs(
- ${lib_target} lib_libs "${dict_name}" "${operation}" ${collected})
- if(lib_libs)
- qt_merge_libs(libs ${lib_libs})
+ ${lib_target} lib_libs_${target} "${dict_name}" "${operation}" ${collected})
+ if(lib_libs_${target})
+ qt_merge_libs(libs ${lib_libs_${target}})
set(is_module 0)
endif()
else()
qt_merge_libs(libs "$<TARGET_FILE:${lib_target}>")
qt_internal_walk_libs(
- ${lib_target} lib_libs "${dict_name}" "${operation}" ${collected})
- if(lib_libs)
- qt_merge_libs(libs ${lib_libs})
+ ${lib_target} lib_libs_${target} "${dict_name}" "${operation}" ${collected})
+ if(lib_libs_${target})
+ qt_merge_libs(libs ${lib_libs_${target}})
endif()
endif()
if(operation STREQUAL "promote_global")
@@ -151,7 +196,8 @@ function(qt_internal_walk_libs target out_var dict_name operation)
qt_merge_libs(libs "${final_lib_name_to_merge}")
endif()
endforeach()
- set_target_properties(${dict_name} PROPERTIES INTERFACE_${target} "${libs}")
+ qt_internal_memoize_values_in_dict("${target}" "${dict_name}" "libs" "${libs}")
+
endif()
set(${out_var} ${libs} PARENT_SCOPE)
endfunction()
diff --git a/cmake/QtTargetHelpers.cmake b/cmake/QtTargetHelpers.cmake
index 1d1ab7091a..fe8d461856 100644
--- a/cmake/QtTargetHelpers.cmake
+++ b/cmake/QtTargetHelpers.cmake
@@ -139,13 +139,18 @@ endfunction()
# Add Qt::target and Qt6::target as aliases for the target
function(qt_internal_add_target_aliases target)
+ set(versionless_alias "Qt::${target}")
+ set(versionfull_alias "Qt${PROJECT_VERSION_MAJOR}::${target}")
+ set_target_properties("${target}" PROPERTIES _qt_versionless_alias "${versionless_alias}")
+ set_target_properties("${target}" PROPERTIES _qt_versionfull_alias "${versionfull_alias}")
+
get_target_property(type "${target}" TYPE)
if (type STREQUAL EXECUTABLE)
- add_executable("Qt::${target}" ALIAS "${target}")
- add_executable("Qt${PROJECT_VERSION_MAJOR}::${target}" ALIAS "${target}")
+ add_executable("${versionless_alias}" ALIAS "${target}")
+ add_executable("${versionfull_alias}" ALIAS "${target}")
else()
- add_library("Qt::${target}" ALIAS "${target}")
- add_library("Qt${PROJECT_VERSION_MAJOR}::${target}" ALIAS "${target}")
+ add_library("${versionless_alias}" ALIAS "${target}")
+ add_library("${versionfull_alias}" ALIAS "${target}")
endif()
endfunction()