summaryrefslogtreecommitdiffstats
path: root/cmake/QtPublicTargetHelpers.cmake
blob: 3804b18ac46cc8f76dca67821827aa7720bea583 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
function(__qt_internal_strip_target_directory_scope_token target out_var)
    # In CMake versions earlier than CMake 3.18, a subdirectory scope id is appended to the
    # target name if the target is referenced in a target_link_libraries command from a
    # different directory scope than where the target was created.
    # Strip it.
    #
    # For informational purposes, in CMake 3.18, the target name looks as follows:
    # ::@(0x5604cb3f6b50);Threads::Threads;::@
    # This case doesn't have to be stripped (at least for now), because when we iterate over
    # link libraries, the tokens appear as separate target names.
    #
    # Example: Threads::Threads::@<0x5604cb3f6b50>
    # Output: Threads::Threads
    string(REGEX REPLACE "::@<.+>$" "" target "${target}")
    set("${out_var}" "${target}" PARENT_SCOPE)
endfunction()

function(__qt_internal_process_dependency_resource_objects target)
    get_target_property(processed ${target} _qt_resource_object_finalizers_processed)
    if(processed)
        return()
    endif()
    set_target_properties(${target} PROPERTIES _qt_resource_object_finalizers_processed TRUE)

    __qt_internal_check_finalizer_mode(${target} use_finalizer_mode resource_objects)
    if(NOT use_finalizer_mode)
        return()
    endif()

    __qt_internal_collect_dependency_resource_objects(${target} resource_objects)
    target_sources(${target} PRIVATE "${resource_objects}")
endfunction()

function(__qt_internal_collect_dependency_resource_objects target out_var)
    set_property(GLOBAL PROPERTY _qt_resource_processed_targets "")

    __qt_internal_collect_resource_objects_recursively(resource_targets ${target} ${target})

    # Collect resource objects of plugins and plugin dependencies.
    __qt_internal_collect_plugin_targets_from_dependencies(${target} plugin_targets)
    __qt_internal_collect_dependency_plugin_resource_objects(${target}
        "${plugin_targets}"
        plugin_resource_objects
    )

    set_property(GLOBAL PROPERTY _qt_resource_processed_targets "")

    list(REMOVE_DUPLICATES resource_targets)
    set(resource_objects "")
    foreach(dep IN LISTS resource_targets)
        list(PREPEND resource_objects "$<TARGET_OBJECTS:${dep}>")
    endforeach()

    set(${out_var} "${plugin_resource_objects};${resource_objects}" PARENT_SCOPE)
endfunction()

function(__qt_internal_collect_dependency_plugin_resource_objects target plugin_targets out_var)
    set(plugin_resource_objects "")
    foreach(plugin_target IN LISTS plugin_targets)
        __qt_internal_collect_resource_objects_recursively(plugin_resource_targets
            "${QT_CMAKE_EXPORT_NAMESPACE}::${plugin_target}"
            ${target}
        )
        __qt_internal_get_static_plugin_condition_genex("${plugin_target}" plugin_condition)

        foreach(plugin_resource_target IN LISTS plugin_resource_targets)
            list(APPEND plugin_resource_objects
                "$<${plugin_condition}:$<TARGET_OBJECTS:${plugin_resource_target}>>"
            )
        endforeach()
    endforeach()
    set(${out_var} "${plugin_resource_objects}" PARENT_SCOPE)
endfunction()

function(__qt_internal_collect_resource_objects_recursively out_var target initial_target)
    get_property(resource_processed_targets GLOBAL PROPERTY _qt_resource_processed_targets)

    set(interface_libs "")
    set(libs "")
    if(NOT "${target}" STREQUAL "${initial_target}")
        get_target_property(interface_libs ${target} INTERFACE_LINK_LIBRARIES)
    endif()
    get_target_property(type ${target} TYPE)
    if(NOT type STREQUAL "INTERFACE_LIBRARY")
        get_target_property(libs ${target} LINK_LIBRARIES)
    endif()

    set(resource_targets "")
    foreach(lib IN LISTS libs interface_libs)
        if(TARGET ${lib})
            get_target_property(aliased_target ${lib} ALIASED_TARGET)
            if(aliased_target)
                set(lib ${aliased_target})
            endif()

            if(${lib} IN_LIST resource_processed_targets)
                continue()
            else()
                list(APPEND resource_processed_targets ${lib})
                set_property(GLOBAL APPEND PROPERTY _qt_resource_processed_targets ${lib})
            endif()

            get_target_property(is_qt_resource ${lib} _is_qt_resource_target)
            if(is_qt_resource)
                list(APPEND resource_targets ${lib})
            else()
                __qt_internal_collect_resource_objects_recursively(next_level_resources
                    ${lib}
                    ${initial_target}
                )
                list(APPEND resource_targets ${next_level_resources})
            endif()
        endif()
    endforeach()
    set(${out_var} "${resource_targets}" PARENT_SCOPE)
endfunction()