From e2ed17fc180f988b1830a430a2c1312eb216693b Mon Sep 17 00:00:00 2001 From: Douglas Barker Date: Fri, 18 Apr 2025 12:40:52 -0600 Subject: [PATCH 1/7] unify cmake install functions and dynamically set component dependencies based on target library links --- CMakeLists.txt | 43 +- api/CMakeLists.txt | 34 +- cmake/component-definitions.cmake | 221 -------- cmake/find-package-support-functions.cmake | 124 +---- cmake/opentelemetry-proto.cmake | 18 - cmake/otel-install-functions.cmake | 504 ++++++++++++++++++ .../templates/component-definitions.cmake.in | 28 + .../thirdparty-built-with-flags.cmake.in | 103 ---- ...thirdparty-dependency-definitions.cmake.in | 20 + cmake/thirdparty-dependency-config.cmake | 46 ++ cmake/thirdparty-dependency-definitions.cmake | 64 --- exporters/elasticsearch/CMakeLists.txt | 40 +- exporters/etw/CMakeLists.txt | 34 +- exporters/memory/CMakeLists.txt | 37 +- exporters/ostream/CMakeLists.txt | 32 +- exporters/otlp/CMakeLists.txt | 131 +++-- exporters/prometheus/CMakeLists.txt | 34 +- exporters/zipkin/CMakeLists.txt | 39 +- ext/CMakeLists.txt | 35 +- ext/src/dll/CMakeLists.txt | 19 +- ext/src/http/client/curl/CMakeLists.txt | 17 +- opentracing-shim/CMakeLists.txt | 34 +- sdk/CMakeLists.txt | 50 +- sdk/src/common/CMakeLists.txt | 7 - sdk/src/logs/CMakeLists.txt | 7 - sdk/src/metrics/CMakeLists.txt | 7 - sdk/src/resource/CMakeLists.txt | 7 - sdk/src/trace/CMakeLists.txt | 7 - sdk/src/version/CMakeLists.txt | 7 - 29 files changed, 842 insertions(+), 907 deletions(-) delete mode 100644 cmake/component-definitions.cmake create mode 100644 cmake/otel-install-functions.cmake create mode 100644 cmake/templates/component-definitions.cmake.in delete mode 100644 cmake/templates/thirdparty-built-with-flags.cmake.in create mode 100644 cmake/templates/thirdparty-dependency-definitions.cmake.in create mode 100644 cmake/thirdparty-dependency-config.cmake delete mode 100644 cmake/thirdparty-dependency-definitions.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 98b70798c6..ed69b37b8e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -841,6 +841,8 @@ if(prometheus-cpp_FOUND) endif() message(STATUS "---------------------------------------------") +include("${PROJECT_SOURCE_DIR}/cmake/otel-install-functions.cmake") + include(CMakePackageConfigHelpers) if(DEFINED OPENTELEMETRY_BUILD_DLL) @@ -914,39 +916,14 @@ include(cmake/opentelemetry-build-external-component.cmake) include(cmake/patch-imported-config.cmake) if(OPENTELEMETRY_INSTALL) - # Export cmake config and support find_packages(opentelemetry-cpp CONFIG) - # Write config file for find_packages(opentelemetry-cpp CONFIG) - set(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}") - configure_package_config_file( - "${CMAKE_CURRENT_LIST_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_packages(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) - - # Write the "BUILT_WITH_: List of targets associated with the component +# OTEL_COMPONENT_TARGETS_ALIAS_: List of targets aliases associated with the component +# OTEL_COMPONENT_FILES_DIRECTORY_: Directory containing files to be installed with the component +# OTEL_COMPONENT_FILES_DESTINATION_: Destination directory for the files +# OTEL_COMPONENT_FILES_MATCHING_: Matching pattern for the files to be installed +# OTEL_COMPONENT_DEPENDS_: List of components that this component depends on +# OTEL_COMPONENT_THIRDPARTY_DEPENDS_: 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 ${CMAKE_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 ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENTS_LIST "${existing_components}") + + # Set the component targets property + if(_PROPERTIES_TARGETS) + set_property(DIRECTORY ${CMAKE_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 ${CMAKE_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 ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENT_FILES_DIRECTORY_${_PROPERTIES_COMPONENT} "${_PROPERTIES_FILES_DIRECTORY}") + set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENT_FILES_DESTINATION_${_PROPERTIES_COMPONENT} "${_PROPERTIES_FILES_DESTINATION}") + set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENT_FILES_MATCHING_${_PROPERTIES_COMPONENT} "${_PROPERTIES_FILES_MATCHING}") + endif() + + if(_PROPERTIES_COMPONENT_DEPENDS) + set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENT_DEPENDS_${_PROPERTIES_COMPONENT} "${_PROPERTIES_COMPONENT_DEPENDS}") + endif() + + if(_PROPERTIES_THIRDPARTY_DEPENDS) + set_property(DIRECTORY ${CMAKE_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_ property +# on the CMAKE_SOURCE_DIR directory. +#----------------------------------------------------------------------- +function(_otel_append_dependent_components _COMPONENT OUT_COMPONENTS) + get_property(_COMPONENT_DEPENDS DIRECTORY ${CMAKE_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__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}" "$ +#------------------------------------------------------------------------ +function(_otel_add_target_alias _TARGET OUT_ALIAS_TARGETS) + get_target_property(_TARGET_EXPORT_NAME ${_TARGET} EXPORT_NAME) + if(_TARGET_EXPORT_NAME AND NOT TARGET "${PROJECT_NAME}::${_TARGET_EXPORT_NAME}") + set(_alias_targets "${${OUT_ALIAS_TARGETS}}") + add_library("${PROJECT_NAME}::${_TARGET_EXPORT_NAME}" ALIAS ${_TARGET}) + list(APPEND _alias_targets "${PROJECT_NAME}::${_TARGET_EXPORT_NAME}") + set(${OUT_ALIAS_TARGETS} "${_alias_targets}" PARENT_SCOPE) + endif() +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__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_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 +# TARGETS ... +# FILES_DIRECTORY +# FILES_DESTINATION +# FILES_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 ${CMAKE_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 ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENT_DEPENDS_${_COMPONENT}) + get_property(_COMPONENT_TARGETS DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENT_TARGETS_${_COMPONENT}) + get_property(_COMPONENT_TARGETS_ALIAS DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENT_TARGETS_ALIAS_${_COMPONENT}) + get_property(_COMPONENT_THIRDPARTY_DEPENDS DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENT_THIRDPARTY_DEPENDS_${_COMPONENT}) + get_property(_COMPONENT_FILES_DIRECTORY DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENT_FILES_DIRECTORY_${_COMPONENT}) + get_property(_COMPONENT_FILES_DESTINATION DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENT_FILES_DESTINATION_${_COMPONENT}) + get_property(_COMPONENT_FILES_MATCHING DIRECTORY ${CMAKE_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( + "${CMAKE_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__VERSION` to the version used to build opentelemetry-cpp +# - sets `OTEL__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( + "${CMAKE_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( + "${CMAKE_CURRENT_LIST_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() \ No newline at end of file diff --git a/cmake/templates/component-definitions.cmake.in b/cmake/templates/component-definitions.cmake.in new file mode 100644 index 0000000000..8430cc90fe --- /dev/null +++ b/cmake/templates/component-definitions.cmake.in @@ -0,0 +1,28 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +# Configured from opentelemetry-cpp/cmake/component-definitions.cmake.in + +# ---------------------------------------------------------------------- +# opentelmetry-cpp Built COMPONENT list +# ---------------------------------------------------------------------- +set(OTEL_BUILT_COMPONENTS_LIST @OTEL_BUILT_COMPONENTS_LIST@) + +# ---------------------------------------------------------------------- +# COMPONENT to TARGET lists +# ---------------------------------------------------------------------- + +@OTEL_COMPONENTS_TARGETS_BLOCK@ + +#----------------------------------------------------------------------- +# COMPONENT to COMPONENT dependencies +#----------------------------------------------------------------------- + +@OTEL_COMPONENTS_INTERNAL_DEPENDENCIES_BLOCK@ + + +#----------------------------------------------------------------------- +# COMPONENT to THIRDPARTY dependencies +#----------------------------------------------------------------------- + +@OTEL_COMPONENTS_THIRDPARTY_DEPENDENCIES_BLOCK@ \ No newline at end of file diff --git a/cmake/templates/thirdparty-built-with-flags.cmake.in b/cmake/templates/thirdparty-built-with-flags.cmake.in deleted file mode 100644 index b6b5175b82..0000000000 --- a/cmake/templates/thirdparty-built-with-flags.cmake.in +++ /dev/null @@ -1,103 +0,0 @@ -# Copyright The OpenTelemetry Authors -# SPDX-License-Identifier: Apache-2.0 - -#------------------------------------------------------------------------- -# CMAKE flags to capture the build configuration for the insalled package -# BUILT_WITH_ is set to true if the installed package requires that dependency -# See the thirdparty-dependency-deinfitions.cmake for the supported dependency list and -# mapping to opentelemetry-cpp components. -#------------------------------------------------------------------------- - -# Initialize dependency expected flags -set(BUILT_WITH_Threads TRUE) -set(BUILT_WITH_CURL FALSE) -set(BUILT_WITH_ZLIB FALSE) -set(BUILT_WITH_nlohmann_json FALSE) -set(BUILT_WITH_Protobuf FALSE) -set(BUILT_WITH_gRPC FALSE) -set(BUILT_WITH_prometheus-cpp FALSE) -set(BUILT_WITH_OpenTracing FALSE) - -# CURL and ZLIB: -if(@WITH_HTTP_CLIENT_CURL@) - if("@CURL_FOUND@") - set(BUILT_WITH_CURL TRUE) - endif() - if("@ZLIB_FOUND@") - set(BUILT_WITH_ZLIB TRUE) - endif() -endif() - -# nlohmann_json: -if("@USE_NLOHMANN_JSON@") - set(BUILT_WITH_nlohmann_json TRUE) -endif() - -# Protobuf: -# Expected TRUE if protobuf was found during the build -if("@Protobuf_FOUND@") - set(BUILT_WITH_Protobuf TRUE) -endif() - -# gRPC: -if(@WITH_OTLP_GRPC@) - set(BUILT_WITH_gRPC TRUE) -endif() - -# prometheus-cpp: -if(@WITH_PROMETHEUS@) - set(BUILT_WITH_prometheus-cpp TRUE) -endif() - -# OpenTracing: -if(@WITH_OPENTRACING@) - set(BUILT_WITH_OpenTracing TRUE) -endif() - -#----------------------------------------------------------------------- -# Third party dependency versions -#----------------------------------------------------------------------- -if(BUILT_WITH_CURL) - set(BUILT_WITH_CURL_VERSION @CURL_VERSION@) -endif() - -if(BUILT_WITH_ZLIB) - set(BUILT_WITH_ZLIB_VERSION @ZLIB_VERSION@) -endif() - -if(BUILT_WITH_nlohmann_json) - set(BUILT_WITH_nlohmann_json_VERSION @nlohmann_json_VERSION@) -endif() - -if(BUILT_WITH_Protobuf) - set(BUILT_WITH_Protobuf_VERSION @Protobuf_VERSION@) -endif() - -if(BUILT_WITH_gRPC) - set(BUILT_WITH_gRPC_VERSION @gRPC_VERSION@) -endif() - -if(BUILT_WITH_prometheus-cpp) - set(BUILT_WITH_prometheus-cpp_VERSION @prometheus-cpp_VERSION@) -endif() - -if(BUILT_WITH_OpenTracing) - set(BUILT_WITH_OpenTracing_VERSION @OpenTracing_VERSION@) -endif() - -#----------------------------------------------------------------------- -# Flags to determine if CONFIG search mode should be used in find_dependency(...) -#----------------------------------------------------------------------- -set(FIND_DEPENDENCY_Threads_USE_CONFIG FALSE) -set(FIND_DEPENDENCY_ZLIB_USE_CONFIG FALSE) -set(FIND_DEPENDENCY_CURL_USE_CONFIG FALSE) -set(FIND_DEPENDENCY_nlohmann_json_USE_CONFIG TRUE) -set(FIND_DEPENDENCY_gRPC_USE_CONFIG TRUE) -set(FIND_DEPENDENCY_prometheus-cpp_USE_CONFIG TRUE) -set(FIND_DEPENDENCY_OpenTracing_USE_CONFIG TRUE) - -if(DEFINED BUILT_WITH_Protobuf_VERSION AND BUILT_WITH_Protobuf_VERSION VERSION_GREATER_EQUAL 3.22.0) - set(FIND_DEPENDENCY_Protobuf_USE_CONFIG TRUE) -else() - set(FIND_DEPENDENCY_Protobuf_USE_CONFIG FALSE) -endif() diff --git a/cmake/templates/thirdparty-dependency-definitions.cmake.in b/cmake/templates/thirdparty-dependency-definitions.cmake.in new file mode 100644 index 0000000000..d6a1716ecd --- /dev/null +++ b/cmake/templates/thirdparty-dependency-definitions.cmake.in @@ -0,0 +1,20 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +# Configured from opentelmetry-cpp/cmake/thirdparty-dependency-definitions.cmake.in + +#----------------------------------------------------------------------- +# Third party dependencies supported by opentelemetry-cpp +# Dependencies will be found in this order when find_package(opentelemetry-cpp ...) is called. +#----------------------------------------------------------------------- +set(OTEL_THIRDPARTY_DEPENDENCIES_SUPPORTED @OTEL_THIRDPARTY_DEPENDENCIES_SUPPORTED@) + +#----------------------------------------------------------------------- +# Third party dependency versions used to build opentelemetry-cpp +#----------------------------------------------------------------------- +@OTEL_THIRDPARTY_DEPENDENCY_VERSIONS_BLOCK@ + +#----------------------------------------------------------------------- +# Set the find_dependecy search mode - empty is default. Options MODULE or CONFIG +#----------------------------------------------------------------------- +@OTEL_THIRDPARTY_DEPENDENCY_SEARCH_MODES_BLOCK@ \ No newline at end of file diff --git a/cmake/thirdparty-dependency-config.cmake b/cmake/thirdparty-dependency-config.cmake new file mode 100644 index 0000000000..d4d026b22e --- /dev/null +++ b/cmake/thirdparty-dependency-config.cmake @@ -0,0 +1,46 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +#----------------------------------------------------------------------- +# Third party dependencies supported by opentelemetry-cpp +# Dependencies that must be found with find_dependency() when a user calls find_package(opentelemetry-cpp ...) +# should be included in this list. +#----------------------------------------------------------------------- +set(OTEL_THIRDPARTY_DEPENDENCIES_SUPPORTED + Threads + ZLIB + CURL + nlohmann_json + Protobuf + gRPC + prometheus-cpp + OpenTracing +) + +#----------------------------------------------------------------------- +# Third party dependency target namespaces. Defaults to the dependency's project name if not set. +# Only set if the target namespace is different from the project name (these are case sensitive). +# set(OTEL__TARGET_NAMESPACE "") +#----------------------------------------------------------------------- +set(OTEL_Protobuf_TARGET_NAMESPACE "protobuf") + +#----------------------------------------------------------------------- +# Set the find_dependecy search mode - empty is default. Options: cmake default (empty string ""), "MODULE", or "CONFIG" +# # set(OTEL__SEARCH_MODE "") +#----------------------------------------------------------------------- +set(OTEL_Threads_SEARCH_MODE "") +set(OTEL_ZLIB_SEARCH_MODE "") +set(OTEL_CURL_SEARCH_MODE "") +set(OTEL_nlohmann_json_SEARCH_MODE "CONFIG") +set(OTEL_gRPC_SEARCH_MODE "CONFIG") +set(OTEL_prometheus-cpp_SEARCH_MODE "CONFIG") +set(OTEL_OpenTracing_SEARCH_MODE "CONFIG") + +# The search mode is set to "CONFIG" for Protobuf versions >= 3.22.0 +# to find Protobuf's abseil depedency properly. +# See https://gitlab.kitware.com/cmake/cmake/-/issues/24321 +if(DEFINED Protobuf_VERSION AND Protobuf_VERSION VERSION_GREATER_EQUAL 3.22.0) + set(OTEL_Protobuf_SEARCH_MODE "CONFIG") +else() + set(OTEL_Protobuf_SEARCH_MODE "") +endif() \ No newline at end of file diff --git a/cmake/thirdparty-dependency-definitions.cmake b/cmake/thirdparty-dependency-definitions.cmake deleted file mode 100644 index 33de84f027..0000000000 --- a/cmake/thirdparty-dependency-definitions.cmake +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright The OpenTelemetry Authors -# SPDX-License-Identifier: Apache-2.0 - -#----------------------------------------------------------------------- -# Third party dependencies supported by opentelemetry-cpp -# Dependencies will be found in this order when find_package(opentelemetry-cpp ...) is called. -#----------------------------------------------------------------------- -set(THIRD_PARTY_DEPENDENCIES_SUPPORTED - Threads - ZLIB - CURL - nlohmann_json - Protobuf - gRPC - prometheus-cpp - OpenTracing -) - -#----------------------------------------------------------------------- -# THIRD_PARTY to COMPONENT dependencies -# These are the components that may require the third party dependency -#----------------------------------------------------------------------- - -# Components that require Threads -set(THIRD_PARTY_Threads_DEPENDENT_COMPONENTS - sdk -) - -# Components that may require ZLIB -set(THIRD_PARTY_ZLIB_DEPENDENT_COMPONENTS - ext_http_curl -) - -# Components that may require CURL -set(THIRD_PARTY_CURL_DEPENDENT_COMPONENTS - ext_http_curl -) - -# Components that require nlohmann_json -set(THIRD_PARTY_nlohmann_json_DEPENDENT_COMPONENTS - exporters_zipkin - exporters_elasticsearch - exporters_etw -) - -# Components that require Protobuf -set(THIRD_PARTY_Protobuf_DEPENDENT_COMPONENTS - exporters_otlp_common -) - -# Components that require gRPC -set(THIRD_PARTY_gRPC_DEPENDENT_COMPONENTS - exporters_otlp_grpc -) - -# Components that require prometheus-cpp -set(THIRD_PARTY_prometheus-cpp_DEPENDENT_COMPONENTS - exporters_prometheus -) - -# Components that require OpenTracing -set(THIRD_PARTY_OpenTracing_DEPENDENT_COMPONENTS - shims_opentracing -) diff --git a/exporters/elasticsearch/CMakeLists.txt b/exporters/elasticsearch/CMakeLists.txt index a5d0c31e99..c2763f66b5 100644 --- a/exporters/elasticsearch/CMakeLists.txt +++ b/exporters/elasticsearch/CMakeLists.txt @@ -18,31 +18,21 @@ target_link_libraries( PUBLIC opentelemetry_trace opentelemetry_logs opentelemetry_http_client_curl nlohmann_json::nlohmann_json) -if(OPENTELEMETRY_INSTALL) - install( - TARGETS opentelemetry_exporter_elasticsearch_logs - EXPORT "${PROJECT_NAME}-exporters_elasticsearch-target" - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - COMPONENT exporters_elasticsearch) - - install( - DIRECTORY include/opentelemetry/exporters/elasticsearch - DESTINATION include/opentelemetry/exporters - COMPONENT exporters_elasticsearch - FILES_MATCHING - PATTERN "*.h" - PATTERN "es_log_recordable.h" EXCLUDE) - - install( - EXPORT "${PROJECT_NAME}-exporters_elasticsearch-target" - FILE "${PROJECT_NAME}-exporters_elasticsearch-target.cmake" - NAMESPACE "${PROJECT_NAME}::" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" - COMPONENT exporters_elasticsearch) - -endif() +otel_add_component( + COMPONENT + exporters_elasticsearch + TARGETS + opentelemetry_exporter_elasticsearch_logs + FILES_DIRECTORY + "include/opentelemetry/exporters/elasticsearch" + FILES_DESTINATION + "include/opentelemetry/exporters" + FILES_MATCHING + PATTERN + "*.h" + PATTERN + "es_log_recordable.h" + EXCLUDE) if(BUILD_TESTING) add_executable(es_log_record_exporter_test diff --git a/exporters/etw/CMakeLists.txt b/exporters/etw/CMakeLists.txt index fa98992509..82147007dc 100644 --- a/exporters/etw/CMakeLists.txt +++ b/exporters/etw/CMakeLists.txt @@ -19,28 +19,18 @@ if(nlohmann_json_clone) add_dependencies(opentelemetry_exporter_etw nlohmann_json::nlohmann_json) endif() -if(OPENTELEMETRY_INSTALL) - install( - TARGETS opentelemetry_exporter_etw - EXPORT "${PROJECT_NAME}-exporters_etw-target" - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT exporters_etw) - - install( - DIRECTORY include/opentelemetry/exporters/etw - DESTINATION include/opentelemetry/exporters - COMPONENT exporters_etw - FILES_MATCHING - PATTERN "*.h") - - install( - EXPORT "${PROJECT_NAME}-exporters_etw-target" - FILE "${PROJECT_NAME}-exporters_etw-target.cmake" - NAMESPACE "${PROJECT_NAME}::" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" - COMPONENT exporters_etw) -endif() +otel_add_component( + COMPONENT + exporters_etw + TARGETS + opentelemetry_exporter_etw + FILES_DIRECTORY + "include/opentelemetry/exporters/etw" + FILES_DESTINATION + "include/opentelemetry/exporters" + FILES_MATCHING + PATTERN + "*.h") if(BUILD_TESTING) add_executable(etw_provider_test test/etw_provider_test.cc) diff --git a/exporters/memory/CMakeLists.txt b/exporters/memory/CMakeLists.txt index 79ec4b08c5..d216bd134c 100644 --- a/exporters/memory/CMakeLists.txt +++ b/exporters/memory/CMakeLists.txt @@ -32,30 +32,19 @@ set_target_version(opentelemetry_exporter_in_memory_metric) target_link_libraries(opentelemetry_exporter_in_memory_metric PUBLIC opentelemetry_metrics) -if(OPENTELEMETRY_INSTALL) - install( - TARGETS opentelemetry_exporter_in_memory - opentelemetry_exporter_in_memory_metric - EXPORT "${PROJECT_NAME}-exporters_in_memory-target" - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT exporters_in_memory) - - install( - DIRECTORY include/opentelemetry/exporters/memory - DESTINATION include/opentelemetry/exporters - COMPONENT exporters_in_memory - FILES_MATCHING - PATTERN "*.h") - - install( - EXPORT "${PROJECT_NAME}-exporters_in_memory-target" - FILE "${PROJECT_NAME}-exporters_in_memory-target.cmake" - NAMESPACE "${PROJECT_NAME}::" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" - COMPONENT exporters_in_memory) - -endif() +otel_add_component( + COMPONENT + exporters_in_memory + TARGETS + opentelemetry_exporter_in_memory + opentelemetry_exporter_in_memory_metric + FILES_DIRECTORY + "include/opentelemetry/exporters/memory" + FILES_DESTINATION + "include/opentelemetry/exporters" + FILES_MATCHING + PATTERN + "*.h") if(BUILD_TESTING) add_executable(in_memory_span_data_test test/in_memory_span_data_test.cc) diff --git a/exporters/ostream/CMakeLists.txt b/exporters/ostream/CMakeLists.txt index 7515093e1b..52369ea139 100644 --- a/exporters/ostream/CMakeLists.txt +++ b/exporters/ostream/CMakeLists.txt @@ -66,26 +66,18 @@ target_link_libraries(opentelemetry_exporter_ostream_logs PUBLIC opentelemetry_logs) list(APPEND OPENTELEMETRY_OSTREAM_TARGETS opentelemetry_exporter_ostream_logs) -if(OPENTELEMETRY_INSTALL) - install( - TARGETS ${OPENTELEMETRY_OSTREAM_TARGETS} - EXPORT "${PROJECT_NAME}-exporters_ostream-target" - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT exporters_ostream) - install( - DIRECTORY include/opentelemetry/exporters/ostream - DESTINATION include/opentelemetry/exporters - COMPONENT exporters_ostream - PATTERN "*.h") - - install( - EXPORT "${PROJECT_NAME}-exporters_ostream-target" - FILE "${PROJECT_NAME}-exporters_ostream-target.cmake" - NAMESPACE "${PROJECT_NAME}::" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" - COMPONENT exporters_ostream) -endif() +otel_add_component( + COMPONENT + exporters_ostream + TARGETS + ${OPENTELEMETRY_OSTREAM_TARGETS} + FILES_DIRECTORY + "include/opentelemetry/exporters/ostream" + FILES_DESTINATION + "include/opentelemetry/exporters" + FILES_MATCHING + PATTERN + "*.h") if(BUILD_TESTING) add_executable(ostream_log_test test/ostream_log_test.cc) diff --git a/exporters/otlp/CMakeLists.txt b/exporters/otlp/CMakeLists.txt index d30341b7ab..08303fe359 100644 --- a/exporters/otlp/CMakeLists.txt +++ b/exporters/otlp/CMakeLists.txt @@ -56,7 +56,7 @@ if(WITH_OTLP_GRPC) "$") list(APPEND OPENTELEMETRY_OTLP_GRPC_TARGETS - opentelemetry_exporter_otlp_grpc_client) + opentelemetry_exporter_otlp_grpc_client opentelemetry_proto_grpc) add_library( opentelemetry_exporter_otlp_grpc @@ -270,75 +270,72 @@ target_link_libraries( opentelemetry_otlp_recordable PUBLIC opentelemetry_trace opentelemetry_resources opentelemetry_proto) -if(OPENTELEMETRY_INSTALL) - install( - TARGETS opentelemetry_otlp_recordable - EXPORT "${PROJECT_NAME}-exporters_otlp_common-target" - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT exporters_otlp_common) - - install( - DIRECTORY include/opentelemetry/exporters/otlp - DESTINATION include/opentelemetry/exporters - COMPONENT exporters_otlp_common - FILES_MATCHING - PATTERN "*.h") - - install( - EXPORT "${PROJECT_NAME}-exporters_otlp_common-target" - FILE "${PROJECT_NAME}-exporters_otlp_common-target.cmake" - NAMESPACE "${PROJECT_NAME}::" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" - COMPONENT exporters_otlp_common) +otel_add_component( + COMPONENT + exporters_otlp_common + TARGETS + opentelemetry_otlp_recordable + opentelemetry_proto + FILES_DIRECTORY + "include/opentelemetry/exporters/otlp" + FILES_DESTINATION + "include/opentelemetry/exporters" + FILES_MATCHING + PATTERN + "*.h" + PATTERN + "otlp_http*.h" + EXCLUDE + PATTERN + "otlp_grpc*.h" + EXCLUDE + PATTERN + "otlp_file*.h" + EXCLUDE) - if(WITH_OTLP_GRPC) - install( - TARGETS ${OPENTELEMETRY_OTLP_GRPC_TARGETS} - EXPORT "${PROJECT_NAME}-exporters_otlp_grpc-target" - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT exporters_otlp_grpc) - - install( - EXPORT "${PROJECT_NAME}-exporters_otlp_grpc-target" - FILE "${PROJECT_NAME}-exporters_otlp_grpc-target.cmake" - NAMESPACE "${PROJECT_NAME}::" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" - COMPONENT exporters_otlp_grpc) - endif() +if(WITH_OTLP_GRPC) + otel_add_component( + COMPONENT + exporters_otlp_grpc + TARGETS + ${OPENTELEMETRY_OTLP_GRPC_TARGETS} + FILES_DIRECTORY + "include/opentelemetry/exporters/otlp" + FILES_DESTINATION + "include/opentelemetry/exporters" + FILES_MATCHING + PATTERN + "otlp_grpc*.h") +endif() - if(WITH_OTLP_FILE) - install( - TARGETS ${OPENTELEMETRY_OTLP_FILE_TARGETS} - EXPORT "${PROJECT_NAME}-exporters_otlp_file-target" - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT exporters_otlp_file) - - install( - EXPORT "${PROJECT_NAME}-exporters_otlp_file-target" - FILE "${PROJECT_NAME}-exporters_otlp_file-target.cmake" - NAMESPACE "${PROJECT_NAME}::" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" - COMPONENT exporters_otlp_file) - endif() +if(WITH_OTLP_HTTP) + otel_add_component( + COMPONENT + exporters_otlp_http + TARGETS + ${OPENTELEMETRY_OTLP_HTTP_TARGETS} + FILES_DIRECTORY + "include/opentelemetry/exporters/otlp" + FILES_DESTINATION + "include/opentelemetry/exporters" + FILES_MATCHING + PATTERN + "otlp_http*.h") +endif() - if(WITH_OTLP_HTTP) - install( - TARGETS ${OPENTELEMETRY_OTLP_HTTP_TARGETS} - EXPORT "${PROJECT_NAME}-exporters_otlp_http-target" - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT exporters_otlp_http) - - install( - EXPORT "${PROJECT_NAME}-exporters_otlp_http-target" - FILE "${PROJECT_NAME}-exporters_otlp_http-target.cmake" - NAMESPACE "${PROJECT_NAME}::" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" - COMPONENT exporters_otlp_http) - endif() +if(WITH_OTLP_FILE) + otel_add_component( + COMPONENT + exporters_otlp_file + TARGETS + ${OPENTELEMETRY_OTLP_FILE_TARGETS} + FILES_DIRECTORY + "include/opentelemetry/exporters/otlp" + FILES_DESTINATION + "include/opentelemetry/exporters" + FILES_MATCHING + PATTERN + "otlp_file*.h") endif() if(BUILD_TESTING) diff --git a/exporters/prometheus/CMakeLists.txt b/exporters/prometheus/CMakeLists.txt index 13fdfd1006..dfb4885f97 100644 --- a/exporters/prometheus/CMakeLists.txt +++ b/exporters/prometheus/CMakeLists.txt @@ -37,28 +37,18 @@ endif() target_link_libraries(opentelemetry_exporter_prometheus PUBLIC opentelemetry_metrics ${PROMETHEUS_CPP_TARGETS}) -if(OPENTELEMETRY_INSTALL) - install( - TARGETS ${PROMETHEUS_EXPORTER_TARGETS} - EXPORT "${PROJECT_NAME}-exporters_prometheus-target" - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT exporters_prometheus) - - install( - DIRECTORY include/opentelemetry/exporters/prometheus - DESTINATION include/opentelemetry/exporters/ - COMPONENT exporters_prometheus - FILES_MATCHING - PATTERN "*.h") - - install( - EXPORT "${PROJECT_NAME}-exporters_prometheus-target" - FILE "${PROJECT_NAME}-exporters_prometheus-target.cmake" - NAMESPACE "${PROJECT_NAME}::" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" - COMPONENT exporters_prometheus) -endif() +otel_add_component( + COMPONENT + exporters_prometheus + TARGETS + opentelemetry_exporter_prometheus + FILES_DIRECTORY + "include/opentelemetry/exporters/prometheus" + FILES_DESTINATION + "include/opentelemetry/exporters" + FILES_MATCHING + PATTERN + "*.h") if(BUILD_TESTING) add_subdirectory(test) diff --git a/exporters/zipkin/CMakeLists.txt b/exporters/zipkin/CMakeLists.txt index 52b7af913e..3b6cb203e2 100644 --- a/exporters/zipkin/CMakeLists.txt +++ b/exporters/zipkin/CMakeLists.txt @@ -22,30 +22,21 @@ target_link_libraries( PUBLIC opentelemetry_trace opentelemetry_http_client_curl nlohmann_json::nlohmann_json) -if(OPENTELEMETRY_INSTALL) - install( - TARGETS opentelemetry_exporter_zipkin_trace - EXPORT "${PROJECT_NAME}-exporters_zipkin-target" - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT exporters_zipkin) - - install( - DIRECTORY include/opentelemetry/exporters/zipkin - DESTINATION include/opentelemetry/exporters - COMPONENT exporters_zipkin - FILES_MATCHING - PATTERN "*.h" - PATTERN "recordable.h" EXCLUDE) - - install( - EXPORT "${PROJECT_NAME}-exporters_zipkin-target" - FILE "${PROJECT_NAME}-exporters_zipkin-target.cmake" - NAMESPACE "${PROJECT_NAME}::" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" - COMPONENT exporters_zipkin) - -endif() +otel_add_component( + COMPONENT + exporters_zipkin + TARGETS + opentelemetry_exporter_zipkin_trace + FILES_DIRECTORY + "include/opentelemetry/exporters/zipkin" + FILES_DESTINATION + "include/opentelemetry/exporters" + FILES_MATCHING + PATTERN + "*.h" + PATTERN + "recordable.h" + EXCLUDE) if(BUILD_TESTING) add_definitions(-DGTEST_LINKED_AS_SHARED_LIBRARY=1) diff --git a/ext/CMakeLists.txt b/ext/CMakeLists.txt index 8569658591..5110878565 100644 --- a/ext/CMakeLists.txt +++ b/ext/CMakeLists.txt @@ -10,29 +10,18 @@ target_include_directories( set_target_properties(opentelemetry_ext PROPERTIES EXPORT_NAME "ext") target_link_libraries(opentelemetry_ext INTERFACE opentelemetry_api) -if(OPENTELEMETRY_INSTALL) - install( - TARGETS opentelemetry_ext - EXPORT "${PROJECT_NAME}-ext_common-target" - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT ext_common) - - install( - DIRECTORY include/opentelemetry/ext - DESTINATION include/opentelemetry/ - COMPONENT ext_common - FILES_MATCHING - PATTERN "*.h") - - install( - EXPORT "${PROJECT_NAME}-ext_common-target" - FILE "${PROJECT_NAME}-ext_common-target.cmake" - NAMESPACE "${PROJECT_NAME}::" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" - COMPONENT ext_common) - -endif() +otel_add_component( + COMPONENT + ext_common + TARGETS + opentelemetry_ext + FILES_DIRECTORY + "include/opentelemetry/ext" + FILES_DESTINATION + "include/opentelemetry/" + FILES_MATCHING + PATTERN + "*.h") add_subdirectory(src) diff --git a/ext/src/dll/CMakeLists.txt b/ext/src/dll/CMakeLists.txt index 17323bc2a4..3533cf4020 100644 --- a/ext/src/dll/CMakeLists.txt +++ b/ext/src/dll/CMakeLists.txt @@ -6,6 +6,9 @@ set(OPENTELEMETRY_EXPORT_DEF add_library(opentelemetry_cpp SHARED dllmain.cc ${OPENTELEMETRY_EXPORT_DEF}) +set_target_properties(opentelemetry_cpp PROPERTIES EXPORT_NAME + opentelemetry_cpp) + target_link_libraries( opentelemetry_cpp PRIVATE opentelemetry_trace opentelemetry_exporter_ostream_span) @@ -116,18 +119,4 @@ add_custom_command( "-targetfile" ${OPENTELEMETRY_EXPORT_DEF} VERBATIM) -if(OPENTELEMETRY_INSTALL) - install( - TARGETS opentelemetry_cpp - EXPORT "${PROJECT_NAME}-ext_dll-target" - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT ext_dll) - - install( - EXPORT "${PROJECT_NAME}-ext_dll-target" - FILE "${PROJECT_NAME}-ext_dll-target.cmake" - NAMESPACE "${PROJECT_NAME}::" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" - COMPONENT ext_dll) -endif() +otel_add_component(COMPONENT ext_dll TARGETS opentelemetry_cpp) diff --git a/ext/src/http/client/curl/CMakeLists.txt b/ext/src/http/client/curl/CMakeLists.txt index 4c86bc74b3..0c1d8c6195 100644 --- a/ext/src/http/client/curl/CMakeLists.txt +++ b/ext/src/http/client/curl/CMakeLists.txt @@ -67,18 +67,5 @@ if(WITH_OTLP_HTTP_COMPRESSION) endif() endif() -if(OPENTELEMETRY_INSTALL) - install( - TARGETS opentelemetry_http_client_curl - EXPORT "${PROJECT_NAME}-ext_http_curl-target" - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT ext_http_curl) - - install( - EXPORT "${PROJECT_NAME}-ext_http_curl-target" - FILE "${PROJECT_NAME}-ext_http_curl-target.cmake" - NAMESPACE "${PROJECT_NAME}::" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" - COMPONENT ext_http_curl) -endif() +otel_add_component(COMPONENT ext_http_curl TARGETS + opentelemetry_http_client_curl) diff --git a/opentracing-shim/CMakeLists.txt b/opentracing-shim/CMakeLists.txt index e1130b8fd7..5e3b89c5b7 100644 --- a/opentracing-shim/CMakeLists.txt +++ b/opentracing-shim/CMakeLists.txt @@ -27,28 +27,18 @@ else() OpenTracing::opentracing) endif() -if(OPENTELEMETRY_INSTALL) - install( - TARGETS ${this_target} - EXPORT "${PROJECT_NAME}-shims_opentracing-target" - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT shims_opentracing) - - install( - DIRECTORY include/opentelemetry/opentracingshim - DESTINATION include/opentelemetry - COMPONENT shims_opentracing - FILES_MATCHING - PATTERN "*.h") - - install( - EXPORT "${PROJECT_NAME}-shims_opentracing-target" - FILE "${PROJECT_NAME}-shims_opentracing-target.cmake" - NAMESPACE "${PROJECT_NAME}::" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" - COMPONENT shims_opentracing) -endif() +otel_add_component( + COMPONENT + shims_opentracing + TARGETS + ${this_target} + FILES_DIRECTORY + "include/opentelemetry/opentracingshim" + FILES_DESTINATION + "include/opentelemetry/" + FILES_MATCHING + PATTERN + "*.h") if(BUILD_TESTING) foreach(testname propagation_test shim_utils_test span_shim_test diff --git a/sdk/CMakeLists.txt b/sdk/CMakeLists.txt index 66b9b2544d..7f65318439 100644 --- a/sdk/CMakeLists.txt +++ b/sdk/CMakeLists.txt @@ -9,39 +9,27 @@ target_include_directories( set_target_properties(opentelemetry_sdk PROPERTIES EXPORT_NAME sdk) -if(OPENTELEMETRY_INSTALL) - install( - TARGETS opentelemetry_sdk - EXPORT "${PROJECT_NAME}-sdk-target" - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT sdk) - - install( - DIRECTORY include/opentelemetry/ - DESTINATION include/opentelemetry - COMPONENT sdk - FILES_MATCHING - PATTERN "*config.h") - - install( - DIRECTORY include/opentelemetry/sdk - DESTINATION include/opentelemetry - COMPONENT sdk - FILES_MATCHING - PATTERN "*.h") - - install( - EXPORT "${PROJECT_NAME}-sdk-target" - FILE "${PROJECT_NAME}-sdk-target.cmake" - NAMESPACE "${PROJECT_NAME}::" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" - COMPONENT sdk) - -endif() - add_subdirectory(src) +otel_add_component( + COMPONENT + sdk + TARGETS + opentelemetry_sdk + opentelemetry_common + opentelemetry_resources + opentelemetry_version + opentelemetry_logs + opentelemetry_trace + opentelemetry_metrics + FILES_DIRECTORY + "include/opentelemetry/" + FILES_DESTINATION + "include/opentelemetry" + FILES_MATCHING + PATTERN + "*.h") + if(BUILD_TESTING) add_subdirectory(test) endif() diff --git a/sdk/src/common/CMakeLists.txt b/sdk/src/common/CMakeLists.txt index c27e9ca483..8add0c634c 100644 --- a/sdk/src/common/CMakeLists.txt +++ b/sdk/src/common/CMakeLists.txt @@ -19,13 +19,6 @@ target_link_libraries( Threads::Threads) if(OPENTELEMETRY_INSTALL) - install( - TARGETS opentelemetry_common - EXPORT "${PROJECT_NAME}-sdk-target" - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT sdk) - opentelemetry_add_pkgconfig( common "OpenTelemetry SDK - Common" diff --git a/sdk/src/logs/CMakeLists.txt b/sdk/src/logs/CMakeLists.txt index ff7bd49344..e873782159 100644 --- a/sdk/src/logs/CMakeLists.txt +++ b/sdk/src/logs/CMakeLists.txt @@ -35,13 +35,6 @@ target_include_directories( PUBLIC "$") if(OPENTELEMETRY_INSTALL) - install( - TARGETS opentelemetry_logs - EXPORT "${PROJECT_NAME}-sdk-target" - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT sdk) - opentelemetry_add_pkgconfig( logs "OpenTelemetry SDK - Logs" "Components for exporting logs in the OpenTelemetry SDK." diff --git a/sdk/src/metrics/CMakeLists.txt b/sdk/src/metrics/CMakeLists.txt index 8a7b801b77..73a49619a7 100644 --- a/sdk/src/metrics/CMakeLists.txt +++ b/sdk/src/metrics/CMakeLists.txt @@ -43,13 +43,6 @@ target_include_directories( PUBLIC "$") if(OPENTELEMETRY_INSTALL) - install( - TARGETS opentelemetry_metrics - EXPORT "${PROJECT_NAME}-sdk-target" - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT sdk) - opentelemetry_add_pkgconfig( metrics "OpenTelemetry SDK - Metrics" "Components for exporting metrics in the OpenTelemetry SDK." diff --git a/sdk/src/resource/CMakeLists.txt b/sdk/src/resource/CMakeLists.txt index 1dbfd1a993..4264d2eabf 100644 --- a/sdk/src/resource/CMakeLists.txt +++ b/sdk/src/resource/CMakeLists.txt @@ -13,13 +13,6 @@ target_include_directories( PUBLIC "$") if(OPENTELEMETRY_INSTALL) - install( - TARGETS opentelemetry_resources - EXPORT "${PROJECT_NAME}-sdk-target" - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT sdk) - opentelemetry_add_pkgconfig( resources "OpenTelemetry SDK - Resources" "Components for resource detection in the OpenTelemetry SDK." diff --git a/sdk/src/trace/CMakeLists.txt b/sdk/src/trace/CMakeLists.txt index 4543521eda..5d7a36dbf5 100644 --- a/sdk/src/trace/CMakeLists.txt +++ b/sdk/src/trace/CMakeLists.txt @@ -35,13 +35,6 @@ target_include_directories( PUBLIC "$") if(OPENTELEMETRY_INSTALL) - install( - TARGETS opentelemetry_trace - EXPORT "${PROJECT_NAME}-sdk-target" - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT sdk) - opentelemetry_add_pkgconfig( trace "OpenTelemetry SDK - Trace" "Components for exporting traces in the OpenTelemetry SDK." diff --git a/sdk/src/version/CMakeLists.txt b/sdk/src/version/CMakeLists.txt index bbfd9a53b8..aae7f51cf0 100644 --- a/sdk/src/version/CMakeLists.txt +++ b/sdk/src/version/CMakeLists.txt @@ -14,13 +14,6 @@ target_include_directories( PUBLIC "$") if(OPENTELEMETRY_INSTALL) - install( - TARGETS opentelemetry_version - EXPORT "${PROJECT_NAME}-sdk-target" - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT sdk) - opentelemetry_add_pkgconfig( version "OpenTelemetry SDK - Version" "A library exporting version information for OpenTelemetry." From 8c01d491ba4e03f5c086fe0b08161524e8b234f1 Mon Sep 17 00:00:00 2001 From: Douglas Barker Date: Fri, 18 Apr 2025 16:48:49 -0600 Subject: [PATCH 2/7] fix spelling --- cmake/thirdparty-dependency-config.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/thirdparty-dependency-config.cmake b/cmake/thirdparty-dependency-config.cmake index d4d026b22e..046e3a540f 100644 --- a/cmake/thirdparty-dependency-config.cmake +++ b/cmake/thirdparty-dependency-config.cmake @@ -37,7 +37,7 @@ set(OTEL_prometheus-cpp_SEARCH_MODE "CONFIG") set(OTEL_OpenTracing_SEARCH_MODE "CONFIG") # The search mode is set to "CONFIG" for Protobuf versions >= 3.22.0 -# to find Protobuf's abseil depedency properly. +# to find Protobuf's abseil dependency properly until the FindProtobuf module is updated support the upstream protobuf-config.cmake. # See https://gitlab.kitware.com/cmake/cmake/-/issues/24321 if(DEFINED Protobuf_VERSION AND Protobuf_VERSION VERSION_GREATER_EQUAL 3.22.0) set(OTEL_Protobuf_SEARCH_MODE "CONFIG") From 445a7c9e94f32bd8f4499e0e28e43b46eab11902 Mon Sep 17 00:00:00 2001 From: Douglas Barker Date: Fri, 25 Apr 2025 14:52:34 -0600 Subject: [PATCH 3/7] changelog entry --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f01050441d..9cc8cbc959 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,10 @@ Increment the: * [API] Add Enabled method to Tracer [#3357](https://github.com/open-telemetry/opentelemetry-cpp/pull/3357) +* [INSTALL] Add CMake components to the opentelemetry-cpp package + [#3320](https://github.com/open-telemetry/opentelemetry-cpp/pull/3220) + [#3368](https://github.com/open-telemetry/opentelemetry-cpp/pull/3368) + ## [1.20 2025-04-01] * [BUILD] Update opentelemetry-proto version From 21d0b356852047292bcb4c35f1740e10a96d4e38 Mon Sep 17 00:00:00 2001 From: Douglas Barker Date: Tue, 29 Apr 2025 11:58:50 -0600 Subject: [PATCH 4/7] address review feedback. Shortcut finding depedencies on the installed package. Use PROJECT_SOURCE_DIR for storing properties and configuring files --- cmake/find-package-support-functions.cmake | 4 ++ cmake/otel-install-functions.cmake | 46 +++++++++++----------- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/cmake/find-package-support-functions.cmake b/cmake/find-package-support-functions.cmake index 0b7d66799b..7cb5a76f93 100644 --- a/cmake/find-package-support-functions.cmake +++ b/cmake/find-package-support-functions.cmake @@ -132,6 +132,10 @@ 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}") diff --git a/cmake/otel-install-functions.cmake b/cmake/otel-install-functions.cmake index c7d71ab1ba..9c03dbd1c6 100644 --- a/cmake/otel-install-functions.cmake +++ b/cmake/otel-install-functions.cmake @@ -9,7 +9,7 @@ include("${PROJECT_SOURCE_DIR}/cmake/thirdparty-dependency-config.cmake") #----------------------------------------------------------------------- # _otel_set_component_properties: # Sets the component properties used for install. -# Properties set on CMAKE_SOURCE_DIR directory include: +# Properties set on PROJECT_SOURCE_DIR directory include: # OTEL_COMPONENTS_LIST: List of components added using otel_add_component # OTEL_COMPONENT_TARGETS_: List of targets associated with the component # OTEL_COMPONENT_TARGETS_ALIAS_: List of targets aliases associated with the component @@ -26,23 +26,23 @@ function(_otel_set_component_properties) cmake_parse_arguments(_PROPERTIES "${optionArgs}" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}") # Add the component to the current components list - get_property(existing_components DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY OTEL_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 ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENTS_LIST "${existing_components}") + set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENTS_LIST "${existing_components}") # Set the component targets property if(_PROPERTIES_TARGETS) - set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENT_TARGETS_${_PROPERTIES_COMPONENT} "${_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 ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENT_TARGETS_ALIAS_${_PROPERTIES_COMPONENT} "${_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 @@ -54,17 +54,17 @@ function(_otel_set_component_properties) message(FATAL_ERROR " component ${_PROPERTIES_COMPONENT} has FILES_DIRECTORY set and must have FILES_MATCHING set.") endif() - set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENT_FILES_DIRECTORY_${_PROPERTIES_COMPONENT} "${_PROPERTIES_FILES_DIRECTORY}") - set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENT_FILES_DESTINATION_${_PROPERTIES_COMPONENT} "${_PROPERTIES_FILES_DESTINATION}") - set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENT_FILES_MATCHING_${_PROPERTIES_COMPONENT} "${_PROPERTIES_FILES_MATCHING}") + 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 ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENT_DEPENDS_${_PROPERTIES_COMPONENT} "${_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 ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENT_THIRDPARTY_DEPENDS_${_PROPERTIES_COMPONENT} "${_PROPERTIES_THIRDPARTY_DEPENDS}") + set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_THIRDPARTY_DEPENDS_${_PROPERTIES_COMPONENT} "${_PROPERTIES_THIRDPARTY_DEPENDS}") endif() endfunction() @@ -87,10 +87,10 @@ endfunction() # _otel_append_dependent_components: # Appends the dependent component to the OUT_COMPONENTS variable. # The dependent component is defined in the OTEL_COMPONENT_DEPENDS_ property -# on the CMAKE_SOURCE_DIR directory. +# on the PROJECT_SOURCE_DIR directory. #----------------------------------------------------------------------- function(_otel_append_dependent_components _COMPONENT OUT_COMPONENTS) - get_property(_COMPONENT_DEPENDS DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENT_DEPENDS_${_COMPONENT}) + 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}") @@ -388,20 +388,20 @@ endfunction() # otel_install_components() #----------------------------------------------------------------------- function(otel_install_components) - get_property(OTEL_BUILT_COMPONENTS_LIST DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENTS_LIST) + 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 ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENT_DEPENDS_${_COMPONENT}) - get_property(_COMPONENT_TARGETS DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENT_TARGETS_${_COMPONENT}) - get_property(_COMPONENT_TARGETS_ALIAS DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENT_TARGETS_ALIAS_${_COMPONENT}) - get_property(_COMPONENT_THIRDPARTY_DEPENDS DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENT_THIRDPARTY_DEPENDS_${_COMPONENT}) - get_property(_COMPONENT_FILES_DIRECTORY DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENT_FILES_DIRECTORY_${_COMPONENT}) - get_property(_COMPONENT_FILES_DESTINATION DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENT_FILES_DESTINATION_${_COMPONENT}) - get_property(_COMPONENT_FILES_MATCHING DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY OTEL_COMPONENT_FILES_MATCHING_${_COMPONENT}) + 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}") @@ -419,7 +419,7 @@ function(otel_install_components) endforeach() configure_file( - "${CMAKE_SOURCE_DIR}/cmake/templates/component-definitions.cmake.in" + "${PROJECT_SOURCE_DIR}/cmake/templates/component-definitions.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake/component-definitions.cmake" @ONLY ) @@ -460,7 +460,7 @@ function(otel_install_thirdparty_definitions) endforeach() configure_file( - "${CMAKE_SOURCE_DIR}/cmake/templates/thirdparty-dependency-definitions.cmake.in" + "${PROJECT_SOURCE_DIR}/cmake/templates/thirdparty-dependency-definitions.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake/thirdparty-dependency-definitions.cmake" @ONLY) @@ -482,7 +482,7 @@ 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( - "${CMAKE_CURRENT_LIST_DIR}/cmake/templates/opentelemetry-cpp-config.cmake.in" + "${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 From 4ba69fd6bbbc68ec91e09d9480949e57ac6d5ef3 Mon Sep 17 00:00:00 2001 From: Douglas Barker Date: Wed, 7 May 2025 15:32:21 -0600 Subject: [PATCH 5/7] add a CMake FetchContent test to build opentelemetry-cpp as a subdirectory of an external project --- .github/workflows/ci.yml | 22 ++++++++ ci/do_ci.sh | 39 ++++++++++++++ .../cmake/fetch_content_test/CMakeLists.txt | 54 +++++++++++++++++++ 3 files changed, 115 insertions(+) create mode 100644 install/test/cmake/fetch_content_test/CMakeLists.txt diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6c27783a0c..359b338945 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -57,6 +57,28 @@ jobs: run: | ./ci/do_ci.sh cmake.test + cmake_fetch_content_test: + name: CMake FetchContent usage with opentelemetry-cpp + runs-on: ubuntu-24.04 + env: + CXX_STANDARD: '17' + steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 + with: + egress-policy: audit + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + submodules: 'recursive' + - name: setup + run: | + sudo -E ./ci/setup_ci_environment.sh + sudo -E ./ci/setup_cmake.sh + sudo -E ./ci/setup_googletest.sh + - name: run fetch content cmake test + run: | + ./ci/do_ci.sh cmake.fetch_content.test + cmake_gcc_maintainer_sync_test: name: CMake gcc 14 (maintainer mode, sync) runs-on: ubuntu-24.04 diff --git a/ci/do_ci.sh b/ci/do_ci.sh index 24f6707dd6..57b2053512 100755 --- a/ci/do_ci.sh +++ b/ci/do_ci.sh @@ -514,6 +514,45 @@ elif [[ "$1" == "cmake.install.test" ]]; then -S "${SRC_DIR}/install/test/cmake" ctest --output-on-failure exit 0 +elif [[ "$1" == "cmake.fetch_content.test" ]]; then + if [[ -n "${BUILD_SHARED_LIBS}" && "${BUILD_SHARED_LIBS}" == "ON" ]]; then + CMAKE_OPTIONS+=("-DBUILD_SHARED_LIBS=ON") + echo "BUILD_SHARED_LIBS is set to: ON" + else + CMAKE_OPTIONS+=("-DBUILD_SHARED_LIBS=OFF") + echo "BUILD_SHARED_LIBS is set to: OFF" + fi + CMAKE_OPTIONS+=("-DCMAKE_POSITION_INDEPENDENT_CODE=ON") + + cd "${BUILD_DIR}" + rm -rf * + cmake "${CMAKE_OPTIONS[@]}" \ + -DCMAKE_INSTALL_PREFIX=${INSTALL_TEST_DIR} \ + -DWITH_ABI_VERSION_1=OFF \ + -DWITH_ABI_VERSION_2=ON \ + -DWITH_METRICS_EXEMPLAR_PREVIEW=ON \ + -DWITH_ASYNC_EXPORT_PREVIEW=ON \ + -DWITH_THREAD_INSTRUMENTATION_PREVIEW=ON \ + -DWITH_OTLP_GRPC_SSL_MTLS_PREVIEW=ON \ + -DWITH_OTLP_RETRY_PREVIEW=ON \ + -DWITH_OTLP_GRPC=OFF \ + -DWITH_OTLP_HTTP=OFF \ + -DWITH_OTLP_FILE=OFF \ + -DWITH_OTLP_HTTP_COMPRESSION=OFF \ + -DWITH_HTTP_CLIENT_CURL=OFF \ + -DWITH_PROMETHEUS=OFF \ + -DWITH_ZIPKIN=OFF \ + -DWITH_ELASTICSEARCH=OFF \ + -DWITH_EXAMPLES=OFF \ + -DWITH_EXAMPLES_HTTP=OFF \ + -DBUILD_W3CTRACECONTEXT_TEST=OFF \ + -DOPENTELEMETRY_INSTALL=OFF \ + -DOPENTELEMETRY_CPP_SRC_DIR="${SRC_DIR}" \ + "${SRC_DIR}/install/test/cmake/fetch_content_test" + make -j $(nproc) + make test + exit 0 + elif [[ "$1" == "cmake.test_example_plugin" ]]; then # Build the plugin cd "${BUILD_DIR}" diff --git a/install/test/cmake/fetch_content_test/CMakeLists.txt b/install/test/cmake/fetch_content_test/CMakeLists.txt new file mode 100644 index 0000000000..0bfbc87669 --- /dev/null +++ b/install/test/cmake/fetch_content_test/CMakeLists.txt @@ -0,0 +1,54 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +# This test uses CMake's FetchContent module to build opentelemetry-cpp from src +# and make its targets available within an external project. + +cmake_minimum_required(VERSION 3.14) + +project(opentelemetry-cpp-fetch-content-test LANGUAGES CXX) + +find_package(GTest CONFIG REQUIRED) + +set(BUILD_TESTING + ON + CACHE BOOL "Build tests" FORCE) + +if(NOT DEFINED OPENTELEMETRY_CPP_SRC_DIR) + message( + FATAL_ERROR + "OPENTELEMETRY_CPP_SRC_DIR must be defined when running cmake on this test project" + ) +endif() + +message( + STATUS + "Adding opentelemetry-cpp as a subdirectory with FetchContent from ${OPENTELEMETRY_CPP_SRC_DIR}" +) + +include(FetchContent) +FetchContent_Declare(opentelemetry-cpp SOURCE_DIR ${OPENTELEMETRY_CPP_SRC_DIR}) +FetchContent_MakeAvailable(opentelemetry-cpp) + +add_executable( + fetch_content_src_test + ${OPENTELEMETRY_CPP_SRC_DIR}/install/test/src/test_api.cc + ${OPENTELEMETRY_CPP_SRC_DIR}/install/test/src/test_sdk.cc) + +target_link_libraries( + fetch_content_src_test + PRIVATE opentelemetry-cpp::api + opentelemetry-cpp::version + opentelemetry-cpp::metrics + opentelemetry-cpp::trace + opentelemetry-cpp::logs + GTest::gtest + GTest::gtest_main) + +include(CTest) +include(GoogleTest) + +gtest_add_tests( + TARGET fetch_content_src_test + TEST_PREFIX fetch_content. + TEST_LIST fetch_content_src_test) From 92ab6dafcf51d805f9771b76e42f3343f33935c0 Mon Sep 17 00:00:00 2001 From: Douglas Barker Date: Wed, 7 May 2025 16:24:27 -0600 Subject: [PATCH 6/7] update install documentation to include CMake FetchContent usage --- INSTALL.md | 60 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 47 insertions(+), 13 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index 08292d481b..b0ca5eec91 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -151,21 +151,55 @@ If building and installing Protobuf and gRPC manually with cmake the $ ``` -### Incorporating into an existing CMake Project +### Incorporating into an external CMake Project -To use the library from a CMake project, you can locate it directly with - `find_package` and use the imported targets from generated package - configurations. As of now, this will import targets for both API and SDK. In - future, there may be separate packages for API and SDK which can be installed - and imported separately according to need. +There are two approaches to incoporate `opentelemetry-cpp` into + an external CMake project: -```cmake -# CMakeLists.txt -find_package(opentelemetry-cpp CONFIG REQUIRED) -... -target_include_directories(foo PRIVATE ${OPENTELEMETRY_CPP_INCLUDE_DIRS}) -target_link_libraries(foo PRIVATE ${OPENTELEMETRY_CPP_LIBRARIES}) -``` +1. Build and install `opentelemetry-cpp` then use `find_package` + to import its targets + + ```cmake + # Find all installed components and link all imported targets + find_package(opentelemetry-cpp CONFIG REQUIRED) + ... + target_include_directories(foo PRIVATE ${OPENTELEMETRY_CPP_INCLUDE_DIRS}) + target_link_libraries(foo PRIVATE ${OPENTELEMETRY_CPP_LIBRARIES}) + ``` + + ```cmake + # Find a specific component and link its imported target(s) + find_package(opentelemetry-cpp CONFIG REQUIRED COMPONENTS api) + ... + target_link_libraries(foo PRIVATE opentelemetry-cpp::api) + ``` + +2. Use CMake's [FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html) + module to fetch and build `opentelemetry-cpp` then make its targets available + + ```cmake + # Fetch from an existing clone and build + include(FetchContent) + FetchContent_Declare(opentelemetry-cpp SOURCE_DIR "") + FetchContent_MakeAvailable(opentelemetry-cpp) + ... + target_link_libraries(foo PRIVATE opentelemetry-cpp::api) + ``` + + ```cmake + # Clone and build opentelemetry-cpp from a git tag + include(FetchContent) + FetchContent_Declare( + opentelemetry-cpp + GIT_REPOSITORY https://github.com/open-telemetry/opentelemetry-cpp.git + GIT_TAG v1.20.0) + FetchContent_MakeAvailable(opentelemetry-cpp) + ... + target_link_libraries(foo PRIVATE opentelemetry-cpp::api) + ``` + +In both cases the project's built or imported CMake targets will be + available in the `opentelemetry-cpp` namespace (ie: `opentelemetry-cpp::api`) #### Using opentelemetry-cpp package components From a4512ce6bbe94815947a656fd5bc035fbaac3031 Mon Sep 17 00:00:00 2001 From: Douglas Barker Date: Wed, 7 May 2025 21:38:00 -0600 Subject: [PATCH 7/7] fail otel_add_component if a target's EXPORT_NAME property is not set. Clean up cmake script debug and error messages --- cmake/find-package-support-functions.cmake | 10 ++++------ cmake/otel-install-functions.cmake | 10 ++++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/cmake/find-package-support-functions.cmake b/cmake/find-package-support-functions.cmake index 7cb5a76f93..f38c3268fa 100644 --- a/cmake/find-package-support-functions.cmake +++ b/cmake/find-package-support-functions.cmake @@ -47,11 +47,12 @@ function(get_requested_components installed_components_in requested_components_o 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 supported component of the opentelemetry-cpp package. Built components include: ${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(FATAL_ERROR " get_requested_components: Component `${_COMPONENT}` is supported by opentelemetry-cpp but not installed. Installed components include: ${${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}) @@ -69,13 +70,11 @@ endfunction() 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 supported component of the opentelemetry-cpp package.") + 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}}) - else() - message(FATAL_ERROR " get_component_targets: ${targets_var} is not defined. Please add it to component-definitions.cmake to define the exported targets for this component.") endif() endif() set(${targets_out} ${result} PARENT_SCOPE) @@ -93,7 +92,6 @@ function(get_targets components_in targets_out) endforeach() endforeach() set(${targets_out} ${result} PARENT_SCOPE) - message(DEBUG "get_targets: found the following installed and requested targets. ${result}") endfunction() diff --git a/cmake/otel-install-functions.cmake b/cmake/otel-install-functions.cmake index 9c03dbd1c6..8d72c12ce5 100644 --- a/cmake/otel-install-functions.cmake +++ b/cmake/otel-install-functions.cmake @@ -218,12 +218,14 @@ endfunction() #------------------------------------------------------------------------ function(_otel_add_target_alias _TARGET OUT_ALIAS_TARGETS) get_target_property(_TARGET_EXPORT_NAME ${_TARGET} EXPORT_NAME) - if(_TARGET_EXPORT_NAME AND NOT TARGET "${PROJECT_NAME}::${_TARGET_EXPORT_NAME}") - set(_alias_targets "${${OUT_ALIAS_TARGETS}}") + 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}) - list(APPEND _alias_targets "${PROJECT_NAME}::${_TARGET_EXPORT_NAME}") - set(${OUT_ALIAS_TARGETS} "${_alias_targets}" PARENT_SCOPE) 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() #-----------------------------------------------------------------------