diff --git a/cmake/QtFlagHandlingHelpers.cmake b/cmake/QtFlagHandlingHelpers.cmake index d8597326cca..806174521d7 100644 --- a/cmake/QtFlagHandlingHelpers.cmake +++ b/cmake/QtFlagHandlingHelpers.cmake @@ -33,22 +33,15 @@ function(qt_internal_add_linker_version_script target) endif() string(APPEND contents "};\n") set(current "Qt_${PROJECT_VERSION_MAJOR}") - if (QT_NAMESPACE STREQUAL "") - set(tag_symbol "qt_version_tag") - else() - set(tag_symbol "qt_version_tag_${QT_NAMESPACE}") - endif() string(APPEND contents "${current} { *; };\n") - foreach(minor_version RANGE ${PROJECT_VERSION_MINOR}) - set(previous "${current}") - set(current "Qt_${PROJECT_VERSION_MAJOR}.${minor_version}") - if (minor_version EQUAL ${PROJECT_VERSION_MINOR}) - string(APPEND contents "${current} { ${tag_symbol}; } ${previous};\n") - else() - string(APPEND contents "${current} {} ${previous};\n") - endif() - endforeach() + get_target_property(type ${target} TYPE) + if(NOT target_type STREQUAL "INTERFACE_LIBRARY") + set(property_genex "$") + set(check_genex "$") + string(APPEND contents + "$<${check_genex}:${property_genex}>") + endif() set(infile "${CMAKE_CURRENT_BINARY_DIR}/${target}.version.in") set(outfile "${CMAKE_CURRENT_BINARY_DIR}/${target}.version") diff --git a/cmake/QtTargetHelpers.cmake b/cmake/QtTargetHelpers.cmake index 7aae145e872..69848c94a96 100644 --- a/cmake/QtTargetHelpers.cmake +++ b/cmake/QtTargetHelpers.cmake @@ -14,6 +14,8 @@ # module, these files will raise a warning at configure time if the condition is not met. # COMPILE_FLAGS # Custom compilation flags. +# EXTRA_LINKER_SCRIPT_CONTENT +# Extra content that should be appended to a target linker script. Applicable for ld only. # NO_PCH_SOURCES # Skip the specified source files by PRECOMPILE_HEADERS feature. function(qt_internal_extend_target target) @@ -40,6 +42,7 @@ function(qt_internal_extend_target target) ) set(single_args PRECOMPILED_HEADER + EXTRA_LINKER_SCRIPT_CONTENT ) set(multi_args ${__default_public_args} @@ -241,6 +244,10 @@ function(qt_internal_extend_target target) ${sources_property} "${arg_CONDITION_INDEPENDENT_SOURCES}") endif() + if(arg_EXTRA_LINKER_SCRIPT_CONTENT) + set_target_properties(${target} PROPERTIES + _qt_extra_linker_script_content "${arg_EXTRA_LINKER_SCRIPT_CONTENT}") + endif() endfunction() function(qt_is_imported_target target out_var) diff --git a/src/corelib/CMakeLists.txt b/src/corelib/CMakeLists.txt index aeea45eaa0b..3d3c26ab16f 100644 --- a/src/corelib/CMakeLists.txt +++ b/src/corelib/CMakeLists.txt @@ -1392,3 +1392,22 @@ if(APPLE AND QT_FEATURE_framework AND QT_FEATURE_separate_debug_info) DESTINATION "${dsym_script_install_dir}" ) endif() + +set(linker_script_contents "") +if (QT_NAMESPACE STREQUAL "") + set(tag_symbol "qt_version_tag") +else() + set(tag_symbol "qt_version_tag_${QT_NAMESPACE}") +endif() +foreach(minor_version RANGE ${PROJECT_VERSION_MINOR}) + set(previous "${current}") + set(current "Qt_${PROJECT_VERSION_MAJOR}.${minor_version}") + if (minor_version EQUAL ${PROJECT_VERSION_MINOR}) + string(APPEND linker_script_contents "${current} { ${tag_symbol}; } ${previous};\n") + else() + string(APPEND linker_script_contents "${current} {} ${previous};\n") + endif() +endforeach() +qt_internal_extend_target(Core + EXTRA_LINKER_SCRIPT_CONTENT "${linker_script_contents}" +)