qtbase/cmake/QtPublicFindPackageHelpers.cmake
Alexandru Croitor 58eefbd0b6 CMake: Record package provided targets in Dependencies.cmake files
Each qt_find_package can specify a PROVIDED_TARGETS option, to inform
which targets will be created by that package.
The call then saves the package name, version, etc on each of the
provided targets.

Currently the provided targets info is not persisted anywhere after
configuration ends.

We will need this for SBOM creation, so that we can collect
information about such dependencies when configuring leaf
repos, where find_dependency calls are implicit, and don't contain
the PROVIDED_TARGETS option, and we need to go from package name to
target name (and any recorded info it the target has).

This is especially relevant for static library builds, where private
dependencies become public dependencies.

Collect the provided targets information at post process time and
persist it for each 'package name + components requested' combination
into the Dependencies.cmake file.

This information will be used in a later change for SBOM generation.

Change-Id: I1693f81b1ad3beaf9b02e44b09a5e977923f0d85
Reviewed-by:  Alexey Edelev <alexey.edelev@qt.io>
2024-05-29 23:01:47 +02:00

56 lines
1.8 KiB
CMake

# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause
function(qt_internal_disable_find_package_global_promotion target)
set_target_properties("${target}" PROPERTIES _qt_no_promote_global TRUE)
endfunction()
# Transforms a list of package components into a string, so it can serve as a valid infix
# in a property name.
function(_qt_internal_get_package_components_as_valid_key_infix value out_var)
string(REPLACE ";" "_" valid_value "${value}")
set(${out_var} "${valid_value}" PARENT_SCOPE)
endfunction()
# This function computes a unique key / id using the package name and the components that are
# passed.
# The result is later used as property name, to store provided targets for a specific
# package + components combination.
function(_qt_internal_get_package_components_id)
set(opt_args "")
set(single_args
PACKAGE_NAME
OUT_VAR_KEY
)
set(multi_args
COMPONENTS
OPTIONAL_COMPONENTS
)
cmake_parse_arguments(PARSE_ARGV 0 arg "${opt_args}" "${single_args}" "${multi_args}")
_qt_internal_validate_all_args_are_parsed(arg)
if(NOT arg_PACKAGE_NAME)
message(FATAL_ERROR "PACKAGE_NAME is required")
endif()
if(NOT arg_OUT_VAR_KEY)
message(FATAL_ERROR "OUT_VAR_KEY is required")
endif()
set(key "${arg_PACKAGE_NAME}")
if(arg_COMPONENTS)
_qt_internal_get_package_components_as_valid_key_infix("${arg_COMPONENTS}"
components_as_string)
string(APPEND key "-${components_as_string}")
endif()
if(arg_OPTIONAL_COMPONENTS)
_qt_internal_get_package_components_as_valid_key_infix("${arg_OPTIONAL_COMPONENTS}"
components_as_string)
string(APPEND key "-${components_as_string}")
endif()
set(${arg_OUT_VAR_KEY} "${key}" PARENT_SCOPE)
endfunction()