From 44825077214914e9806fe3bac38a97d1a8037c9d Mon Sep 17 00:00:00 2001 From: owent Date: Tue, 15 Aug 2023 15:46:07 +0800 Subject: [PATCH 1/4] Support to use different cmake package CONFIG of dependencies. --- CMakeLists.txt | 1 + cmake/patch-imported-config.cmake | 141 ++++++++++++++++++++++++++++++ cmake/tools.cmake | 70 +++++++++++++++ 3 files changed, 212 insertions(+) create mode 100644 cmake/patch-imported-config.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index dcf1034804..a659dec9e3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -647,6 +647,7 @@ if(NOT WITH_API_ONLY) endif() 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) diff --git a/cmake/patch-imported-config.cmake b/cmake/patch-imported-config.cmake new file mode 100644 index 0000000000..ec68d74099 --- /dev/null +++ b/cmake/patch-imported-config.cmake @@ -0,0 +1,141 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +# Some prebuilt or installed targets may have different CONFIG settings than +# what we use to configure otel-cpp. This file applies patches to the imported +# targets in order to use compatible CONFIG settings for fallback. + +# Common dependencies +project_build_tools_patch_default_imported_config(ZLIB::ZLIB) + +# protobuf targets +if(Protobuf_FOUND OR PROTOBUF_FOUND) + project_build_tools_patch_default_imported_config( + utf8_range::utf8_range utf8_range::utf8_validity protobuf::libprotobuf-lite + protobuf::libprotobuf protobuf::libprotoc) +endif() + +# cares targets +if(TARGET c-ares::cares) + project_build_tools_patch_default_imported_config(c-ares::cares) +endif() + +# curl targets +if(TARGET CURL::libcurl) + project_build_tools_patch_default_imported_config(CURL::libcurl) +endif() + +# abseil targets +if(WITH_ABSEIL) + project_build_tools_patch_default_imported_config( + absl::bad_variant_access + absl::raw_logging_internal + absl::log_severity + absl::log_internal_check_op + absl::log_internal_nullguard + absl::strings + absl::strings_internal + absl::base + absl::spinlock_wait + absl::int128 + absl::throw_delegate + absl::log_internal_message + absl::examine_stack + absl::stacktrace + absl::debugging_internal + absl::symbolize + absl::demangle_internal + absl::malloc_internal + absl::log_internal_format + absl::log_internal_globals + absl::time + absl::civil_time + absl::time_zone + absl::str_format_internal + absl::log_internal_proto + absl::log_internal_log_sink_set + absl::log_globals + absl::hash + absl::city + absl::bad_optional_access + absl::low_level_hash + absl::log_entry + absl::log_sink + absl::synchronization + absl::graphcycles_internal + absl::strerror + absl::log_internal_conditions + absl::cord + absl::cord_internal + absl::crc_cord_state + absl::crc32c + absl::crc_cpu_detect + absl::crc_internal + absl::cordz_functions + absl::exponential_biased + absl::cordz_info + absl::cordz_handle + absl::leak_check + absl::die_if_null + absl::flags + absl::flags_commandlineflag + absl::flags_commandlineflag_internal + absl::flags_config + absl::flags_program_name + absl::flags_internal + absl::flags_marshalling + absl::flags_reflection + absl::flags_private_handle_accessor + absl::raw_hash_set + absl::hashtablez_sampler + absl::log_initialize + absl::status + absl::statusor) +endif() + +# gRPC targets +if(TARGET gRPC::grpc++) + project_build_tools_patch_default_imported_config( + gRPC::cares + gRPC::re2 + gRPC::ssl + gRPC::crypto + gRPC::zlibstatic + gRPC::address_sorting + gRPC::gpr + gRPC::grpc + gRPC::grpc_unsecure + gRPC::grpc++ + gRPC::grpc++_alts + gRPC::grpc++_error_details + gRPC::grpc++_reflection + gRPC::grpc++_unsecure + gRPC::grpc_authorization_provider + gRPC::grpc_plugin_support + gRPC::grpcpp_channelz + gRPC::upb) +endif() + +# prometheus targets +if(TARGET prometheus-cpp::core) + project_build_tools_patch_default_imported_config( + prometheus-cpp::core prometheus-cpp::pull prometheus-cpp::push) +endif() + +# civetweb targets +if(TARGET civetweb::civetweb) + project_build_tools_patch_default_imported_config( + civetweb::civetweb civetweb::server civetweb::civetweb-cpp) +endif() + +if(BUILD_TESTING) + project_build_tools_patch_default_imported_config( + GTest::gtest + GTest::gtest_main + GTest::gmock + GTest::gmock_main + GTest::GTest + GTest::Main + benchmark::benchmark + benchmark::benchmark_main) +endif() diff --git a/cmake/tools.cmake b/cmake/tools.cmake index 345fc88ff7..2ba0b22bd9 100644 --- a/cmake/tools.cmake +++ b/cmake/tools.cmake @@ -117,3 +117,73 @@ function(project_build_tools_get_imported_location OUTPUT_VAR_NAME TARGET_NAME) PARENT_SCOPE) endif() endfunction() + +function(project_build_tools_patch_default_imported_config) + set(PATCH_VARS + IMPORTED_IMPLIB + IMPORTED_LIBNAME + IMPORTED_LINK_DEPENDENT_LIBRARIES + IMPORTED_LINK_INTERFACE_LANGUAGES + IMPORTED_LINK_INTERFACE_LIBRARIES + IMPORTED_LINK_INTERFACE_MULTIPLICITY + IMPORTED_LOCATION + IMPORTED_NO_SONAME + IMPORTED_OBJECTS + IMPORTED_SONAME) + foreach(TARGET_NAME ${ARGN}) + if(TARGET ${TARGET_NAME}) + get_target_property(IS_IMPORTED_TARGET ${TARGET_NAME} IMPORTED) + if(NOT IS_IMPORTED_TARGET) + continue() + endif() + + if(CMAKE_VERSION VERSION_LESS "3.19.0") + get_target_property(TARGET_TYPE_NAME ${TARGET_NAME} TYPE) + if(TARGET_TYPE_NAME STREQUAL "INTERFACE_LIBRARY") + continue() + endif() + endif() + + get_target_property(DO_NOT_OVERWRITE ${TARGET_NAME} IMPORTED_LOCATION) + if(DO_NOT_OVERWRITE) + continue() + endif() + + # MSVC's STL and debug level must match the target, so we can only move + # out IMPORTED_LOCATION_NOCONFIG + if(MSVC) + set(PATCH_IMPORTED_CONFIGURATION "NOCONFIG") + else() + get_target_property(PATCH_IMPORTED_CONFIGURATION ${TARGET_NAME} + IMPORTED_CONFIGURATIONS) + endif() + + if(NOT PATCH_IMPORTED_CONFIGURATION) + continue() + endif() + + get_target_property(PATCH_TARGET_LOCATION ${TARGET_NAME} + "IMPORTED_LOCATION_${PATCH_IMPORTED_CONFIGURATION}") + if(NOT PATCH_TARGET_LOCATION) + continue() + endif() + + foreach(PATCH_IMPORTED_KEY IN LISTS PATCH_VARS) + get_target_property( + PATCH_IMPORTED_VALUE ${TARGET_NAME} + "${PATCH_IMPORTED_KEY}_${PATCH_IMPORTED_CONFIGURATION}") + if(PATCH_IMPORTED_VALUE) + set_target_properties( + ${TARGET_NAME} PROPERTIES "${PATCH_IMPORTED_KEY}" + "${PATCH_IMPORTED_VALUE}") + if(CMAKE_BUILD_TYPE STREQUAL "Debug") + message( + STATUS + "Patch: ${TARGET_NAME} ${PATCH_IMPORTED_KEY} will use ${PATCH_IMPORTED_KEY}_${PATCH_IMPORTED_CONFIGURATION}(\"${PATCH_IMPORTED_VALUE}\") by default." + ) + endif() + endif() + endforeach() + endif() + endforeach() +endfunction() From 550c58237a8a8caab30d9f836af0afff12d8e6ec Mon Sep 17 00:00:00 2001 From: owent Date: Tue, 19 Sep 2023 23:32:56 +0800 Subject: [PATCH 2/4] Add comments for `project_build_tools_patch_default_imported_config`. --- cmake/tools.cmake | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/cmake/tools.cmake b/cmake/tools.cmake index 2ba0b22bd9..98c6905bc7 100644 --- a/cmake/tools.cmake +++ b/cmake/tools.cmake @@ -118,6 +118,16 @@ function(project_build_tools_get_imported_location OUTPUT_VAR_NAME TARGET_NAME) endif() endfunction() +#[[ +If we build third party packages with a different CONFIG setting from building +otel-cpp, cmake may not find a suitable file in imported targets (#705, #1359) +when linking. But on some platforms, different CONFIG settings can be used when +ABI these CONFIG settings have the same ABI. For example, on Linux, we can build +gRPC and protobuf with -DCMAKE_BUILD_TYPE=Release, but build otel-cpp with +-DCMAKE_BUILD_TYPE=Debug and links these libraries together. +The properties of imported targets can be find here: +https://cmake.org/cmake/help/latest/manual/cmake-properties.7.html#properties-on-targets +]] function(project_build_tools_patch_default_imported_config) set(PATCH_VARS IMPORTED_IMPLIB From 7103d0515c67b566a9618de78bd1d8991053a6ce Mon Sep 17 00:00:00 2001 From: owent Date: Wed, 27 Sep 2023 14:48:42 +0800 Subject: [PATCH 3/4] Fix spell error --- cmake/tools.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/tools.cmake b/cmake/tools.cmake index 98c6905bc7..35f0f6b989 100644 --- a/cmake/tools.cmake +++ b/cmake/tools.cmake @@ -122,10 +122,10 @@ endfunction() If we build third party packages with a different CONFIG setting from building otel-cpp, cmake may not find a suitable file in imported targets (#705, #1359) when linking. But on some platforms, different CONFIG settings can be used when -ABI these CONFIG settings have the same ABI. For example, on Linux, we can build +these CONFIG settings have the same ABI. For example, on Linux, we can build gRPC and protobuf with -DCMAKE_BUILD_TYPE=Release, but build otel-cpp with -DCMAKE_BUILD_TYPE=Debug and links these libraries together. -The properties of imported targets can be find here: +The properties of imported targets can be found here: https://cmake.org/cmake/help/latest/manual/cmake-properties.7.html#properties-on-targets ]] function(project_build_tools_patch_default_imported_config) From c88c04b3f0b400d5f017354970ccf55d49f13633 Mon Sep 17 00:00:00 2001 From: owent Date: Mon, 16 Oct 2023 14:11:07 +0800 Subject: [PATCH 4/4] Fix spell error --- cmake/tools.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/tools.cmake b/cmake/tools.cmake index 35f0f6b989..ee191121ca 100644 --- a/cmake/tools.cmake +++ b/cmake/tools.cmake @@ -124,7 +124,7 @@ otel-cpp, cmake may not find a suitable file in imported targets (#705, #1359) when linking. But on some platforms, different CONFIG settings can be used when these CONFIG settings have the same ABI. For example, on Linux, we can build gRPC and protobuf with -DCMAKE_BUILD_TYPE=Release, but build otel-cpp with --DCMAKE_BUILD_TYPE=Debug and links these libraries together. +-DCMAKE_BUILD_TYPE=Debug and link these libraries together. The properties of imported targets can be found here: https://cmake.org/cmake/help/latest/manual/cmake-properties.7.html#properties-on-targets ]]