From 546fcd797972d257bf255884a3c52f2fd10bfc61 Mon Sep 17 00:00:00 2001 From: Doug Barker Date: Wed, 14 May 2025 01:44:27 -0600 Subject: [PATCH] [INSTALL] Unify cmake install functions and dynamically set component dependencies (#3368) --- .github/workflows/ci.yml | 22 + CHANGELOG.md | 4 + CMakeLists.txt | 43 +- INSTALL.md | 60 ++- api/CMakeLists.txt | 34 +- ci/do_ci.sh | 39 ++ cmake/component-definitions.cmake | 221 -------- cmake/find-package-support-functions.cmake | 134 ++--- cmake/opentelemetry-proto.cmake | 18 - cmake/otel-install-functions.cmake | 506 ++++++++++++++++++ .../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 +- .../cmake/fetch_content_test/CMakeLists.txt | 54 ++ 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 - 34 files changed, 1016 insertions(+), 924 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 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/CHANGELOG.md b/CHANGELOG.md index b7180b4aec..8cd80f5dac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,10 @@ Increment the: * [SDK] Aggregate identical metrics instruments and detect duplicates [#3358](https://github.com/open-telemetry/opentelemetry-cpp/pull/3358) +* [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 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_") + 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 diff --git a/api/CMakeLists.txt b/api/CMakeLists.txt index 518b1e04d5..0707464b36 100644 --- a/api/CMakeLists.txt +++ b/api/CMakeLists.txt @@ -9,28 +9,20 @@ target_include_directories( set_target_properties(opentelemetry_api PROPERTIES EXPORT_NAME api) -if(OPENTELEMETRY_INSTALL) - install( - TARGETS opentelemetry_api - EXPORT "${PROJECT_NAME}-api-target" - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT api) - - install( - DIRECTORY include/opentelemetry - DESTINATION include - COMPONENT api - FILES_MATCHING - PATTERN "*.h") - - install( - EXPORT "${PROJECT_NAME}-api-target" - FILE "${PROJECT_NAME}-api-target.cmake" - NAMESPACE "${PROJECT_NAME}::" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" - COMPONENT api) +otel_add_component( + COMPONENT + api + TARGETS + opentelemetry_api + FILES_DIRECTORY + "include/opentelemetry" + FILES_DESTINATION + "include" + FILES_MATCHING + PATTERN + "*.h") +if(OPENTELEMETRY_INSTALL) unset(TARGET_DEPS) endif() 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/cmake/component-definitions.cmake b/cmake/component-definitions.cmake deleted file mode 100644 index 74087beff4..0000000000 --- a/cmake/component-definitions.cmake +++ /dev/null @@ -1,221 +0,0 @@ -# Copyright The OpenTelemetry Authors -# SPDX-License-Identifier: Apache-2.0 - -# ---------------------------------------------------------------------- -# opentelmetry-cpp COMPONENT list -# ---------------------------------------------------------------------- -set(opentelemetry-cpp_COMPONENTS - api - sdk - ext_common - ext_http_curl - exporters_in_memory - exporters_ostream - exporters_otlp_common - exporters_otlp_file - exporters_otlp_grpc - exporters_otlp_http - exporters_prometheus - exporters_elasticsearch - exporters_etw - exporters_zipkin - shims_opentracing - ext_dll -) - -# ---------------------------------------------------------------------- -# COMPONENT to TARGET lists -# ---------------------------------------------------------------------- - -# COMPONENT api -set(COMPONENT_opentelemetry-cpp_api_TARGETS - opentelemetry-cpp::api -) - -# COMPONENT sdk -set(COMPONENT_opentelemetry-cpp_sdk_TARGETS - opentelemetry-cpp::sdk - opentelemetry-cpp::version - opentelemetry-cpp::common - opentelemetry-cpp::resources - opentelemetry-cpp::trace - opentelemetry-cpp::metrics - opentelemetry-cpp::logs -) - -# COMPONENT ext_common -set(COMPONENT_opentelemetry-cpp_ext_common_TARGETS - opentelemetry-cpp::ext -) - -# COMPONENT ext_http_curl -set(COMPONENT_opentelemetry-cpp_ext_http_curl_TARGETS - opentelemetry-cpp::http_client_curl -) - -# COMPONENT ext_dll -set(COMPONENT_opentelemetry-cpp_ext_dll_TARGETS - opentelemetry-cpp::opentelemetry_cpp -) - -# COMPONENT exporters_in_memory -set(COMPONENT_opentelemetry-cpp_exporters_in_memory_TARGETS - opentelemetry-cpp::in_memory_span_exporter - opentelemetry-cpp::in_memory_metric_exporter -) - -# COMPONENT exporters_ostream -set(COMPONENT_opentelemetry-cpp_exporters_ostream_TARGETS - opentelemetry-cpp::ostream_log_record_exporter - opentelemetry-cpp::ostream_metrics_exporter - opentelemetry-cpp::ostream_span_exporter -) - -# COMPONENT exporters_otlp_common -set(COMPONENT_opentelemetry-cpp_exporters_otlp_common_TARGETS - opentelemetry-cpp::proto - opentelemetry-cpp::otlp_recordable -) - -# COMPONENT exporters_otlp_file -set(COMPONENT_opentelemetry-cpp_exporters_otlp_file_TARGETS - opentelemetry-cpp::otlp_file_client - opentelemetry-cpp::otlp_file_exporter - opentelemetry-cpp::otlp_file_log_record_exporter - opentelemetry-cpp::otlp_file_metric_exporter -) - -# COMPONENT exporters_otlp_grpc -set(COMPONENT_opentelemetry-cpp_exporters_otlp_grpc_TARGETS - opentelemetry-cpp::proto_grpc - opentelemetry-cpp::otlp_grpc_client - opentelemetry-cpp::otlp_grpc_exporter - opentelemetry-cpp::otlp_grpc_log_record_exporter - opentelemetry-cpp::otlp_grpc_metrics_exporter -) - -# COMPONENT exporters_otlp_http -set(COMPONENT_opentelemetry-cpp_exporters_otlp_http_TARGETS - opentelemetry-cpp::otlp_http_client - opentelemetry-cpp::otlp_http_exporter - opentelemetry-cpp::otlp_http_log_record_exporter - opentelemetry-cpp::otlp_http_metric_exporter -) - -# COMPONENT exporters_prometheus -set(COMPONENT_opentelemetry-cpp_exporters_prometheus_TARGETS - opentelemetry-cpp::prometheus_exporter -) - -# COMPONENT exporters_elasticsearch -set(COMPONENT_opentelemetry-cpp_exporters_elasticsearch_TARGETS - opentelemetry-cpp::elasticsearch_log_record_exporter -) - -# COMPONENT exporters_etw -set(COMPONENT_opentelemetry-cpp_exporters_etw_TARGETS - opentelemetry-cpp::etw_exporter -) - -# COMPONENT exporters_zipkin -set(COMPONENT_opentelemetry-cpp_exporters_zipkin_TARGETS - opentelemetry-cpp::zipkin_trace_exporter -) - -# COMPONENT shims_opentracing -set(COMPONENT_opentelemetry-cpp_shims_opentracing_TARGETS - opentelemetry-cpp::opentracing_shim -) - - -#----------------------------------------------------------------------- -# COMPONENT to COMPONENT dependencies -#----------------------------------------------------------------------- - -# COMPONENT sdk depends on COMPONENT api -set(COMPONENT_sdk_COMPONENT_DEPENDS - api -) - -set(COMPONENT_ext_common_COMPONENT_DEPENDS - api - sdk -) - -set(COMPONENT_ext_http_curl_COMPONENT_DEPENDS - api - sdk - ext_common -) - -set(COMPONENT_ext_dll_COMPONENT_DEPENDS - api - sdk - ext_common - exporters_in_memory - exporters_ostream -) - -set(COMPONENT_exporters_in_memory_COMPONENT_DEPENDS - api - sdk -) - -set(COMPONENT_exporters_ostream_COMPONENT_DEPENDS - api - sdk -) - -set(COMPONENT_exporters_otlp_common_COMPONENT_DEPENDS - api - sdk -) - -set(COMPONENT_exporters_otlp_file_COMPONENT_DEPENDS - api - sdk - exporters_otlp_common -) - -set(COMPONENT_exporters_otlp_grpc_COMPONENT_DEPENDS - api - sdk - ext_common - exporters_otlp_common -) - -set(COMPONENT_exporters_otlp_http_COMPONENT_DEPENDS - api - sdk - ext_common - ext_http_curl - exporters_otlp_common -) - -set(COMPONENT_exporters_prometheus_COMPONENT_DEPENDS - api - sdk -) - -set(COMPONENT_exporters_elasticsearch_COMPONENT_DEPENDS - api - sdk - ext_common - ext_http_curl -) - -set(COMPONENT_exporters_etw_COMPONENT_DEPENDS - api - sdk -) - -set(COMPONENT_exporters_zipkin_COMPONENT_DEPENDS - api - sdk - ext_common - ext_http_curl -) - -set(COMPONENT_shims_opentracing_COMPONENT_DEPENDS - api -) \ No newline at end of file diff --git a/cmake/find-package-support-functions.cmake b/cmake/find-package-support-functions.cmake index 5cb9f99443..f38c3268fa 100644 --- a/cmake/find-package-support-functions.cmake +++ b/cmake/find-package-support-functions.cmake @@ -3,21 +3,13 @@ include("${CMAKE_CURRENT_LIST_DIR}/component-definitions.cmake") include("${CMAKE_CURRENT_LIST_DIR}/thirdparty-dependency-definitions.cmake") -include("${CMAKE_CURRENT_LIST_DIR}/thirdparty-built-with-flags.cmake") - -#------------------------------------------------------------------------- -# Functions to get supported, installed, and requested components. -#------------------------------------------------------------------------- -function(get_supported_components components_out) - set(${components_out} ${opentelemetry-cpp_COMPONENTS} PARENT_SCOPE) -endfunction() #------------------------------------------------------------------------- # Function to get installed components. #------------------------------------------------------------------------- function(get_installed_components installed_components_out) set(result "") - foreach(_COMPONENT IN LISTS opentelemetry-cpp_COMPONENTS) + foreach(_COMPONENT IN LISTS OTEL_BUILT_COMPONENTS_LIST) set(_COMPONENT_TARGET_FILE "${CMAKE_CURRENT_LIST_DIR}/opentelemetry-cpp-${_COMPONENT}-target.cmake") if(EXISTS "${_COMPONENT_TARGET_FILE}") list(APPEND result ${_COMPONENT}) @@ -54,23 +46,19 @@ function(get_requested_components installed_components_in requested_components_o else() message(DEBUG "get_requested_components: Components requested: ${opentelemetry-cpp_FIND_COMPONENTS}") foreach(_COMPONENT IN LISTS opentelemetry-cpp_FIND_COMPONENTS) - if(NOT ${_COMPONENT} IN_LIST opentelemetry-cpp_COMPONENTS) - message(ERROR " get_requested_components: Component `${_COMPONENT}` is not a supported component of the opentelemetry-cpp package. Supported components include: ${opentelemetry-cpp_COMPONENTS}") + if(NOT ${_COMPONENT} IN_LIST OTEL_BUILT_COMPONENTS_LIST) + message(ERROR " get_requested_components: Component `${_COMPONENT}` is not a built component of the opentelemetry-cpp package. Built components include: ${OTEL_BUILT_COMPONENTS_LIST}") return() endif() if(NOT ${_COMPONENT} IN_LIST ${installed_components_in}) - message(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) - foreach(_DEPENDENT_COMPONENT IN LISTS _DEPENDENT_COMPONENTS) - if(NOT ${_DEPENDENT_COMPONENT} IN_LIST result) - list(APPEND result ${_DEPENDENT_COMPONENT}) - endif() - endforeach(_DEPENDENT_COMPONENT IN LISTS _DEPENDENT_COMPONENTS) - if(NOT ${_COMPONENT} IN_LIST result) - list(APPEND result ${_COMPONENT}) - endif() + list(APPEND result ${_DEPENDENT_COMPONENTS}) + list(APPEND result ${_COMPONENT}) endforeach() + list(REMOVE_DUPLICATES result) set(${requested_components_out} ${result} PARENT_SCOPE) endif() endfunction() @@ -81,14 +69,12 @@ endfunction() #------------------------------------------------------------------------- function(get_component_targets component_in targets_out) set(result "") - if(NOT ${comp} IN_LIST opentelemetry-cpp_COMPONENTS) - message(ERROR " get_component_targets: Component `${comp}` component is not a supported component of the opentelemetry-cpp package.") + if(NOT ${component_in} IN_LIST OTEL_BUILT_COMPONENTS_LIST) + message(ERROR " get_component_targets: Component `${component_in}` component is not a built component of the opentelemetry-cpp package.") else() - set(targets_var "COMPONENT_opentelemetry-cpp_${comp}_TARGETS") + 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) @@ -99,14 +85,13 @@ endfunction() #------------------------------------------------------------------------- function(get_targets components_in targets_out) set(result "") - foreach(comp IN LISTS ${components_in}) - get_component_targets(${comp} comp_targets) + foreach(_comp IN LISTS ${components_in}) + get_component_targets(${_comp} comp_targets) foreach(target IN LISTS comp_targets) list(APPEND result ${target}) endforeach() endforeach() set(${targets_out} ${result} PARENT_SCOPE) - message(DEBUG "get_targets: found the following installed and requested targets. ${result}") endfunction() @@ -115,73 +100,27 @@ endfunction() #------------------------------------------------------------------------- function(check_targets_imported targets_in) set(result TRUE) - foreach(target IN LISTS ${targets_in}) - if(TARGET ${target}) - message(DEBUG "check_targets_imported: imported target `${target}`") + foreach(_target IN LISTS ${targets_in}) + if(TARGET ${_target}) + message(DEBUG "check_targets_imported: imported target `${_target}`") else() - message(FATAL_ERROR " check_targets_imported: failed to import target `${target}`") + message(FATAL_ERROR " check_targets_imported: failed to import target `${_target}`") set(result FALSE) endif() endforeach() set(${result_bool_out} ${result} PARENT_SCOPE) endfunction() -#------------------------------------------------------------------------- -# Function to get all supported third party dependencies -#------------------------------------------------------------------------- -function(get_supported_third_party_dependencies dependencies_out) - set(${dependencies_out} ${THIRD_PARTY_DEPNDENCIES_SUPPORTED} PARENT_SCOPE) -endfunction() - -#------------------------------------------------------------------------- -# Function to check if a third-party dependency is required for a component. -#------------------------------------------------------------------------- -function(is_dependency_required_by_component component_in dependency_in is_required_out) - set(result FALSE) - set(depends_var "THIRD_PARTY_${dependency_in}_DEPENDENT_COMPONENTS") - if(NOT DEFINED ${depends_var}) - message(FATAL_ERROR " is_dependency_required_by_component: ${depends_var} is not defined. - Please add ${depends_var} - in the 'thirdparty-dependency-definitions.cmake' file") - return() - endif() - - if(${component_in} IN_LIST ${depends_var}) - set(result TRUE) - message(DEBUG "is_dependency_required_by_component: ${dependency_in} is required by component ${component_in}.") - endif() - set(${is_required_out} ${result} PARENT_SCOPE) -endfunction() - #------------------------------------------------------------------------- # Check if a dependency is expected and required #------------------------------------------------------------------------- function (is_dependency_required dependency_in components_in is_required_out) - if(NOT DEFINED BUILT_WITH_${dependency_in}) - message(FATAL_ERROR " is_dependency_required: The BUILT_WITH_${dependency_in} flag is required but not defined in the 'thirdparty-built-with-flags.cmake' file") - elseif(NOT BUILT_WITH_${dependency_in}) - set(${is_required_out} FALSE PARENT_SCOPE) - else() - foreach(component IN LISTS ${components_in}) - set(is_required_by_component FALSE) - is_dependency_required_by_component(${component} ${dependency} is_required_by_component) - if(is_required_by_component) - set(${is_required_out} TRUE PARENT_SCOPE) - return() - endif() - endforeach() - endif() -endfunction() - -#------------------------------------------------------------------------- -# Check if a dependency should be found using CONFIG search mode -#------------------------------------------------------------------------- -function (is_config_mode_required dependency_in use_config_out) - if(NOT FIND_DEPENDENCY_${dependency}_USE_CONFIG OR NOT FIND_DEPENDENCY_${dependency}_USE_CONFIG) - set(${use_config_out} FALSE PARENT_SCOPE) - else() - set(${use_config_out} TRUE PARENT_SCOPE) - endif() + foreach(_component IN LISTS ${components_in}) + if(${dependency_in} IN_LIST COMPONENT_${_component}_THIRDPARTY_DEPENDS) + set(${is_required_out} TRUE PARENT_SCOPE) + return() + endif() + endforeach() endfunction() #------------------------------------------------------------------------- @@ -190,23 +129,20 @@ endfunction() include(CMakeFindDependencyMacro) function(find_required_dependencies components_in) - foreach(dependency IN LISTS THIRD_PARTY_DEPENDENCIES_SUPPORTED) + 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}") + is_dependency_required(${_dependency} ${components_in} is_required) + message(DEBUG "find_required_dependencies: dependency = ${_dependency}, is_required = ${is_required}") if(is_required) - set(use_config FALSE) - is_config_mode_required(${dependency} use_config) - if(${use_config}) - message(DEBUG "find_required_dependencies: calling find_dependency(${dependency} CONFIG)...") - find_dependency(${dependency} CONFIG) - else() - message(DEBUG "find_required_dependencies: calling find_dependency(${dependency})...") - find_dependency(${dependency}) - endif() - if(${dependency}_FOUND AND DEFINED BUILT_WITH_${dependency}_VERSION AND DEFINED ${dependency}_VERSION) - if(NOT ${dependency}_VERSION VERSION_EQUAL ${BUILT_WITH_${dependency}_VERSION}) - message(WARNING "find_required_dependencies: found ${dependency} version ${${dependency}_VERSION} which does not match the opentelemetry-cpp built with version ${BUILT_WITH_${dependency}_VERSION}.") + message(DEBUG "find_required_dependencies: calling find_dependency(${_dependency} ${OTEL_${_dependency}_SEARCH_MODE} )...") + find_dependency(${_dependency} ${OTEL_${_dependency}_SEARCH_MODE}) + if(${_dependency}_FOUND AND DEFINED OTEL_${_dependency}_VERSION AND DEFINED ${_dependency}_VERSION) + if(NOT ${_dependency}_VERSION VERSION_EQUAL ${OTEL_${_dependency}_VERSION}) + message(WARNING "find_required_dependencies: found ${_dependency} version ${${_dependency}_VERSION} which does not match the opentelemetry-cpp built with version ${OTEL_${_dependency}_VERSION}.") endif() endif() endif() diff --git a/cmake/opentelemetry-proto.cmake b/cmake/opentelemetry-proto.cmake index d88f66966e..67e54149d7 100644 --- a/cmake/opentelemetry-proto.cmake +++ b/cmake/opentelemetry-proto.cmake @@ -365,24 +365,6 @@ set_target_properties(opentelemetry_proto PROPERTIES EXPORT_NAME proto) patch_protobuf_targets(opentelemetry_proto) if(OPENTELEMETRY_INSTALL) - install( - TARGETS opentelemetry_proto - 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) - - if(WITH_OTLP_GRPC) - install( - TARGETS opentelemetry_proto_grpc - 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) - endif() - install( DIRECTORY ${GENERATED_PROTOBUF_PATH}/opentelemetry DESTINATION include diff --git a/cmake/otel-install-functions.cmake b/cmake/otel-install-functions.cmake new file mode 100644 index 0000000000..8d72c12ce5 --- /dev/null +++ b/cmake/otel-install-functions.cmake @@ -0,0 +1,506 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 +include("${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_: 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 ${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_ 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__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(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__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 ${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__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( + "${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() \ 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..046e3a540f --- /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 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") +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/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) 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 d205eeef2c..b56fd553e9 100644 --- a/sdk/src/metrics/CMakeLists.txt +++ b/sdk/src/metrics/CMakeLists.txt @@ -44,13 +44,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."