opentelemetry-cpp/cmake/find-package-support-functi...

145 lines
6.4 KiB
CMake

# Copyright The OpenTelemetry Authors
# SPDX-License-Identifier: Apache-2.0
include("${CMAKE_CURRENT_LIST_DIR}/component-definitions.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/thirdparty-dependency-definitions.cmake")
#-------------------------------------------------------------------------
# Function to get installed components.
#-------------------------------------------------------------------------
function(get_installed_components installed_components_out)
set(result "")
foreach(_COMPONENT IN LISTS OTEL_BUILT_COMPONENTS_LIST)
set(_COMPONENT_TARGET_FILE "${CMAKE_CURRENT_LIST_DIR}/opentelemetry-cpp-${_COMPONENT}-target.cmake")
if(EXISTS "${_COMPONENT_TARGET_FILE}")
list(APPEND result ${_COMPONENT})
message(DEBUG "get_installed_components: component = ${_COMPONENT}, installed = TRUE")
else()
message(DEBUG "get_installed_components: component = ${_COMPONENT}, installed = FALSE")
endif()
endforeach()
set(${installed_components_out} ${result} PARENT_SCOPE)
endfunction()
#-------------------------------------------------------------------------
# Function to get dependent components.
#-------------------------------------------------------------------------
function(get_dependent_components component_in dependent_components_out)
set(result "")
set(depends_var "COMPONENT_${component_in}_COMPONENT_DEPENDS")
if(DEFINED ${depends_var})
set(result ${${depends_var}})
endif()
set(${dependent_components_out} ${result} PARENT_SCOPE)
endfunction()
#-------------------------------------------------------------------------
# Function to get requested components.
#-------------------------------------------------------------------------
function(get_requested_components installed_components_in requested_components_out)
set(result "")
if (NOT opentelemetry-cpp_FIND_COMPONENTS)
set(result ${${installed_components_in}})
message(DEBUG "get_requested_components: No components explicitly requested. Importing all installed components including: ${result}")
set(${requested_components_out} ${result} PARENT_SCOPE)
else()
message(DEBUG "get_requested_components: Components requested: ${opentelemetry-cpp_FIND_COMPONENTS}")
foreach(_COMPONENT IN LISTS opentelemetry-cpp_FIND_COMPONENTS)
if(NOT ${_COMPONENT} IN_LIST OTEL_BUILT_COMPONENTS_LIST)
message(ERROR " get_requested_components: Component `${_COMPONENT}` is not a built component of the opentelemetry-cpp package. Built components include: ${OTEL_BUILT_COMPONENTS_LIST}")
return()
endif()
if(NOT ${_COMPONENT} IN_LIST ${installed_components_in})
message(ERROR " get_requested_components: Component `${_COMPONENT}` is supported by opentelemetry-cpp but not installed. Installed components include: ${${installed_components_in}}")
return()
endif()
get_dependent_components(${_COMPONENT} _DEPENDENT_COMPONENTS)
list(APPEND result ${_DEPENDENT_COMPONENTS})
list(APPEND result ${_COMPONENT})
endforeach()
list(REMOVE_DUPLICATES result)
set(${requested_components_out} ${result} PARENT_SCOPE)
endif()
endfunction()
#-------------------------------------------------------------------------
# Function to get the targets for a component.
#-------------------------------------------------------------------------
function(get_component_targets component_in targets_out)
set(result "")
if(NOT ${component_in} IN_LIST OTEL_BUILT_COMPONENTS_LIST)
message(ERROR " get_component_targets: Component `${component_in}` component is not a built component of the opentelemetry-cpp package.")
else()
set(targets_var "COMPONENT_${component_in}_TARGETS")
if(DEFINED ${targets_var})
set(result ${${targets_var}})
endif()
endif()
set(${targets_out} ${result} PARENT_SCOPE)
endfunction()
#-------------------------------------------------------------------------
# Get targets for a list of components.
#-------------------------------------------------------------------------
function(get_targets components_in targets_out)
set(result "")
foreach(_comp IN LISTS ${components_in})
get_component_targets(${_comp} comp_targets)
foreach(target IN LISTS comp_targets)
list(APPEND result ${target})
endforeach()
endforeach()
set(${targets_out} ${result} PARENT_SCOPE)
endfunction()
#-------------------------------------------------------------------------
# Check if a target is imported for a list of targets.
#-------------------------------------------------------------------------
function(check_targets_imported targets_in)
set(result TRUE)
foreach(_target IN LISTS ${targets_in})
if(TARGET ${_target})
message(DEBUG "check_targets_imported: imported target `${_target}`")
else()
message(FATAL_ERROR " check_targets_imported: failed to import target `${_target}`")
set(result FALSE)
endif()
endforeach()
set(${result_bool_out} ${result} PARENT_SCOPE)
endfunction()
#-------------------------------------------------------------------------
# Check if a dependency is expected and required
#-------------------------------------------------------------------------
function (is_dependency_required dependency_in components_in is_required_out)
foreach(_component IN LISTS ${components_in})
if(${dependency_in} IN_LIST COMPONENT_${_component}_THIRDPARTY_DEPENDS)
set(${is_required_out} TRUE PARENT_SCOPE)
return()
endif()
endforeach()
endfunction()
#-------------------------------------------------------------------------
# Find all required and expected dependencies
#-------------------------------------------------------------------------
include(CMakeFindDependencyMacro)
function(find_required_dependencies components_in)
foreach(_dependency IN LISTS OTEL_THIRDPARTY_DEPENDENCIES_SUPPORTED)
if(${_dependency}_FOUND)
# The dependency is already found by another component. Continue.
continue()
endif()
set(is_required FALSE)
is_dependency_required(${_dependency} ${components_in} is_required)
message(DEBUG "find_required_dependencies: dependency = ${_dependency}, is_required = ${is_required}")
if(is_required)
message(DEBUG "find_required_dependencies: calling find_dependency(${_dependency} ${OTEL_${_dependency}_SEARCH_MODE} )...")
find_dependency(${_dependency} ${OTEL_${_dependency}_SEARCH_MODE})
endif()
endforeach()
endfunction()