| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506 | # Copyright The OpenTelemetry Authors# SPDX-License-Identifier: Apache-2.0include("${PROJECT_SOURCE_DIR}/cmake/thirdparty-dependency-config.cmake")######################################################################### INTERNAL FUNCTIONS - do not call directly. Use the otel_* "Main" functions#########################################################################-----------------------------------------------------------------------# _otel_set_component_properties:#   Sets the component properties used for install.#   Properties set on PROJECT_SOURCE_DIR directory include:#     OTEL_COMPONENTS_LIST: List of components added using otel_add_component#     OTEL_COMPONENT_TARGETS_<component>: List of targets associated with the component#     OTEL_COMPONENT_TARGETS_ALIAS_<component>: List of targets aliases associated with the component#     OTEL_COMPONENT_FILES_DIRECTORY_<component>: Directory containing files to be installed with the component#     OTEL_COMPONENT_FILES_DESTINATION_<component>: Destination directory for the files#     OTEL_COMPONENT_FILES_MATCHING_<component>: Matching pattern for the files to be installed#     OTEL_COMPONENT_DEPENDS_<component>: List of components that this component depends on#     OTEL_COMPONENT_THIRDPARTY_DEPENDS_<component>: List of thirdparty dependencies that this component depends on#-----------------------------------------------------------------------function(_otel_set_component_properties)    set(optionArgs )    set(oneValueArgs COMPONENT FILES_DIRECTORY FILES_DESTINATION)    set(multiValueArgs TARGETS TARGETS_ALIAS FILES_MATCHING COMPONENT_DEPENDS THIRDPARTY_DEPENDS)    cmake_parse_arguments(_PROPERTIES "${optionArgs}" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}")    # Add the component to the current components list    get_property(existing_components DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENTS_LIST)    if(_PROPERTIES_COMPONENT IN_LIST existing_components)      message(FATAL_ERROR "  component ${_PROPERTIES_COMPONENT} has already been created.")    endif()    list(APPEND existing_components "${_PROPERTIES_COMPONENT}")    set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENTS_LIST "${existing_components}")    # Set the component targets property    if(_PROPERTIES_TARGETS)      set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_TARGETS_${_PROPERTIES_COMPONENT} "${_PROPERTIES_TARGETS}")    else()      message(FATAL_ERROR "  component ${_PROPERTIES_COMPONENT} does not have any targets.")    endif()    # Set the component targets alias property    if(_PROPERTIES_TARGETS_ALIAS)      set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_TARGETS_ALIAS_${_PROPERTIES_COMPONENT} "${_PROPERTIES_TARGETS_ALIAS}")    endif()    # Set the component files property    if(_PROPERTIES_FILES_DIRECTORY)      if(NOT _PROPERTIES_FILES_DESTINATION)        message(FATAL_ERROR "  component ${_PROPERTIES_COMPONENT} has FILES_DIRECTORY set and must have FILES_DESINATION set.")      endif()      if(NOT _PROPERTIES_FILES_MATCHING)        message(FATAL_ERROR "  component ${_PROPERTIES_COMPONENT} has FILES_DIRECTORY set and must have FILES_MATCHING set.")      endif()      set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_FILES_DIRECTORY_${_PROPERTIES_COMPONENT} "${_PROPERTIES_FILES_DIRECTORY}")      set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_FILES_DESTINATION_${_PROPERTIES_COMPONENT} "${_PROPERTIES_FILES_DESTINATION}")      set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_FILES_MATCHING_${_PROPERTIES_COMPONENT} "${_PROPERTIES_FILES_MATCHING}")    endif()    if(_PROPERTIES_COMPONENT_DEPENDS)      set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_DEPENDS_${_PROPERTIES_COMPONENT} "${_PROPERTIES_COMPONENT_DEPENDS}")    endif()    if(_PROPERTIES_THIRDPARTY_DEPENDS)      set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_THIRDPARTY_DEPENDS_${_PROPERTIES_COMPONENT} "${_PROPERTIES_THIRDPARTY_DEPENDS}")    endif()endfunction()#-----------------------------------------------------------------------# _otel_set_target_component_property:#   Sets the target's INTERFACE_OTEL_COMPONENT_NAME property to the component.#   A target can only be assigned to one component.# Note: The INTERFACE_* prefix can be dropped with CMake 3.19+ when custom#       properties without the prefix are supported on INTERFACE targets.#-----------------------------------------------------------------------function(_otel_set_target_component_property _TARGET _COMPONENT)  get_target_property(_TARGET_COMPONENT ${_TARGET} INTERFACE_OTEL_COMPONENT_NAME)  if(_TARGET_COMPONENT)    message(FATAL_ERROR "  Target ${_TARGET} is already assigned to an opentelemetry-cpp COMPONENT ${_TARGET_COMPONENT}.")  endif()  set_target_properties(${_TARGET} PROPERTIES INTERFACE_OTEL_COMPONENT_NAME ${_OTEL_ADD_COMP_COMPONENT})endfunction()#-----------------------------------------------------------------------# _otel_append_dependent_components:#   Appends the dependent component to the OUT_COMPONENTS variable.#   The dependent component is defined in the OTEL_COMPONENT_DEPENDS_<component> property#   on the PROJECT_SOURCE_DIR directory.#-----------------------------------------------------------------------function(_otel_append_dependent_components _COMPONENT OUT_COMPONENTS)  get_property(_COMPONENT_DEPENDS DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_DEPENDS_${_COMPONENT})  if(_COMPONENT_DEPENDS)    set(_output_components "${${OUT_COMPONENTS}}")    message(DEBUG "  - adding dependent component ${_COMPONENT_DEPENDS} from component ${_COMPONENT}")    list(APPEND _output_components ${_COMPONENT_DEPENDS})    set(${OUT_COMPONENTS} "${_output_components}" PARENT_SCOPE)  endif()endfunction()#-----------------------------------------------------------------------# _otel_append_component_found:#   Checks if the target is associated with an otel component using the INTERFACE_OTEL_COMPONENT_NAME target property.#   If so then the component is appended to the OUT_COMPONENTS varaiable.#-----------------------------------------------------------------------function(_otel_append_component_found _COMPONENT _TARGET OUT_COMPONENTS OUT_COMPONENT_FOUND)  set(_output_components "${${OUT_COMPONENTS}}")  get_target_property(_DEPEND_COMPONENT ${_TARGET} INTERFACE_OTEL_COMPONENT_NAME)  if(_DEPEND_COMPONENT AND NOT ${_DEPEND_COMPONENT} STREQUAL ${_COMPONENT})    _otel_append_dependent_components(${_DEPEND_COMPONENT} _output_components)    message(DEBUG "  - adding dependent component ${_DEPEND_COMPONENT} from target ${_TARGET}")    list(APPEND _output_components ${_DEPEND_COMPONENT})    set(${OUT_COMPONENT_FOUND} TRUE PARENT_SCOPE)  else()    set(${OUT_COMPONENT_FOUND} FALSE PARENT_SCOPE)  endif()  set(${OUT_COMPONENTS} "${_output_components}" PARENT_SCOPE)endfunction()#-----------------------------------------------------------------------# _otel_append_thirdparty_found:#   Tries to match one of the supported third-party dependencies to the target name.#   If found the dependency project name is appended to the OUT_THIRDPARTY_DEPS variable.#   The match is based on the OTEL_THIRDPARTY_DEPENDENCIES_SUPPORTED list and optional#   OTEL_<dependency>_TARGET_NAMESPACE variables.#------------------------------------------------------------------------function(_otel_append_thirdparty_found _TARGET OUT_THIRDPARTY_DEPS)  set(_output_thirdparty_deps "${${OUT_THIRDPARTY_DEPS}}")  foreach(_DEPENDENCY ${OTEL_THIRDPARTY_DEPENDENCIES_SUPPORTED})    # Search for the dependency namespace in the target name    if(NOT "${OTEL_${_DEPENDENCY}_TARGET_NAMESPACE}" STREQUAL "")      set(_DEPENDENCY_NAMESPACE "${OTEL_${_DEPENDENCY}_TARGET_NAMESPACE}")    else()      set(_DEPENDENCY_NAMESPACE "${_DEPENDENCY}")    endif()    string(FIND "${_TARGET}" "${_DEPENDENCY_NAMESPACE}" _is_thirdparty)    if(_is_thirdparty GREATER -1)      message(DEBUG "  - adding thirdparty dependency ${_DEPENDENCY} from target ${_TARGET}")      list(APPEND _output_thirdparty_deps ${_DEPENDENCY})    endif()  endforeach()  set(${OUT_THIRDPARTY_DEPS} "${_output_thirdparty_deps}" PARENT_SCOPE)endfunction()#-----------------------------------------------------------------------# _otel_collect_component_dependencies:#   Collects the component to component dependencies and thirdparty dependencies of a target.#   The dependencies are collected from the target's LINK_LIBRARIES property# and are appended#   to the OUT_COMPONENT_DEPS and OUT_THIRDPARTY_DEPS variables.#------------------------------------------------------------------------function(_otel_collect_component_dependencies _TARGET _COMPONENT OUT_COMPONENT_DEPS OUT_THIRDPARTY_DEPS)  get_target_property(_TARGET_TYPE ${_TARGET} TYPE)  message(DEBUG "  Target: ${_TARGET} - Type: ${_TARGET_TYPE}")  # Set the linked libraries to search for dependencies  set(_linked_libraries "")  if(_TARGET_TYPE STREQUAL "INTERFACE_LIBRARY")    get_target_property(_interface_libs ${_TARGET} INTERFACE_LINK_LIBRARIES)    set(_linked_libraries "${_interface_libs}")    message(DEBUG "  - INTERFACE_LINK_LIBRARIES: ${_interface_libs}")  else()    get_target_property(_link_libs ${_TARGET} LINK_LIBRARIES)    set(_linked_libraries "${_link_libs}")    message(DEBUG "  - LINK_LIBRARIES: ${_link_libs}")  endif()  set(_component_deps "${${OUT_COMPONENT_DEPS}}")  set(_thirdparty_deps "${${OUT_THIRDPARTY_DEPS}}")  foreach(_linked_target ${_linked_libraries})    # Handle targets    if(TARGET "${_linked_target}")      set(_component_found FALSE)      _otel_append_component_found(${_COMPONENT} "${_linked_target}" _component_deps _component_found)      if(NOT ${_component_found})        _otel_append_thirdparty_found(${_linked_target} _thirdparty_deps)      endif()      continue()    endif()    # Skip BUILD_INTERFACE targets    string(FIND "${_linked_target}" "$<BUILD_INTERFACE:" _is_build_interface)    if(_is_build_interface GREATER -1)      message(DEBUG "  - skipping BUILD_INTERFACE target: ${_linked_target}")      continue()    endif()    # Handle targets in generator expressions    string(FIND "${_linked_target}" "$<" _is_generator_expression)    if(_is_generator_expression GREATER -1)      # Find targets in generator expressions (there can be more than one per expression)      string(REGEX MATCHALL "[A-Za-z0-9_\\-\\.]+(::[A-Za-z0-9_\\-\\.]+)*" _parsed_targets "${_linked_target}")      foreach(_parsed_target ${_parsed_targets})        if(TARGET ${_parsed_target})          set(_component_found FALSE)          _otel_append_component_found(${_COMPONENT} "${_parsed_target}" _component_deps _component_found)          if(NOT ${_component_found})            _otel_append_thirdparty_found(${_parsed_target} _thirdparty_deps)          endif()        endif()      endforeach()    endif()  endforeach()  list(REMOVE_DUPLICATES _component_deps)  list(REMOVE_DUPLICATES _thirdparty_deps)  set(${OUT_COMPONENT_DEPS} "${_component_deps}" PARENT_SCOPE)  set(${OUT_THIRDPARTY_DEPS} "${_thirdparty_deps}" PARENT_SCOPE)endfunction()#-----------------------------------------------------------------------# _otel_add_target_alias:#   Adds an alias target using target's export name and project name.#   opentelemetry-cpp::<target_export_name>#------------------------------------------------------------------------function(_otel_add_target_alias _TARGET OUT_ALIAS_TARGETS)  get_target_property(_TARGET_EXPORT_NAME ${_TARGET} EXPORT_NAME)  if(NOT _TARGET_EXPORT_NAME)    message(FATAL_ERROR "  Target ${_TARGET} does not have an EXPORT_NAME property.")  elseif(NOT TARGET "${PROJECT_NAME}::${_TARGET_EXPORT_NAME}")    add_library("${PROJECT_NAME}::${_TARGET_EXPORT_NAME}" ALIAS ${_TARGET})  endif()  set(_alias_targets "${${OUT_ALIAS_TARGETS}}")  list(APPEND _alias_targets "${PROJECT_NAME}::${_TARGET_EXPORT_NAME}")  set(${OUT_ALIAS_TARGETS} "${_alias_targets}" PARENT_SCOPE)endfunction()#-----------------------------------------------------------------------# _otel_install_component:#   Installs the component targets and optional files#-----------------------------------------------------------------------function(_otel_install_component _COMPONENT)  install(    TARGETS ${_COMPONENT_TARGETS}    EXPORT "${PROJECT_NAME}-${_COMPONENT}-target"    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT ${_COMPONENT})  install(    EXPORT "${PROJECT_NAME}-${_COMPONENT}-target"    FILE "${PROJECT_NAME}-${_COMPONENT}-target.cmake"    NAMESPACE "${PROJECT_NAME}::"    DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"    COMPONENT ${_COMPONENT})  if(_COMPONENT_FILES_DIRECTORY)    install(      DIRECTORY ${_COMPONENT_FILES_DIRECTORY}      DESTINATION ${_COMPONENT_FILES_DESTINATION}      COMPONENT ${_COMPONENT}      FILES_MATCHING ${_COMPONENT_FILES_MATCHING})  endif()endfunction()#-----------------------------------------------------------------------# _otel_populate_component_targets_block:#   Populates the OTEL_COMPONENTS_TARGETS_BLOCK with the component targets#   - sets COMPONENT_<component>_TARGETS variables#-----------------------------------------------------------------------function(_otel_populate_component_targets_block IN_COMPONENT COMPONENTS_TARGETS_BLOCK)  # Populate OTEL_COMPONENTS_TARGETS_BLOCK  set(_targets_block ${${COMPONENTS_TARGETS_BLOCK}})  string(APPEND _targets_block    "# COMPONENT ${IN_COMPONENT}\n"    "set(COMPONENT_${IN_COMPONENT}_TARGETS\n"  )  foreach(_TARGET IN LISTS _COMPONENT_TARGETS_ALIAS)    string(APPEND _targets_block "    ${_TARGET}\n")  endforeach()  string(APPEND _targets_block ")\n\n")  set(${COMPONENTS_TARGETS_BLOCK} "${_targets_block}" PARENT_SCOPE)endfunction()#-----------------------------------------------------------------------# _otel_populate_component_internal_depends_block:#   Populates the OTEL_COMPONENTS_INTERNAL_DEPENDENCIES_BLOCK with the component dependencies#   - sets COMPONENT_<component>_COMPONENT_DEPENDS variables#-----------------------------------------------------------------------function(_otel_populate_component_internal_depends_block IN_COMPONENT COMPONENTS_INTERNAL_DEPENDENCIES_BLOCK)  # Populate OTEL_COMPONENTS_INTERNAL_DEPENDENCIES_BLOCK  set(_deps_block ${${COMPONENTS_INTERNAL_DEPENDENCIES_BLOCK}})  string(APPEND _deps_block      "# COMPONENT ${IN_COMPONENT} internal dependencies\n"      "set(COMPONENT_${IN_COMPONENT}_COMPONENT_DEPENDS\n"    )  foreach(dep IN LISTS _COMPONENT_DEPENDS)    string(APPEND _deps_block "    ${dep}\n")  endforeach()  string(APPEND _deps_block ")\n\n")  set(${COMPONENTS_INTERNAL_DEPENDENCIES_BLOCK} "${_deps_block}" PARENT_SCOPE)endfunction()#-----------------------------------------------------------------------function(_otel_populate_component_thirdparty_depends_block IN_COMPONENT COMPONENTS_THIRDPARTY_DEPENDENCIES_BLOCK)  # Populate OTEL_COMPONENTS_THIRDPARTY_DEPENDENCIES_BLOCK  set(_deps_block ${${COMPONENTS_THIRDPARTY_DEPENDENCIES_BLOCK}})  string(APPEND _deps_block      "# COMPONENT ${IN_COMPONENT} thirdparty dependencies\n"      "set(COMPONENT_${IN_COMPONENT}_THIRDPARTY_DEPENDS\n"    )  foreach(dep IN LISTS _COMPONENT_THIRDPARTY_DEPENDS)    string(APPEND _deps_block "    ${dep}\n")  endforeach()  string(APPEND _deps_block ")\n\n")  set(${COMPONENTS_THIRDPARTY_DEPENDENCIES_BLOCK} "${_deps_block}" PARENT_SCOPE)endfunction()#-----------------------------------------------------------------------######################################################################### Main functions to support installing components# and the opentlemetry-cpp cmake package config files#########################################################################-----------------------------------------------------------------------# otel_add_component:#   Adds a component to the list of components to be installed. A component name and list of targest are required.#   Optional files can be added to the component by specifying a directory, destination and matching pattern.#   Each target is assigned to the component and its dependencies are identified based on the LINK_LIBRARIES property.#   An alias target is also created for each target in the form of PROJECT_NAME::TARGET_EXPORT_NAME.# Usage:#    otel_add_component(#      COMPONENT <component_name>#      TARGETS <target1> <target2> ...#      FILES_DIRECTORY <directory>#      FILES_DESTINATION <destination>#      FILES_MATCHING <matching>)#-----------------------------------------------------------------------function(otel_add_component)  set(optionArgs )  set(oneValueArgs COMPONENT FILES_DIRECTORY FILES_DESTINATION)  set(multiValueArgs TARGETS FILES_MATCHING)  cmake_parse_arguments(_OTEL_ADD_COMP "${optionArgs}" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}")  if(NOT _OTEL_ADD_COMP_COMPONENT)    message(FATAL_ERROR "otel_add_component: COMPONENT is required")  endif()  if(NOT _OTEL_ADD_COMP_TARGETS)    message(FATAL_ERROR "otel_add_component: TARGETS is required")  endif()  message(DEBUG "Add COMPONENT: ${_OTEL_ADD_COMP_COMPONENT}")  set(_COMPONENT_DEPENDS "")  set(_THIRDPARTY_DEPENDS "")  set(_ALIAS_TARGETS "")  foreach(_TARGET ${_OTEL_ADD_COMP_TARGETS})    if(NOT TARGET ${_TARGET})      message(FATAL_ERROR "  Target ${_TARGET} not found")    endif()    _otel_set_target_component_property(${_TARGET} ${_OTEL_ADD_COMP_COMPONENT})    _otel_collect_component_dependencies(${_TARGET} ${_OTEL_ADD_COMP_COMPONENT} _COMPONENT_DEPENDS _THIRDPARTY_DEPENDS)    _otel_add_target_alias(${_TARGET} _ALIAS_TARGETS)  endforeach()  if(_OTEL_ADD_COMP_FILES_DIRECTORY)    set(_OTEL_ADD_COMP_FILES_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${_OTEL_ADD_COMP_FILES_DIRECTORY}")  endif()  message(DEBUG "  TARGETS: ${_OTEL_ADD_COMP_TARGETS}")  message(DEBUG "  TARGETS_ALIAS: ${_ALIAS_TARGETS}")  message(DEBUG "  COMPONENT_DEPENDS: ${_COMPONENT_DEPENDS}")  message(DEBUG "  THIRDPARTY_DEPENDS: ${_THIRDPARTY_DEPENDS}")  message(DEBUG "  FILES_DIRECTORY: ${_OTEL_ADD_COMP_FILES_DIRECTORY}")  message(DEBUG "  FILES_DESTINATION: ${_OTEL_ADD_COMP_FILES_DESTINATION}")  message(DEBUG "  FILES_MATCHING: ${_OTEL_ADD_COMP_FILES_MATCHING}")  _otel_set_component_properties(    COMPONENT ${_OTEL_ADD_COMP_COMPONENT}    TARGETS ${_OTEL_ADD_COMP_TARGETS}    TARGETS_ALIAS ${_ALIAS_TARGETS}    FILES_DIRECTORY ${_OTEL_ADD_COMP_FILES_DIRECTORY}    FILES_DESTINATION ${_OTEL_ADD_COMP_FILES_DESTINATION}    FILES_MATCHING ${_OTEL_ADD_COMP_FILES_MATCHING}    COMPONENT_DEPENDS ${_COMPONENT_DEPENDS}    THIRDPARTY_DEPENDS ${_THIRDPARTY_DEPENDS})endfunction()#-----------------------------------------------------------------------# otel_install_components:#   Installs all components that have been added using otel_add_component.#   The components are installed in the order they were added.#   The install function will create a cmake config file for each component#   that contains the component name, targets, dependencies and thirdparty dependencies.# Usage:#    otel_install_components()#-----------------------------------------------------------------------function(otel_install_components)  get_property(OTEL_BUILT_COMPONENTS_LIST DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENTS_LIST)  message(STATUS "Installing components:")  set(OTEL_COMPONENTS_TARGETS_BLOCK "")  set(OTEL_COMPONENTS_INTERNAL_DEPENDENCIES_BLOCK "")  set(OTEL_COMPONENTS_THIRDPARTY_DEPENDENCIES_BLOCK "")  foreach(_COMPONENT ${OTEL_BUILT_COMPONENTS_LIST})    get_property(_COMPONENT_DEPENDS DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_DEPENDS_${_COMPONENT})    get_property(_COMPONENT_TARGETS DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_TARGETS_${_COMPONENT})    get_property(_COMPONENT_TARGETS_ALIAS DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_TARGETS_ALIAS_${_COMPONENT})    get_property(_COMPONENT_THIRDPARTY_DEPENDS DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_THIRDPARTY_DEPENDS_${_COMPONENT})    get_property(_COMPONENT_FILES_DIRECTORY DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_FILES_DIRECTORY_${_COMPONENT})    get_property(_COMPONENT_FILES_DESTINATION DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_FILES_DESTINATION_${_COMPONENT})    get_property(_COMPONENT_FILES_MATCHING DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_FILES_MATCHING_${_COMPONENT})    message(STATUS "Install COMPONENT ${_COMPONENT}")    message(STATUS "  TARGETS: ${_COMPONENT_TARGETS}")    message(STATUS "  TARGETS_ALIAS: ${_COMPONENT_TARGETS_ALIAS}")    message(STATUS "  COMPONENT_DEPENDS: ${_COMPONENT_DEPENDS}")    message(STATUS "  THIRDPARTY_DEPENDS: ${_COMPONENT_THIRDPARTY_DEPENDS}")    message(STATUS "  FILES_DIRECTORY: ${_COMPONENT_FILES_DIRECTORY}")    message(STATUS "  FILES_DESTINATION: ${_COMPONENT_FILES_DESTINATION}")    message(STATUS "  FILES_MATCHING: ${_COMPONENT_FILES_MATCHING}")    _otel_install_component(${_COMPONENT})    _otel_populate_component_targets_block(${_COMPONENT} OTEL_COMPONENTS_TARGETS_BLOCK)    _otel_populate_component_internal_depends_block(${_COMPONENT} OTEL_COMPONENTS_INTERNAL_DEPENDENCIES_BLOCK)    _otel_populate_component_thirdparty_depends_block(${_COMPONENT} OTEL_COMPONENTS_THIRDPARTY_DEPENDENCIES_BLOCK)  endforeach()  configure_file(    "${PROJECT_SOURCE_DIR}/cmake/templates/component-definitions.cmake.in"    "${CMAKE_CURRENT_BINARY_DIR}/cmake/component-definitions.cmake"    @ONLY  )  install(    FILES      "${CMAKE_CURRENT_BINARY_DIR}/cmake/component-definitions.cmake"    DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"    COMPONENT cmake-config)endfunction()#-----------------------------------------------------------------------# otel_install_thirdparty_definitions:#   Installs the thirdparty dependency definitions file that contains the list#   of thirdparty dependencies their versions and cmake search modes.#   - sets `OTEL_THIRDPARTY_DEPENDENCIES_SUPPORTED` to the list of dependencies#   - sets `OTEL_<dependency>_VERSION` to the version used to build opentelemetry-cpp#   - sets `OTEL_<dependency>_SEARCH_MODE` to the search mode required to find the dependency# Usage:#    otel_install_thirdparty_definitions()#-----------------------------------------------------------------------function(otel_install_thirdparty_definitions)  set(OTEL_THIRDPARTY_DEPENDENCY_VERSIONS_BLOCK "")  set(OTEL_THIRDPARTY_DEPENDENCY_SEARCH_MODES_BLOCK "")  # Populate OTEL_THIRDPARTY_DEPENDENCY_VERSIONS_BLOCK  foreach(_DEPENDENCY ${OTEL_THIRDPARTY_DEPENDENCIES_SUPPORTED})    string(APPEND OTEL_THIRDPARTY_DEPENDENCY_VERSIONS_BLOCK      "set(OTEL_${_DEPENDENCY}_VERSION \"${${_DEPENDENCY}_VERSION}\")\n"    )  endforeach()  # Populate OTEL_THIRDPARTY_DEPENDENCY_SEARCH_MODES_BLOCK  foreach(_DEPENDENCY ${OTEL_THIRDPARTY_DEPENDENCIES_SUPPORTED})    string(APPEND OTEL_THIRDPARTY_DEPENDENCY_SEARCH_MODES_BLOCK      "set(OTEL_${_DEPENDENCY}_SEARCH_MODE \"${OTEL_${_DEPENDENCY}_SEARCH_MODE}\")\n"    )  endforeach()  configure_file(    "${PROJECT_SOURCE_DIR}/cmake/templates/thirdparty-dependency-definitions.cmake.in"    "${CMAKE_CURRENT_BINARY_DIR}/cmake/thirdparty-dependency-definitions.cmake"    @ONLY)  install(      FILES      "${CMAKE_CURRENT_BINARY_DIR}/cmake/thirdparty-dependency-definitions.cmake"      DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"      COMPONENT cmake-config)endfunction()#-----------------------------------------------------------------------# otel_install_cmake_config:#   Configures and installs the cmake.config package file and version file#   to support find_package(opentelemetry-cpp CONFIG COMPONENTS ...)# Usage:#    otel_install_cmake_config()#-----------------------------------------------------------------------function(otel_install_cmake_config)  # Write config file for find_package(opentelemetry-cpp CONFIG)  set(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}")  configure_package_config_file(    "${PROJECT_SOURCE_DIR}/cmake/templates/opentelemetry-cpp-config.cmake.in"    "${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}/${PROJECT_NAME}-config.cmake"    INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"    PATH_VARS OPENTELEMETRY_ABI_VERSION_NO OPENTELEMETRY_VERSION PROJECT_NAME              INCLUDE_INSTALL_DIR CMAKE_INSTALL_LIBDIR)  # Write version file for find_package(opentelemetry-cpp CONFIG)  write_basic_package_version_file(    "${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}/${PROJECT_NAME}-config-version.cmake"    VERSION ${OPENTELEMETRY_VERSION}    COMPATIBILITY ExactVersion)  install(    FILES      "${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}/${PROJECT_NAME}-config.cmake"      "${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}/${PROJECT_NAME}-config-version.cmake"      "${CMAKE_CURRENT_LIST_DIR}/cmake/find-package-support-functions.cmake"    DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"    COMPONENT cmake-config)endfunction()
 |