145 lines
6.4 KiB
CMake
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() |