From af4c697ef98574d51efaf5b4f77ff73f03871189 Mon Sep 17 00:00:00 2001 From: owent Date: Thu, 22 May 2025 11:19:57 +0800 Subject: [PATCH 01/11] Fixes grpc linking for OTLP exporter's tests Force build opentelemetry_proto and OTLP exporters as static libraries when protobuf or grpc are built static. --- cmake/opentelemetry-proto.cmake | 50 ++++++++++++++--- cmake/tools.cmake | 98 ++++++++++++++++++++++++++++++++- exporters/otlp/CMakeLists.txt | 78 +++++++++++++++++++------- 3 files changed, 199 insertions(+), 27 deletions(-) diff --git a/cmake/opentelemetry-proto.cmake b/cmake/opentelemetry-proto.cmake index 8a04fedee4..93aa30c30c 100644 --- a/cmake/opentelemetry-proto.cmake +++ b/cmake/opentelemetry-proto.cmake @@ -221,6 +221,39 @@ elseif(PROTOBUF_VERSION AND PROTOBUF_VERSION VERSION_LESS "3.16") list(APPEND PROTOBUF_COMMON_FLAGS "--experimental_allow_proto3_optional") endif() +# protobuf uses numerous global variables, which can lead to conflicts when a +# user's dynamic libraries, executables, and otel-cpp are all built with +# -fvisibility=hidden and linked against a statically built protobuf library. +# This may result in crashes. To prevent such conflicts, we also need to build +# opentelemetry_exporter_otlp_grpc_client as a static library. +if(TARGET protobuf::libprotobuf) + get_target_property(protobuf_lib_type protobuf::libprotobuf TYPE) + # protobuf_lib_type may be "INTERFACE_LIBRARY" in some build systems, such as + # conan. + if(protobuf_lib_type STREQUAL "INTERFACE_LIBRARY") + project_build_tools_recursive_scan_imported_locations( + protobuf_lib_files TARGET_NAME protobuf::libprotobuf TARGET_MATCH + ".*(protobuf).*") + foreach(protobuf_lib_file ${protobuf_lib_files}) + if(protobuf_lib_file MATCHES + "(^|[\\\\\\/])[^\\\\\\/]*protobuf[^\\\\\\/]*.a$") + set(protobuf_lib_type "STATIC_LIBRARY") + break() + endif() + endforeach() + endif() +else() + set(protobuf_lib_type "SHARED_LIBRARY") + target_link_libraries(opentelemetry_proto PUBLIC ${Protobuf_LIBRARIES}) + foreach(protobuf_lib_file ${Protobuf_LIBRARIES}) + if(protobuf_lib_file MATCHES + "(^|[\\\\\\/])[^\\\\\\/]*protobuf[^\\\\\\/]*.a$") + set(protobuf_lib_type "STATIC_LIBRARY") + break() + endif() + endforeach() +endif() + set(PROTOBUF_GENERATED_FILES ${COMMON_PB_H_FILE} ${COMMON_PB_CPP_FILE} @@ -293,7 +326,8 @@ add_custom_command( unset(OTELCPP_PROTO_TARGET_OPTIONS) if(CMAKE_SYSTEM_NAME MATCHES "Windows|MinGW|WindowsStore") list(APPEND OTELCPP_PROTO_TARGET_OPTIONS STATIC) -elseif(NOT DEFINED BUILD_SHARED_LIBS OR BUILD_SHARED_LIBS) +elseif((NOT protobuf_lib_type STREQUAL "STATIC_LIBRARY") + AND (NOT DEFINED BUILD_SHARED_LIBS OR BUILD_SHARED_LIBS)) list(APPEND OTELCPP_PROTO_TARGET_OPTIONS SHARED) else() list(APPEND OTELCPP_PROTO_TARGET_OPTIONS STATIC) @@ -302,6 +336,7 @@ endif() set(OPENTELEMETRY_PROTO_TARGETS opentelemetry_proto) add_library( opentelemetry_proto + ${OPENTELEMETRY_OTLP_PROTO_LIB_TYPE} ${OTELCPP_PROTO_TARGET_OPTIONS} ${COMMON_PB_CPP_FILE} ${RESOURCE_PB_CPP_FILE} @@ -314,9 +349,8 @@ add_library( set_target_version(opentelemetry_proto) target_include_directories( - opentelemetry_proto - PUBLIC "$" - "$") + opentelemetry_proto PUBLIC "$" + "$") # Disable include-what-you-use and clang-tidy on generated code. set_target_properties(opentelemetry_proto PROPERTIES CXX_INCLUDE_WHAT_YOU_USE @@ -334,8 +368,9 @@ endif() if(WITH_OTLP_GRPC) add_library( opentelemetry_proto_grpc - ${OTELCPP_PROTO_TARGET_OPTIONS} ${TRACE_SERVICE_GRPC_PB_CPP_FILE} - ${LOGS_SERVICE_GRPC_PB_CPP_FILE} ${METRICS_SERVICE_GRPC_PB_CPP_FILE}) + ${OPENTELEMETRY_OTLP_PROTO_LIB_TYPE} ${OTELCPP_PROTO_TARGET_OPTIONS} + ${TRACE_SERVICE_GRPC_PB_CPP_FILE} ${LOGS_SERVICE_GRPC_PB_CPP_FILE} + ${METRICS_SERVICE_GRPC_PB_CPP_FILE}) set_target_version(opentelemetry_proto_grpc) # Disable include-what-you-use and clang-tidy on generated code. @@ -382,7 +417,8 @@ else() # cmake 3.8 or lower target_link_libraries(opentelemetry_proto PUBLIC ${Protobuf_LIBRARIES}) endif() -# this is needed on some older grcp versions specifically conan recipe for grpc/1.54.3 +# this is needed on some older grcp versions specifically conan recipe for +# grpc/1.54.3 if(WITH_OTLP_GRPC) if(TARGET absl::synchronization) target_link_libraries(opentelemetry_proto_grpc diff --git a/cmake/tools.cmake b/cmake/tools.cmake index ffc3732d2b..2450e2bbaf 100644 --- a/cmake/tools.cmake +++ b/cmake/tools.cmake @@ -99,7 +99,9 @@ function(project_build_tools_get_imported_location OUTPUT_VAR_NAME TARGET_NAME) get_target_property(TARGET_TYPE ${TARGET_NAME} TYPE) if(TARGET_TYPE STREQUAL "INTERFACE_LIBRARY") # For interface libraries, do not attempt to retrieve imported location. - set(${OUTPUT_VAR_NAME} "" PARENT_SCOPE) + set(${OUTPUT_VAR_NAME} + "" + PARENT_SCOPE) return() endif() @@ -220,3 +222,97 @@ function(project_build_tools_patch_default_imported_config) endif() endforeach() endfunction() + +function(__project_build_tools_recursive_scan_unwrap OUTPUT_VAR INPUT_VAR) + # With sub-expressions + if(INPUT_VAR MATCHES "^\\\$<.*>:([^>]+)>?$") + set(${OUTPUT_VAR} + "${CMAKE_MATCH_1}" + PARENT_SCOPE) + elseif(INPUT_VAR MATCHES "^\\\$<[^:]+:([^>]+)>?$") + set(${OUTPUT_VAR} + "${CMAKE_MATCH_1}" + PARENT_SCOPE) + else() + set(${OUTPUT_VAR} + "${INPUT_VAR}" + PARENT_SCOPE) + endif() +endfunction() + +macro(__project_build_tools_recursive_scan_imported_locations) + if(NOT DEFINED __project_build_tools_recursive_call_level) + set(__project_build_tools_recursive_call_level 1) + else() + math(EXPR __project_build_tools_recursive_call_level + "${__project_build_tools_recursive_call_level} + 1") + endif() + foreach(TARGET_NAME_ORIGIN_${__project_build_tools_recursive_call_level} + ${ARGN}) + if(TARGET_NAME_ORIGIN_${__project_build_tools_recursive_call_level} MATCHES + "^\\\$<.*>?$") + __project_build_tools_recursive_scan_unwrap( + TARGET_NAME + "${TARGET_NAME_ORIGIN_${__project_build_tools_recursive_call_level}}") + else() + set(TARGET_NAME + "${TARGET_NAME_ORIGIN_${__project_build_tools_recursive_call_level}}") + endif() + if(NOT DEFINED + __project_build_tools_recursive_scan_imported_locations_${TARGET_NAME}) + set(__project_build_tools_recursive_scan_imported_locations_${TARGET_NAME} + TRUE) + set(__lib_path) + project_build_tools_get_imported_location(__lib_path ${TARGET_NAME}) + if(__lib_path) + list(APPEND __OUTPUT_VAR ${__lib_path}) + endif() + + set(__TARGET_LINK_LIBRARIES) + get_target_property(__TARGET_LINK_LIBRARIES ${TARGET_NAME} + INTERFACE_LINK_LIBRARIES) + if(__SCAN_OPTION_TARGET_MATCH) + set(__TARGET_LINK_LIBRARIES_SELECTED) + foreach(__TARGET_LINK_LIBRARIES_ITEM IN LISTS __TARGET_LINK_LIBRARIES) + set(__TARGET_MATCHED FALSE) + foreach(__MATCH_RULE ${__SCAN_OPTION_TARGET_MATCH}) + if(__TARGET_LINK_LIBRARIES_ITEM MATCHES "${__MATCH_RULE}") + set(__TARGET_MATCHED TRUE) + break() + endif() + endforeach() + if(__TARGET_MATCHED) + list(APPEND __TARGET_LINK_LIBRARIES_SELECTED + ${__TARGET_LINK_LIBRARIES_ITEM}) + endif() + endforeach(__TARGET_LINK_LIBRARIES_ITEM IN LISTS + __TARGET_LINK_LIBRARIES) + else() + set(__TARGET_LINK_LIBRARIES_SELECTED ${__TARGET_LINK_LIBRARIES}) + endif() + + if(__TARGET_LINK_LIBRARIES_SELECTED) + __project_build_tools_recursive_scan_imported_locations( + ${__TARGET_LINK_LIBRARIES_SELECTED}) + endif() + endif() + endforeach() + math(EXPR __project_build_tools_recursive_call_level + "${__project_build_tools_recursive_call_level} - 1") +endmacro() + +function(project_build_tools_recursive_scan_imported_locations OUTPUT_VAR) + set(optionArgs) + set(oneValueArgs) + set(multiValueArgs TARGET_NAME TARGET_MATCH) + cmake_parse_arguments(__SCAN_OPTION "${optionArgs}" "${oneValueArgs}" + "${multiValueArgs}" "${ARGN}") + set(__OUTPUT_VAR) + + __project_build_tools_recursive_scan_imported_locations( + ${__SCAN_OPTION_TARGET_NAME}) + + set(${OUTPUT_VAR} + ${__OUTPUT_VAR} + PARENT_SCOPE) +endfunction() diff --git a/exporters/otlp/CMakeLists.txt b/exporters/otlp/CMakeLists.txt index 3ec20517e0..a73b487127 100644 --- a/exporters/otlp/CMakeLists.txt +++ b/exporters/otlp/CMakeLists.txt @@ -1,10 +1,20 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 +if(protobuf_lib_type STREQUAL "STATIC_LIBRARY") + set(OPENTELEMETRY_OTLP_TARGETS_LIB_TYPE STATIC) +else() + set(OPENTELEMETRY_OTLP_TARGETS_LIB_TYPE) +endif() + add_library( opentelemetry_otlp_recordable - src/otlp_environment.cc src/otlp_log_recordable.cc src/otlp_recordable.cc - src/otlp_populate_attribute_utils.cc src/otlp_recordable_utils.cc + ${OPENTELEMETRY_OTLP_TARGETS_LIB_TYPE} + src/otlp_environment.cc + src/otlp_log_recordable.cc + src/otlp_recordable.cc + src/otlp_populate_attribute_utils.cc + src/otlp_recordable_utils.cc src/otlp_metric_utils.cc) set_target_properties(opentelemetry_otlp_recordable PROPERTIES EXPORT_NAME otlp_recordable) @@ -23,10 +33,34 @@ target_link_libraries(opentelemetry_otlp_recordable if(WITH_OTLP_GRPC) find_package(gRPC REQUIRED) + # gRPC uses numerous global variables, which can lead to conflicts when a + # user's dynamic libraries, executables, and otel-cpp are all built with + # -fvisibility=hidden and linked against a statically built gRPC library. This + # may result in crashes. To prevent such conflicts, we also need to build + # opentelemetry_exporter_otlp_grpc_client as a static library. + get_target_property(grpc_lib_type gRPC::grpc++ TYPE) + # grpc_lib_type may be "INTERFACE_LIBRARY" in some build systems, such as + # conan. + if(grpc_lib_type STREQUAL "INTERFACE_LIBRARY") + project_build_tools_recursive_scan_imported_locations( + grpc_lib_files TARGET_NAME gRPC::grpc++ TARGET_MATCH ".*(grpc|gRPC).*") + foreach(grpc_lib_file ${grpc_lib_files}) + if(grpc_lib_file MATCHES "(^|[\\\\\\/])[^\\\\\\/]*grpc[^\\\\\\/]*.a$") + set(grpc_lib_type "STATIC_LIBRARY") + break() + endif() + endforeach() + endif() + if(grpc_lib_type STREQUAL "STATIC_LIBRARY" OR protobuf_lib_type STREQUAL + "STATIC_LIBRARY") + set(OPENTELEMETRY_OTLP_GRPC_CLIENT_LIB_TYPE STATIC) + else() + set(OPENTELEMETRY_OTLP_GRPC_CLIENT_LIB_TYPE) + endif() add_library( opentelemetry_exporter_otlp_grpc_client - src/otlp_grpc_client.cc src/otlp_grpc_client_factory.cc - src/otlp_grpc_utils.cc) + ${OPENTELEMETRY_OTLP_GRPC_CLIENT_LIB_TYPE} src/otlp_grpc_client.cc + src/otlp_grpc_client_factory.cc src/otlp_grpc_utils.cc) set_target_properties(opentelemetry_exporter_otlp_grpc_client PROPERTIES EXPORT_NAME otlp_grpc_client) set_target_version(opentelemetry_exporter_otlp_grpc_client) @@ -60,8 +94,8 @@ if(WITH_OTLP_GRPC) add_library( opentelemetry_exporter_otlp_grpc - src/otlp_grpc_exporter.cc src/otlp_grpc_exporter_factory.cc - src/otlp_grpc_exporter_options.cc) + ${OPENTELEMETRY_OTLP_TARGETS_LIB_TYPE} src/otlp_grpc_exporter.cc + src/otlp_grpc_exporter_factory.cc src/otlp_grpc_exporter_options.cc) set_target_properties(opentelemetry_exporter_otlp_grpc PROPERTIES EXPORT_NAME otlp_grpc_exporter) @@ -76,7 +110,7 @@ if(WITH_OTLP_GRPC) add_library( opentelemetry_exporter_otlp_grpc_log - src/otlp_grpc_log_record_exporter.cc + ${OPENTELEMETRY_OTLP_TARGETS_LIB_TYPE} src/otlp_grpc_log_record_exporter.cc src/otlp_grpc_log_record_exporter_factory.cc src/otlp_grpc_log_record_exporter_options.cc) @@ -94,7 +128,8 @@ if(WITH_OTLP_GRPC) add_library( opentelemetry_exporter_otlp_grpc_metrics - src/otlp_grpc_metric_exporter.cc src/otlp_grpc_metric_exporter_factory.cc + ${OPENTELEMETRY_OTLP_TARGETS_LIB_TYPE} src/otlp_grpc_metric_exporter.cc + src/otlp_grpc_metric_exporter_factory.cc src/otlp_grpc_metric_exporter_options.cc) set_target_properties(opentelemetry_exporter_otlp_grpc_metrics @@ -111,8 +146,10 @@ if(WITH_OTLP_GRPC) endif() if(WITH_OTLP_HTTP) - add_library(opentelemetry_exporter_otlp_http_client src/otlp_http.cc - src/otlp_http_client.cc) + add_library( + opentelemetry_exporter_otlp_http_client + ${OPENTELEMETRY_OTLP_TARGETS_LIB_TYPE} src/otlp_http.cc + src/otlp_http_client.cc) set_target_properties(opentelemetry_exporter_otlp_http_client PROPERTIES EXPORT_NAME otlp_http_client) set_target_version(opentelemetry_exporter_otlp_http_client) @@ -141,8 +178,8 @@ if(WITH_OTLP_HTTP) add_library( opentelemetry_exporter_otlp_http - src/otlp_http_exporter.cc src/otlp_http_exporter_factory.cc - src/otlp_http_exporter_options.cc) + ${OPENTELEMETRY_OTLP_TARGETS_LIB_TYPE} src/otlp_http_exporter.cc + src/otlp_http_exporter_factory.cc src/otlp_http_exporter_options.cc) set_target_properties(opentelemetry_exporter_otlp_http PROPERTIES EXPORT_NAME otlp_http_exporter) @@ -157,7 +194,7 @@ if(WITH_OTLP_HTTP) add_library( opentelemetry_exporter_otlp_http_log - src/otlp_http_log_record_exporter.cc + ${OPENTELEMETRY_OTLP_TARGETS_LIB_TYPE} src/otlp_http_log_record_exporter.cc src/otlp_http_log_record_exporter_factory.cc src/otlp_http_log_record_exporter_options.cc) @@ -175,7 +212,8 @@ if(WITH_OTLP_HTTP) add_library( opentelemetry_exporter_otlp_http_metric - src/otlp_http_metric_exporter.cc src/otlp_http_metric_exporter_factory.cc + ${OPENTELEMETRY_OTLP_TARGETS_LIB_TYPE} src/otlp_http_metric_exporter.cc + src/otlp_http_metric_exporter_factory.cc src/otlp_http_metric_exporter_options.cc) set_target_properties(opentelemetry_exporter_otlp_http_metric @@ -192,7 +230,8 @@ if(WITH_OTLP_HTTP) endif() if(WITH_OTLP_FILE) - add_library(opentelemetry_exporter_otlp_file_client src/otlp_file_client.cc) + add_library(opentelemetry_exporter_otlp_file_client + ${OPENTELEMETRY_OTLP_TARGETS_LIB_TYPE} src/otlp_file_client.cc) set_target_properties(opentelemetry_exporter_otlp_file_client PROPERTIES EXPORT_NAME otlp_file_client) set_target_version(opentelemetry_exporter_otlp_file_client) @@ -216,8 +255,8 @@ if(WITH_OTLP_FILE) add_library( opentelemetry_exporter_otlp_file - src/otlp_file_exporter.cc src/otlp_file_exporter_factory.cc - src/otlp_file_exporter_options.cc) + ${OPENTELEMETRY_OTLP_TARGETS_LIB_TYPE} src/otlp_file_exporter.cc + src/otlp_file_exporter_factory.cc src/otlp_file_exporter_options.cc) set_target_properties(opentelemetry_exporter_otlp_file PROPERTIES EXPORT_NAME otlp_file_exporter) @@ -232,7 +271,7 @@ if(WITH_OTLP_FILE) add_library( opentelemetry_exporter_otlp_file_log - src/otlp_file_log_record_exporter.cc + ${OPENTELEMETRY_OTLP_TARGETS_LIB_TYPE} src/otlp_file_log_record_exporter.cc src/otlp_file_log_record_exporter_factory.cc src/otlp_file_log_record_exporter_options.cc) @@ -250,7 +289,8 @@ if(WITH_OTLP_FILE) add_library( opentelemetry_exporter_otlp_file_metric - src/otlp_file_metric_exporter.cc src/otlp_file_metric_exporter_factory.cc + ${OPENTELEMETRY_OTLP_TARGETS_LIB_TYPE} src/otlp_file_metric_exporter.cc + src/otlp_file_metric_exporter_factory.cc src/otlp_file_metric_exporter_options.cc) set_target_properties(opentelemetry_exporter_otlp_file_metric From 317356ef6093e9506e6bcfcb4f561a1d792de671 Mon Sep 17 00:00:00 2001 From: owent Date: Thu, 22 May 2025 20:24:07 +0800 Subject: [PATCH 02/11] Fixes comments --- cmake/opentelemetry-proto.cmake | 6 +++--- exporters/otlp/CMakeLists.txt | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cmake/opentelemetry-proto.cmake b/cmake/opentelemetry-proto.cmake index 93aa30c30c..5b68045e8b 100644 --- a/cmake/opentelemetry-proto.cmake +++ b/cmake/opentelemetry-proto.cmake @@ -222,9 +222,9 @@ elseif(PROTOBUF_VERSION AND PROTOBUF_VERSION VERSION_LESS "3.16") endif() # protobuf uses numerous global variables, which can lead to conflicts when a -# user's dynamic libraries, executables, and otel-cpp are all built with -# -fvisibility=hidden and linked against a statically built protobuf library. -# This may result in crashes. To prevent such conflicts, we also need to build +# user's dynamic libraries, executables, and otel-cpp are all built as dynamic +# libraries and linked against a statically built protobuf library. This may +# result in crashes. To prevent such conflicts, we also need to build # opentelemetry_exporter_otlp_grpc_client as a static library. if(TARGET protobuf::libprotobuf) get_target_property(protobuf_lib_type protobuf::libprotobuf TYPE) diff --git a/exporters/otlp/CMakeLists.txt b/exporters/otlp/CMakeLists.txt index a73b487127..14e18616fa 100644 --- a/exporters/otlp/CMakeLists.txt +++ b/exporters/otlp/CMakeLists.txt @@ -34,9 +34,9 @@ target_link_libraries(opentelemetry_otlp_recordable if(WITH_OTLP_GRPC) find_package(gRPC REQUIRED) # gRPC uses numerous global variables, which can lead to conflicts when a - # user's dynamic libraries, executables, and otel-cpp are all built with - # -fvisibility=hidden and linked against a statically built gRPC library. This - # may result in crashes. To prevent such conflicts, we also need to build + # user's dynamic libraries, executables, and otel-cpp are all built as dynamic + # libraries and linked against a statically built gRPC library. This may + # result in crashes. To prevent such conflicts, we also need to build # opentelemetry_exporter_otlp_grpc_client as a static library. get_target_property(grpc_lib_type gRPC::grpc++ TYPE) # grpc_lib_type may be "INTERFACE_LIBRARY" in some build systems, such as From 51c6d2a2f1f687e6dcecccace7ccabcbd0c948bc Mon Sep 17 00:00:00 2001 From: owent Date: Thu, 22 May 2025 22:25:07 +0800 Subject: [PATCH 03/11] Adaptor bad names in conan --- cmake/tools.cmake | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/cmake/tools.cmake b/cmake/tools.cmake index 2450e2bbaf..7c510a1036 100644 --- a/cmake/tools.cmake +++ b/cmake/tools.cmake @@ -225,11 +225,19 @@ endfunction() function(__project_build_tools_recursive_scan_unwrap OUTPUT_VAR INPUT_VAR) # With sub-expressions - if(INPUT_VAR MATCHES "^\\\$<.*>:([^>]+)>?$") + if(INPUT_VAR MATCHES "^\\\$<.*>:([^>]+)>$") set(${OUTPUT_VAR} "${CMAKE_MATCH_1}" PARENT_SCOPE) - elseif(INPUT_VAR MATCHES "^\\\$<[^:]+:([^>]+)>?$") + elseif(INPUT_VAR MATCHES "^\\\$<.*>:([^>]+)$") + set(${OUTPUT_VAR} + "${CMAKE_MATCH_1}" + PARENT_SCOPE) + elseif(INPUT_VAR MATCHES "^\\\$<[^:]+:([^>]+)>$") + set(${OUTPUT_VAR} + "${CMAKE_MATCH_1}" + PARENT_SCOPE) + elseif(INPUT_VAR MATCHES "^\\\$<[^:]+:([^>]+)$") set(${OUTPUT_VAR} "${CMAKE_MATCH_1}" PARENT_SCOPE) @@ -259,7 +267,8 @@ macro(__project_build_tools_recursive_scan_imported_locations) "${TARGET_NAME_ORIGIN_${__project_build_tools_recursive_call_level}}") endif() if(NOT DEFINED - __project_build_tools_recursive_scan_imported_locations_${TARGET_NAME}) + __project_build_tools_recursive_scan_imported_locations_${TARGET_NAME} + AND TARGET ${TARGET_NAME}) set(__project_build_tools_recursive_scan_imported_locations_${TARGET_NAME} TRUE) set(__lib_path) From 73f372b2ebdc2ea2aab268a4eabe61bac941358e Mon Sep 17 00:00:00 2001 From: owent Date: Sat, 31 May 2025 01:28:43 +0800 Subject: [PATCH 04/11] Fixes some hints --- cmake/opentelemetry-proto.cmake | 23 +++++++++++++++++++++-- exporters/otlp/CMakeLists.txt | 25 ++++++------------------- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/cmake/opentelemetry-proto.cmake b/cmake/opentelemetry-proto.cmake index 5b68045e8b..84963153de 100644 --- a/cmake/opentelemetry-proto.cmake +++ b/cmake/opentelemetry-proto.cmake @@ -236,7 +236,7 @@ if(TARGET protobuf::libprotobuf) ".*(protobuf).*") foreach(protobuf_lib_file ${protobuf_lib_files}) if(protobuf_lib_file MATCHES - "(^|[\\\\\\/])[^\\\\\\/]*protobuf[^\\\\\\/]*.a$") + "(^|[\\\\\\/])[^\\\\\\/]*protobuf[^\\\\\\/]*\\.(a|lib)$") set(protobuf_lib_type "STATIC_LIBRARY") break() endif() @@ -247,7 +247,7 @@ else() target_link_libraries(opentelemetry_proto PUBLIC ${Protobuf_LIBRARIES}) foreach(protobuf_lib_file ${Protobuf_LIBRARIES}) if(protobuf_lib_file MATCHES - "(^|[\\\\\\/])[^\\\\\\/]*protobuf[^\\\\\\/]*.a$") + "(^|[\\\\\\/])[^\\\\\\/]*protobuf[^\\\\\\/]*\\.(a|lib)$") set(protobuf_lib_type "STATIC_LIBRARY") break() endif() @@ -380,7 +380,26 @@ if(WITH_OTLP_GRPC) list(APPEND OPENTELEMETRY_PROTO_TARGETS opentelemetry_proto_grpc) target_link_libraries(opentelemetry_proto_grpc PUBLIC opentelemetry_proto) + # gRPC uses numerous global variables, which can lead to conflicts when a + # user's dynamic libraries, executables, and otel-cpp are all built as dynamic + # libraries and linked against a statically built gRPC library. This may + # result in crashes. To prevent such conflicts, we also need to build + # opentelemetry_exporter_otlp_grpc_client as a static library. get_target_property(grpc_lib_type gRPC::grpc++ TYPE) + # grpc_lib_type may be "INTERFACE_LIBRARY" in some build systems, such as + # conan. + if(grpc_lib_type STREQUAL "INTERFACE_LIBRARY") + project_build_tools_recursive_scan_imported_locations( + grpc_lib_files TARGET_NAME gRPC::grpc++ TARGET_MATCH ".*(grpc|gRPC).*") + foreach(grpc_lib_file ${grpc_lib_files}) + if(grpc_lib_file MATCHES + "(^|[\\\\\\/])[^\\\\\\/]*grpc[^\\\\\\/]*\\.(a|lib)$") + set(grpc_lib_type "STATIC_LIBRARY") + break() + endif() + endforeach() + endif() + if(grpc_lib_type STREQUAL "SHARED_LIBRARY") target_link_libraries(opentelemetry_proto_grpc PUBLIC gRPC::grpc++) endif() diff --git a/exporters/otlp/CMakeLists.txt b/exporters/otlp/CMakeLists.txt index 14e18616fa..5d7f74dd2f 100644 --- a/exporters/otlp/CMakeLists.txt +++ b/exporters/otlp/CMakeLists.txt @@ -33,23 +33,9 @@ target_link_libraries(opentelemetry_otlp_recordable if(WITH_OTLP_GRPC) find_package(gRPC REQUIRED) - # gRPC uses numerous global variables, which can lead to conflicts when a - # user's dynamic libraries, executables, and otel-cpp are all built as dynamic - # libraries and linked against a statically built gRPC library. This may - # result in crashes. To prevent such conflicts, we also need to build - # opentelemetry_exporter_otlp_grpc_client as a static library. - get_target_property(grpc_lib_type gRPC::grpc++ TYPE) - # grpc_lib_type may be "INTERFACE_LIBRARY" in some build systems, such as - # conan. - if(grpc_lib_type STREQUAL "INTERFACE_LIBRARY") - project_build_tools_recursive_scan_imported_locations( - grpc_lib_files TARGET_NAME gRPC::grpc++ TARGET_MATCH ".*(grpc|gRPC).*") - foreach(grpc_lib_file ${grpc_lib_files}) - if(grpc_lib_file MATCHES "(^|[\\\\\\/])[^\\\\\\/]*grpc[^\\\\\\/]*.a$") - set(grpc_lib_type "STATIC_LIBRARY") - break() - endif() - endforeach() + if(NOT DEFINED grpc_lib_type) + message( + FATAL_ERROR "cmake/opentelemetry-proto.cmake should be included first") endif() if(grpc_lib_type STREQUAL "STATIC_LIBRARY" OR protobuf_lib_type STREQUAL "STATIC_LIBRARY") @@ -74,8 +60,9 @@ if(WITH_OTLP_GRPC) opentelemetry_exporter_otlp_grpc_client PUBLIC opentelemetry_sdk opentelemetry_common # gRPC::grpc++ must be linked before opentelemetry_proto_grpc. - opentelemetry_proto_grpc - PRIVATE gRPC::grpc++ opentelemetry_ext) + "$" + PRIVATE "$" gRPC::grpc++ + opentelemetry_ext) get_target_property(GRPC_INCLUDE_DIRECTORY gRPC::grpc++ INTERFACE_INCLUDE_DIRECTORIES) From bbcb76870003f8786286d9b9347f669aeebe371a Mon Sep 17 00:00:00 2001 From: Douglas Barker Date: Mon, 19 May 2025 21:21:24 -0600 Subject: [PATCH 05/11] Test building opentelemetry-cpp as shared libraries against grpc and protobuf as shared libraries --- .github/workflows/cmake_install.yml | 40 ++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/.github/workflows/cmake_install.yml b/.github/workflows/cmake_install.yml index d93d0a5bbb..f1e1ddf566 100644 --- a/.github/workflows/cmake_install.yml +++ b/.github/workflows/cmake_install.yml @@ -252,7 +252,7 @@ jobs: run: ./ci/do_ci.sh cmake.opentracing_shim.install.test ubuntu_2404_conan_latest: - name: Ubuntu 24.04 conan latest versions cxx17 (static libs) + name: Ubuntu 24.04 conan latest versions cxx17 (static libs - shared libs) runs-on: ubuntu-24.04 env: INSTALL_TEST_DIR: '/home/runner/install_test' @@ -285,6 +285,44 @@ jobs: run: | export PKG_CONFIG_PATH=$INSTALL_TEST_DIR/lib/pkgconfig:$PKG_CONFIG_PATH ./ci/verify_packages.sh + - name: Run Tests (shared libs) + env: + BUILD_SHARED_LIBS: 'ON' + run: ./ci/do_ci.sh cmake.install.test + + ubuntu_2404_conan_latest_shared_deps: + name: Ubuntu 24.04 conan latest w/shared protobuf and grpc (shared libs) + runs-on: ubuntu-24.04 + env: + INSTALL_TEST_DIR: '/home/runner/install_test' + # Set to the latest version of cmake 3.x + CMAKE_VERSION: '3.31.6' + CXX_STANDARD: '17' + CMAKE_TOOLCHAIN_FILE: /home/runner/conan/build/Debug/generators/conan_toolchain.cmake + BUILD_TYPE: 'Debug' + 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: Install Conan + run: | + python3 -m pip install pip==25.0.1 + pip install "conan==2.15.1" + conan profile detect --force + - name: Install or build all dependencies with Conan + run: | + sudo -E ./ci/setup_cmake.sh + conan install install/conan/conanfile_latest.txt --build=missing -of /home/runner/conan -s build_type=${BUILD_TYPE} -s compiler.cppstd=${CXX_STANDARD} -o protobuf/*:shared=True -o grpc/*:shared=True + - name: Run Tests (shared libs) + env: + BUILD_SHARED_LIBS: 'ON' + run: | + source /home/runner/conan/build/Debug/generators/conanrun.sh + ./ci/do_ci.sh cmake.install.test macos_14_conan_stable: name: macOS 14 conan stable versions cxx17 (static libs) From 706ee9b3be4d4dfd1569c79ab9a5670618d81909 Mon Sep 17 00:00:00 2001 From: owent Date: Sat, 7 Jun 2025 21:41:33 +0800 Subject: [PATCH 06/11] Fixes shared_library checking in conan --- cmake/opentelemetry-proto.cmake | 8 ++++++++ exporters/otlp/CMakeLists.txt | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/cmake/opentelemetry-proto.cmake b/cmake/opentelemetry-proto.cmake index 84963153de..40808c1302 100644 --- a/cmake/opentelemetry-proto.cmake +++ b/cmake/opentelemetry-proto.cmake @@ -239,6 +239,10 @@ if(TARGET protobuf::libprotobuf) "(^|[\\\\\\/])[^\\\\\\/]*protobuf[^\\\\\\/]*\\.(a|lib)$") set(protobuf_lib_type "STATIC_LIBRARY") break() + elseif(protobuf_lib_file MATCHES + "(^|[\\\\\\/])[^\\\\\\/]*protobuf[^\\\\\\/]*\\.(so|dll|dylib)$") + set(protobuf_lib_type "SHARED_LIBRARY") + break() endif() endforeach() endif() @@ -396,6 +400,10 @@ if(WITH_OTLP_GRPC) "(^|[\\\\\\/])[^\\\\\\/]*grpc[^\\\\\\/]*\\.(a|lib)$") set(grpc_lib_type "STATIC_LIBRARY") break() + elseif(grpc_lib_file MATCHES + "(^|[\\\\\\/])[^\\\\\\/]*grpc[^\\\\\\/]*\\.(so|dll|dylib)$") + set(grpc_lib_type "SHARED_LIBRARY") + break() endif() endforeach() endif() diff --git a/exporters/otlp/CMakeLists.txt b/exporters/otlp/CMakeLists.txt index 5d7f74dd2f..f39ac972ee 100644 --- a/exporters/otlp/CMakeLists.txt +++ b/exporters/otlp/CMakeLists.txt @@ -398,7 +398,7 @@ if(BUILD_TESTING) add_executable(otlp_grpc_exporter_test test/otlp_grpc_exporter_test.cc) target_link_libraries( otlp_grpc_exporter_test ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} - ${GMOCK_LIB} opentelemetry_exporter_otlp_grpc gRPC::grpc++) + ${GMOCK_LIB} opentelemetry_exporter_otlp_grpc) gtest_add_tests( TARGET otlp_grpc_exporter_test TEST_PREFIX exporter.otlp. From e4d3698daa956b5df30d807256f1f964bb424e11 Mon Sep 17 00:00:00 2001 From: owent Date: Wed, 11 Jun 2025 14:25:34 +0800 Subject: [PATCH 07/11] Do not recursive scane link libraries and imported locations --- cmake/opentelemetry-proto.cmake | 4 +- cmake/tools.cmake | 102 +++++++++++++------------------- 2 files changed, 43 insertions(+), 63 deletions(-) diff --git a/cmake/opentelemetry-proto.cmake b/cmake/opentelemetry-proto.cmake index 40808c1302..f6a87ab14f 100644 --- a/cmake/opentelemetry-proto.cmake +++ b/cmake/opentelemetry-proto.cmake @@ -231,7 +231,7 @@ if(TARGET protobuf::libprotobuf) # protobuf_lib_type may be "INTERFACE_LIBRARY" in some build systems, such as # conan. if(protobuf_lib_type STREQUAL "INTERFACE_LIBRARY") - project_build_tools_recursive_scan_imported_locations( + project_build_tools_unwrap_interface_link_libraries( protobuf_lib_files TARGET_NAME protobuf::libprotobuf TARGET_MATCH ".*(protobuf).*") foreach(protobuf_lib_file ${protobuf_lib_files}) @@ -393,7 +393,7 @@ if(WITH_OTLP_GRPC) # grpc_lib_type may be "INTERFACE_LIBRARY" in some build systems, such as # conan. if(grpc_lib_type STREQUAL "INTERFACE_LIBRARY") - project_build_tools_recursive_scan_imported_locations( + project_build_tools_unwrap_interface_link_libraries( grpc_lib_files TARGET_NAME gRPC::grpc++ TARGET_MATCH ".*(grpc|gRPC).*") foreach(grpc_lib_file ${grpc_lib_files}) if(grpc_lib_file MATCHES diff --git a/cmake/tools.cmake b/cmake/tools.cmake index 7c510a1036..1bffb3dbe3 100644 --- a/cmake/tools.cmake +++ b/cmake/tools.cmake @@ -248,78 +248,58 @@ function(__project_build_tools_recursive_scan_unwrap OUTPUT_VAR INPUT_VAR) endif() endfunction() -macro(__project_build_tools_recursive_scan_imported_locations) - if(NOT DEFINED __project_build_tools_recursive_call_level) - set(__project_build_tools_recursive_call_level 1) - else() - math(EXPR __project_build_tools_recursive_call_level - "${__project_build_tools_recursive_call_level} + 1") - endif() - foreach(TARGET_NAME_ORIGIN_${__project_build_tools_recursive_call_level} - ${ARGN}) - if(TARGET_NAME_ORIGIN_${__project_build_tools_recursive_call_level} MATCHES - "^\\\$<.*>?$") - __project_build_tools_recursive_scan_unwrap( - TARGET_NAME - "${TARGET_NAME_ORIGIN_${__project_build_tools_recursive_call_level}}") +function(project_build_tools_unwrap_interface_link_libraries OUTPUT_VAR) + set(optionArgs) + set(oneValueArgs) + set(multiValueArgs TARGET_NAME TARGET_MATCH) + cmake_parse_arguments(__SCAN_OPTION "${optionArgs}" "${oneValueArgs}" + "${multiValueArgs}" "${ARGN}") + set(__OUTPUT_VAR) + + set(__TARGET_CHECK_NAMES) + foreach(TARGET_NAME_ORIGIN ${__SCAN_OPTION_TARGET_NAME}) + if(TARGET_NAME_ORIGIN MATCHES "^\\\$<.*>?$") + __project_build_tools_recursive_scan_unwrap(TARGET_NAME + "${TARGET_NAME_ORIGIN}") else() - set(TARGET_NAME - "${TARGET_NAME_ORIGIN_${__project_build_tools_recursive_call_level}}") + set(TARGET_NAME "${TARGET_NAME_ORIGIN}") endif() - if(NOT DEFINED - __project_build_tools_recursive_scan_imported_locations_${TARGET_NAME} - AND TARGET ${TARGET_NAME}) - set(__project_build_tools_recursive_scan_imported_locations_${TARGET_NAME} - TRUE) - set(__lib_path) - project_build_tools_get_imported_location(__lib_path ${TARGET_NAME}) - if(__lib_path) - list(APPEND __OUTPUT_VAR ${__lib_path}) + + if(TARGET ${TARGET_NAME}) + # Get the imported location of the target + project_build_tools_get_imported_location(__TARGET_IMPORTED_LOCATION + ${TARGET_NAME}) + if(__TARGET_IMPORTED_LOCATION) + list(APPEND __TARGET_CHECK_NAMES ${__TARGET_IMPORTED_LOCATION}) endif() + # Get the interface link libraries of the target set(__TARGET_LINK_LIBRARIES) get_target_property(__TARGET_LINK_LIBRARIES ${TARGET_NAME} INTERFACE_LINK_LIBRARIES) - if(__SCAN_OPTION_TARGET_MATCH) - set(__TARGET_LINK_LIBRARIES_SELECTED) - foreach(__TARGET_LINK_LIBRARIES_ITEM IN LISTS __TARGET_LINK_LIBRARIES) - set(__TARGET_MATCHED FALSE) - foreach(__MATCH_RULE ${__SCAN_OPTION_TARGET_MATCH}) - if(__TARGET_LINK_LIBRARIES_ITEM MATCHES "${__MATCH_RULE}") - set(__TARGET_MATCHED TRUE) - break() - endif() - endforeach() - if(__TARGET_MATCHED) - list(APPEND __TARGET_LINK_LIBRARIES_SELECTED - ${__TARGET_LINK_LIBRARIES_ITEM}) - endif() - endforeach(__TARGET_LINK_LIBRARIES_ITEM IN LISTS - __TARGET_LINK_LIBRARIES) - else() - set(__TARGET_LINK_LIBRARIES_SELECTED ${__TARGET_LINK_LIBRARIES}) - endif() + list(APPEND __TARGET_CHECK_NAMES ${__TARGET_LINK_LIBRARIES}) - if(__TARGET_LINK_LIBRARIES_SELECTED) - __project_build_tools_recursive_scan_imported_locations( - ${__TARGET_LINK_LIBRARIES_SELECTED}) - endif() endif() endforeach() - math(EXPR __project_build_tools_recursive_call_level - "${__project_build_tools_recursive_call_level} - 1") -endmacro() - -function(project_build_tools_recursive_scan_imported_locations OUTPUT_VAR) - set(optionArgs) - set(oneValueArgs) - set(multiValueArgs TARGET_NAME TARGET_MATCH) - cmake_parse_arguments(__SCAN_OPTION "${optionArgs}" "${oneValueArgs}" - "${multiValueArgs}" "${ARGN}") - set(__OUTPUT_VAR) - __project_build_tools_recursive_scan_imported_locations( - ${__SCAN_OPTION_TARGET_NAME}) + list(REMOVE_DUPLICATES __TARGET_CHECK_NAMES) + # If the target match option is set, filter the link names + if(__SCAN_OPTION_TARGET_MATCH) + foreach(__LINK_NAME IN LISTS __TARGET_CHECK_NAMES) + set(__TARGET_MATCHED FALSE) + foreach(__MATCH_RULE ${__SCAN_OPTION_TARGET_MATCH}) + if(__LINK_NAME MATCHES "${__MATCH_RULE}") + set(__TARGET_MATCHED TRUE) + break() + endif() + endforeach() + if(__TARGET_MATCHED) + list(APPEND __OUTPUT_VAR ${__LINK_NAME}) + endif() + endforeach() + else() + set(__OUTPUT_VAR ${__TARGET_CHECK_NAMES}) + endif() set(${OUTPUT_VAR} ${__OUTPUT_VAR} From 2ddba72966bca4da35e22fd713921106007a6373 Mon Sep 17 00:00:00 2001 From: owent Date: Wed, 11 Jun 2025 14:35:56 +0800 Subject: [PATCH 08/11] Scan depth=2 for project_build_tools_unwrap_interface_link_libraries --- cmake/tools.cmake | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/cmake/tools.cmake b/cmake/tools.cmake index 1bffb3dbe3..2e3e34e063 100644 --- a/cmake/tools.cmake +++ b/cmake/tools.cmake @@ -248,7 +248,7 @@ function(__project_build_tools_recursive_scan_unwrap OUTPUT_VAR INPUT_VAR) endif() endfunction() -function(project_build_tools_unwrap_interface_link_libraries OUTPUT_VAR) +function(__project_build_tools_unwrap_interface_link_libraries OUTPUT_VAR) set(optionArgs) set(oneValueArgs) set(multiValueArgs TARGET_NAME TARGET_MATCH) @@ -265,20 +265,23 @@ function(project_build_tools_unwrap_interface_link_libraries OUTPUT_VAR) set(TARGET_NAME "${TARGET_NAME_ORIGIN}") endif() - if(TARGET ${TARGET_NAME}) + if(TARGET "${TARGET_NAME}") # Get the imported location of the target project_build_tools_get_imported_location(__TARGET_IMPORTED_LOCATION - ${TARGET_NAME}) + "${TARGET_NAME}") if(__TARGET_IMPORTED_LOCATION) list(APPEND __TARGET_CHECK_NAMES ${__TARGET_IMPORTED_LOCATION}) endif() # Get the interface link libraries of the target set(__TARGET_LINK_LIBRARIES) - get_target_property(__TARGET_LINK_LIBRARIES ${TARGET_NAME} + get_target_property(__TARGET_LINK_LIBRARIES "${TARGET_NAME}" INTERFACE_LINK_LIBRARIES) list(APPEND __TARGET_CHECK_NAMES ${__TARGET_LINK_LIBRARIES}) - + else() + # If the name is not a target, it should be a link name. We can directly + # append it to the checking list. + list(APPEND __TARGET_CHECK_NAMES "${TARGET_NAME}") endif() endforeach() @@ -305,3 +308,23 @@ function(project_build_tools_unwrap_interface_link_libraries OUTPUT_VAR) ${__OUTPUT_VAR} PARENT_SCOPE) endfunction() + +function(project_build_tools_unwrap_interface_link_libraries OUTPUT_VAR) + set(optionArgs) + set(oneValueArgs) + set(multiValueArgs TARGET_NAME TARGET_MATCH) + cmake_parse_arguments(__SCAN_OPTION "${optionArgs}" "${oneValueArgs}" + "${multiValueArgs}" "${ARGN}") + + set(__OUTPUT_VAR_LEVEL_1) + set(__OUTPUT_VAR_LEVEL_2) + __project_build_tools_unwrap_interface_link_libraries(__OUTPUT_VAR_LEVEL_1 + "${ARGN}") + __project_build_tools_unwrap_interface_link_libraries( + __OUTPUT_VAR_LEVEL_2 TARGET_NAME ${__OUTPUT_VAR_LEVEL_1} TARGET_MATCH + ${__SCAN_OPTION_TARGET_MATCH}) + + set(${OUTPUT_VAR} + ${__OUTPUT_VAR_LEVEL_2} + PARENT_SCOPE) +endfunction() From 423f506246d78c39a917ffa9f14591db0c06523e Mon Sep 17 00:00:00 2001 From: owent Date: Fri, 20 Jun 2025 22:18:37 +0800 Subject: [PATCH 09/11] Remove the patches for conan --- .github/workflows/cmake_install.yml | 40 +---------- cmake/opentelemetry-proto.cmake | 44 ++---------- cmake/tools.cmake | 106 ---------------------------- 3 files changed, 6 insertions(+), 184 deletions(-) diff --git a/.github/workflows/cmake_install.yml b/.github/workflows/cmake_install.yml index f1e1ddf566..d93d0a5bbb 100644 --- a/.github/workflows/cmake_install.yml +++ b/.github/workflows/cmake_install.yml @@ -252,7 +252,7 @@ jobs: run: ./ci/do_ci.sh cmake.opentracing_shim.install.test ubuntu_2404_conan_latest: - name: Ubuntu 24.04 conan latest versions cxx17 (static libs - shared libs) + name: Ubuntu 24.04 conan latest versions cxx17 (static libs) runs-on: ubuntu-24.04 env: INSTALL_TEST_DIR: '/home/runner/install_test' @@ -285,44 +285,6 @@ jobs: run: | export PKG_CONFIG_PATH=$INSTALL_TEST_DIR/lib/pkgconfig:$PKG_CONFIG_PATH ./ci/verify_packages.sh - - name: Run Tests (shared libs) - env: - BUILD_SHARED_LIBS: 'ON' - run: ./ci/do_ci.sh cmake.install.test - - ubuntu_2404_conan_latest_shared_deps: - name: Ubuntu 24.04 conan latest w/shared protobuf and grpc (shared libs) - runs-on: ubuntu-24.04 - env: - INSTALL_TEST_DIR: '/home/runner/install_test' - # Set to the latest version of cmake 3.x - CMAKE_VERSION: '3.31.6' - CXX_STANDARD: '17' - CMAKE_TOOLCHAIN_FILE: /home/runner/conan/build/Debug/generators/conan_toolchain.cmake - BUILD_TYPE: 'Debug' - 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: Install Conan - run: | - python3 -m pip install pip==25.0.1 - pip install "conan==2.15.1" - conan profile detect --force - - name: Install or build all dependencies with Conan - run: | - sudo -E ./ci/setup_cmake.sh - conan install install/conan/conanfile_latest.txt --build=missing -of /home/runner/conan -s build_type=${BUILD_TYPE} -s compiler.cppstd=${CXX_STANDARD} -o protobuf/*:shared=True -o grpc/*:shared=True - - name: Run Tests (shared libs) - env: - BUILD_SHARED_LIBS: 'ON' - run: | - source /home/runner/conan/build/Debug/generators/conanrun.sh - ./ci/do_ci.sh cmake.install.test macos_14_conan_stable: name: macOS 14 conan stable versions cxx17 (static libs) diff --git a/cmake/opentelemetry-proto.cmake b/cmake/opentelemetry-proto.cmake index f6a87ab14f..b1d8a1f3e1 100644 --- a/cmake/opentelemetry-proto.cmake +++ b/cmake/opentelemetry-proto.cmake @@ -228,24 +228,6 @@ endif() # opentelemetry_exporter_otlp_grpc_client as a static library. if(TARGET protobuf::libprotobuf) get_target_property(protobuf_lib_type protobuf::libprotobuf TYPE) - # protobuf_lib_type may be "INTERFACE_LIBRARY" in some build systems, such as - # conan. - if(protobuf_lib_type STREQUAL "INTERFACE_LIBRARY") - project_build_tools_unwrap_interface_link_libraries( - protobuf_lib_files TARGET_NAME protobuf::libprotobuf TARGET_MATCH - ".*(protobuf).*") - foreach(protobuf_lib_file ${protobuf_lib_files}) - if(protobuf_lib_file MATCHES - "(^|[\\\\\\/])[^\\\\\\/]*protobuf[^\\\\\\/]*\\.(a|lib)$") - set(protobuf_lib_type "STATIC_LIBRARY") - break() - elseif(protobuf_lib_file MATCHES - "(^|[\\\\\\/])[^\\\\\\/]*protobuf[^\\\\\\/]*\\.(so|dll|dylib)$") - set(protobuf_lib_type "SHARED_LIBRARY") - break() - endif() - endforeach() - endif() else() set(protobuf_lib_type "SHARED_LIBRARY") target_link_libraries(opentelemetry_proto PUBLIC ${Protobuf_LIBRARIES}) @@ -357,8 +339,8 @@ target_include_directories( "$") # Disable include-what-you-use and clang-tidy on generated code. -set_target_properties(opentelemetry_proto PROPERTIES CXX_INCLUDE_WHAT_YOU_USE - "" CXX_CLANG_TIDY "") +set_target_properties(opentelemetry_proto PROPERTIES CXX_INCLUDE_WHAT_YOU_USE "" + CXX_CLANG_TIDY "") if(NOT Protobuf_INCLUDE_DIRS AND TARGET protobuf::libprotobuf) get_target_property(Protobuf_INCLUDE_DIRS protobuf::libprotobuf INTERFACE_INCLUDE_DIRECTORIES) @@ -378,8 +360,9 @@ if(WITH_OTLP_GRPC) set_target_version(opentelemetry_proto_grpc) # Disable include-what-you-use and clang-tidy on generated code. - set_target_properties(opentelemetry_proto_grpc - PROPERTIES CXX_INCLUDE_WHAT_YOU_USE "" CXX_CLANG_TIDY "") + set_target_properties( + opentelemetry_proto_grpc PROPERTIES CXX_INCLUDE_WHAT_YOU_USE "" + CXX_CLANG_TIDY "") list(APPEND OPENTELEMETRY_PROTO_TARGETS opentelemetry_proto_grpc) target_link_libraries(opentelemetry_proto_grpc PUBLIC opentelemetry_proto) @@ -390,23 +373,6 @@ if(WITH_OTLP_GRPC) # result in crashes. To prevent such conflicts, we also need to build # opentelemetry_exporter_otlp_grpc_client as a static library. get_target_property(grpc_lib_type gRPC::grpc++ TYPE) - # grpc_lib_type may be "INTERFACE_LIBRARY" in some build systems, such as - # conan. - if(grpc_lib_type STREQUAL "INTERFACE_LIBRARY") - project_build_tools_unwrap_interface_link_libraries( - grpc_lib_files TARGET_NAME gRPC::grpc++ TARGET_MATCH ".*(grpc|gRPC).*") - foreach(grpc_lib_file ${grpc_lib_files}) - if(grpc_lib_file MATCHES - "(^|[\\\\\\/])[^\\\\\\/]*grpc[^\\\\\\/]*\\.(a|lib)$") - set(grpc_lib_type "STATIC_LIBRARY") - break() - elseif(grpc_lib_file MATCHES - "(^|[\\\\\\/])[^\\\\\\/]*grpc[^\\\\\\/]*\\.(so|dll|dylib)$") - set(grpc_lib_type "SHARED_LIBRARY") - break() - endif() - endforeach() - endif() if(grpc_lib_type STREQUAL "SHARED_LIBRARY") target_link_libraries(opentelemetry_proto_grpc PUBLIC gRPC::grpc++) diff --git a/cmake/tools.cmake b/cmake/tools.cmake index 2e3e34e063..43ac5156d4 100644 --- a/cmake/tools.cmake +++ b/cmake/tools.cmake @@ -222,109 +222,3 @@ function(project_build_tools_patch_default_imported_config) endif() endforeach() endfunction() - -function(__project_build_tools_recursive_scan_unwrap OUTPUT_VAR INPUT_VAR) - # With sub-expressions - if(INPUT_VAR MATCHES "^\\\$<.*>:([^>]+)>$") - set(${OUTPUT_VAR} - "${CMAKE_MATCH_1}" - PARENT_SCOPE) - elseif(INPUT_VAR MATCHES "^\\\$<.*>:([^>]+)$") - set(${OUTPUT_VAR} - "${CMAKE_MATCH_1}" - PARENT_SCOPE) - elseif(INPUT_VAR MATCHES "^\\\$<[^:]+:([^>]+)>$") - set(${OUTPUT_VAR} - "${CMAKE_MATCH_1}" - PARENT_SCOPE) - elseif(INPUT_VAR MATCHES "^\\\$<[^:]+:([^>]+)$") - set(${OUTPUT_VAR} - "${CMAKE_MATCH_1}" - PARENT_SCOPE) - else() - set(${OUTPUT_VAR} - "${INPUT_VAR}" - PARENT_SCOPE) - endif() -endfunction() - -function(__project_build_tools_unwrap_interface_link_libraries OUTPUT_VAR) - set(optionArgs) - set(oneValueArgs) - set(multiValueArgs TARGET_NAME TARGET_MATCH) - cmake_parse_arguments(__SCAN_OPTION "${optionArgs}" "${oneValueArgs}" - "${multiValueArgs}" "${ARGN}") - set(__OUTPUT_VAR) - - set(__TARGET_CHECK_NAMES) - foreach(TARGET_NAME_ORIGIN ${__SCAN_OPTION_TARGET_NAME}) - if(TARGET_NAME_ORIGIN MATCHES "^\\\$<.*>?$") - __project_build_tools_recursive_scan_unwrap(TARGET_NAME - "${TARGET_NAME_ORIGIN}") - else() - set(TARGET_NAME "${TARGET_NAME_ORIGIN}") - endif() - - if(TARGET "${TARGET_NAME}") - # Get the imported location of the target - project_build_tools_get_imported_location(__TARGET_IMPORTED_LOCATION - "${TARGET_NAME}") - if(__TARGET_IMPORTED_LOCATION) - list(APPEND __TARGET_CHECK_NAMES ${__TARGET_IMPORTED_LOCATION}) - endif() - - # Get the interface link libraries of the target - set(__TARGET_LINK_LIBRARIES) - get_target_property(__TARGET_LINK_LIBRARIES "${TARGET_NAME}" - INTERFACE_LINK_LIBRARIES) - list(APPEND __TARGET_CHECK_NAMES ${__TARGET_LINK_LIBRARIES}) - else() - # If the name is not a target, it should be a link name. We can directly - # append it to the checking list. - list(APPEND __TARGET_CHECK_NAMES "${TARGET_NAME}") - endif() - endforeach() - - list(REMOVE_DUPLICATES __TARGET_CHECK_NAMES) - # If the target match option is set, filter the link names - if(__SCAN_OPTION_TARGET_MATCH) - foreach(__LINK_NAME IN LISTS __TARGET_CHECK_NAMES) - set(__TARGET_MATCHED FALSE) - foreach(__MATCH_RULE ${__SCAN_OPTION_TARGET_MATCH}) - if(__LINK_NAME MATCHES "${__MATCH_RULE}") - set(__TARGET_MATCHED TRUE) - break() - endif() - endforeach() - if(__TARGET_MATCHED) - list(APPEND __OUTPUT_VAR ${__LINK_NAME}) - endif() - endforeach() - else() - set(__OUTPUT_VAR ${__TARGET_CHECK_NAMES}) - endif() - - set(${OUTPUT_VAR} - ${__OUTPUT_VAR} - PARENT_SCOPE) -endfunction() - -function(project_build_tools_unwrap_interface_link_libraries OUTPUT_VAR) - set(optionArgs) - set(oneValueArgs) - set(multiValueArgs TARGET_NAME TARGET_MATCH) - cmake_parse_arguments(__SCAN_OPTION "${optionArgs}" "${oneValueArgs}" - "${multiValueArgs}" "${ARGN}") - - set(__OUTPUT_VAR_LEVEL_1) - set(__OUTPUT_VAR_LEVEL_2) - __project_build_tools_unwrap_interface_link_libraries(__OUTPUT_VAR_LEVEL_1 - "${ARGN}") - __project_build_tools_unwrap_interface_link_libraries( - __OUTPUT_VAR_LEVEL_2 TARGET_NAME ${__OUTPUT_VAR_LEVEL_1} TARGET_MATCH - ${__SCAN_OPTION_TARGET_MATCH}) - - set(${OUTPUT_VAR} - ${__OUTPUT_VAR_LEVEL_2} - PARENT_SCOPE) -endfunction() From 1dc2b362b78e00e49cc4017fd27eaaeea6be5fd8 Mon Sep 17 00:00:00 2001 From: owent Date: Sat, 21 Jun 2025 00:30:48 +0800 Subject: [PATCH 10/11] Remove the conan shared libs job --- .github/workflows/cmake_install.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/cmake_install.yml b/.github/workflows/cmake_install.yml index d93d0a5bbb..b7cc79c1c9 100644 --- a/.github/workflows/cmake_install.yml +++ b/.github/workflows/cmake_install.yml @@ -211,7 +211,7 @@ jobs: run: ./ci/do_ci.sh cmake.install.test ubuntu_2404_conan_stable: - name: Ubuntu 24.04 conan stable versions cxx17 (static libs - shared libs - opentracing shim) + name: Ubuntu 24.04 conan stable versions cxx17 (static libs - opentracing shim) runs-on: ubuntu-24.04 env: INSTALL_TEST_DIR: '/home/runner/install_test' @@ -240,10 +240,6 @@ jobs: env: BUILD_SHARED_LIBS: 'OFF' run: ./ci/do_ci.sh cmake.install.test - - name: Run Tests (shared libs) - env: - BUILD_SHARED_LIBS: 'ON' - run: ./ci/do_ci.sh cmake.install.test - name: verify pkgconfig packages run: | export PKG_CONFIG_PATH=$INSTALL_TEST_DIR/lib/pkgconfig:$PKG_CONFIG_PATH From 2e344f28efe8508804594fa8e8bb0d3083072cb9 Mon Sep 17 00:00:00 2001 From: owent Date: Tue, 24 Jun 2025 17:27:05 +0800 Subject: [PATCH 11/11] Remove `OPENTELEMETRY_OTLP_PROTO_LIB_TYPE` --- cmake/opentelemetry-proto.cmake | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cmake/opentelemetry-proto.cmake b/cmake/opentelemetry-proto.cmake index b1d8a1f3e1..e42e1a7965 100644 --- a/cmake/opentelemetry-proto.cmake +++ b/cmake/opentelemetry-proto.cmake @@ -322,7 +322,6 @@ endif() set(OPENTELEMETRY_PROTO_TARGETS opentelemetry_proto) add_library( opentelemetry_proto - ${OPENTELEMETRY_OTLP_PROTO_LIB_TYPE} ${OTELCPP_PROTO_TARGET_OPTIONS} ${COMMON_PB_CPP_FILE} ${RESOURCE_PB_CPP_FILE} @@ -354,9 +353,8 @@ endif() if(WITH_OTLP_GRPC) add_library( opentelemetry_proto_grpc - ${OPENTELEMETRY_OTLP_PROTO_LIB_TYPE} ${OTELCPP_PROTO_TARGET_OPTIONS} - ${TRACE_SERVICE_GRPC_PB_CPP_FILE} ${LOGS_SERVICE_GRPC_PB_CPP_FILE} - ${METRICS_SERVICE_GRPC_PB_CPP_FILE}) + ${OTELCPP_PROTO_TARGET_OPTIONS} ${TRACE_SERVICE_GRPC_PB_CPP_FILE} + ${LOGS_SERVICE_GRPC_PB_CPP_FILE} ${METRICS_SERVICE_GRPC_PB_CPP_FILE}) set_target_version(opentelemetry_proto_grpc) # Disable include-what-you-use and clang-tidy on generated code.