From 0e8b2d160ad5a582f8ecfdd28ec6d15c41e08079 Mon Sep 17 00:00:00 2001 From: Douglas Barker Date: Sun, 8 Jun 2025 19:24:41 -0600 Subject: [PATCH 1/7] Create a cmake script for each third party dependency. Support FetchContent and find_package with the otel_add_thirdparty_package function. Remove the static third party dependency file. Move the version parsing to a version script and set the project version in the main command. Clean up cmake target usage. --- CMakeLists.txt | 586 +++--------------- api/CMakeLists.txt | 44 +- cmake/benchmark.cmake | 16 + cmake/curl.cmake | 38 ++ cmake/googletest.cmake | 25 + cmake/grpc.cmake | 68 ++ cmake/ms-gsl.cmake | 17 + cmake/nlohmann-json.cmake | 105 +--- cmake/opentelemetry-proto.cmake | 119 ++-- cmake/opentracing-cpp.cmake | 43 ++ cmake/otel-install-functions.cmake | 439 ++++++++++++- cmake/prometheus-cpp.cmake | 18 + cmake/protobuf.cmake | 63 ++ .../opentelemetry-cpp-config.cmake.in | 3 +- cmake/thirdparty-dependency-config.cmake | 46 -- cmake/threads.cmake | 12 + cmake/tools.cmake | 10 + cmake/version.cmake | 73 +++ cmake/zlib.cmake | 14 + examples/http/CMakeLists.txt | 2 +- exporters/etw/CMakeLists.txt | 3 - exporters/otlp/CMakeLists.txt | 9 - exporters/prometheus/CMakeLists.txt | 24 +- exporters/zipkin/CMakeLists.txt | 2 +- ext/src/http/client/curl/CMakeLists.txt | 55 +- ext/test/http/CMakeLists.txt | 26 +- .../CMakeLists.txt | 6 +- opentracing-shim/CMakeLists.txt | 53 +- sdk/test/metrics/CMakeLists.txt | 2 +- 29 files changed, 1025 insertions(+), 896 deletions(-) create mode 100644 cmake/benchmark.cmake create mode 100644 cmake/curl.cmake create mode 100644 cmake/googletest.cmake create mode 100644 cmake/grpc.cmake create mode 100644 cmake/ms-gsl.cmake create mode 100644 cmake/opentracing-cpp.cmake create mode 100644 cmake/prometheus-cpp.cmake create mode 100644 cmake/protobuf.cmake delete mode 100644 cmake/thirdparty-dependency-config.cmake create mode 100644 cmake/threads.cmake create mode 100644 cmake/version.cmake create mode 100644 cmake/zlib.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 89343f6ffc..6eb62a8dc6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,85 +31,18 @@ if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.20.0") cmake_policy(SET CMP0117 NEW) endif() -project(opentelemetry-cpp) +# Read the opentelemetry-cpp project and abi version from the api version header +# file and set the third-party version tags +include("${CMAKE_CURRENT_LIST_DIR}/cmake/version.cmake") + +project( + opentelemetry-cpp + VERSION ${OPENTELEMETRY_VERSION} + LANGUAGES CXX) # Mark variables as used so cmake doesn't complain about them mark_as_advanced(CMAKE_TOOLCHAIN_FILE) -# Note: CMAKE_FIND_PACKAGE_PREFER_CONFIG requires cmake 3.15. Prefer cmake -# CONFIG search mode to find dependencies. This is important to properly find -# protobuf versions 3.22.0 and above due to the abseil-cpp dependency. -set(CMAKE_FIND_PACKAGE_PREFER_CONFIG TRUE) - -# Don't use customized cmake modules if vcpkg is used to resolve dependence. -if(NOT DEFINED CMAKE_TOOLCHAIN_FILE) - list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules/") -endif() - -if(EXISTS "${CMAKE_SOURCE_DIR}/third_party_release") - file(STRINGS "${CMAKE_SOURCE_DIR}/third_party_release" third_party_tags) - foreach(third_party ${third_party_tags}) - string(REGEX REPLACE "^[ ]+" "" third_party ${third_party}) - string(REGEX MATCH "^[^=]+" third_party_name ${third_party}) - string(REPLACE "${third_party_name}=" "" third_party_tag ${third_party}) - set(${third_party_name} "${third_party_tag}") - endforeach() -endif() - -if(DEFINED ENV{ARCH}) - # Architecture may be specified via ARCH environment variable - set(ARCH $ENV{ARCH}) -else() - # Autodetection logic that populates ARCH variable - if(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*") - # Windows may report AMD64 even if target is 32-bit - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(ARCH x64) - elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) - set(ARCH x86) - endif() - elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "i686.*|i386.*|x86.*") - # Windows may report x86 even if target is 64-bit - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(ARCH x64) - elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) - set(ARCH x86) - endif() - elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "powerpc") - # AIX will report the processor as 'powerpc' even if building in 64-bit mode - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(ARCH ppc64) - else() - set(ARCH ppc32) - endif() - elseif(CMAKE_SYSTEM_PROCESSOR MATCHES - "^(aarch64.*|AARCH64.*|arm64.*|ARM64.*)") - set(ARCH arm64) - elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm.*|ARM.*)") - set(ARCH arm) - elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64le") - set(ARCH ppc64le) - elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64") - set(ARCH ppc64) - elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(mips.*|MIPS.*)") - set(ARCH mips) - elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(riscv.*|RISCV.*)") - set(ARCH riscv) - elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(s390x.*|S390X.*)") - set(ARCH s390x) - elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(sparc.*|SPARC.*)") - set(ARCH sparc) - elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(loongarch.*|LOONGARCH.*)") - set(ARCH loongarch) - else() - message( - FATAL_ERROR - "opentelemetry-cpp: unrecognized target processor ${CMAKE_SYSTEM_PROCESSOR} configuration!" - ) - endif() -endif() -message(STATUS "Building for architecture ARCH=${ARCH}") - # Autodetect vcpkg toolchain if(DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE) set(CMAKE_TOOLCHAIN_FILE @@ -117,16 +50,9 @@ if(DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE) CACHE STRING "") endif() -if(VCPKG_CHAINLOAD_TOOLCHAIN_FILE) - include("${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}") -endif() - option(WITH_ABI_VERSION_1 "ABI version 1" ON) option(WITH_ABI_VERSION_2 "EXPERIMENTAL: ABI version 2 preview" OFF) -file(READ "${CMAKE_CURRENT_LIST_DIR}/api/include/opentelemetry/version.h" - OPENTELEMETRY_CPP_HEADER_VERSION_H) - # # We do not want to have WITH_ABI_VERSION = "1" or "2", and instead prefer two # distinct flags, WITH_ABI_VERSION_1 and WITH_ABI_VERSION_2. @@ -156,31 +82,9 @@ if(WITH_ABI_VERSION_2) elseif(WITH_ABI_VERSION_1) set(OPENTELEMETRY_ABI_VERSION_NO "1") else() - if(OPENTELEMETRY_CPP_HEADER_VERSION_H MATCHES - "OPENTELEMETRY_ABI_VERSION_NO[ \t\r\n]+\"?([0-9]+)\"?") - math(EXPR OPENTELEMETRY_ABI_VERSION_NO ${CMAKE_MATCH_1}) - else() - message( - FATAL_ERROR - "OPENTELEMETRY_ABI_VERSION_NO not found on ${CMAKE_CURRENT_LIST_DIR}/api/include/opentelemetry/version.h" - ) - endif() + set(OPENTELEMETRY_ABI_VERSION_NO ${OPENTELEMETRY_ABI_VERSION_DEFAULT}) endif() -message(STATUS "OPENTELEMETRY_ABI_VERSION_NO=${OPENTELEMETRY_ABI_VERSION_NO}") - -if(OPENTELEMETRY_CPP_HEADER_VERSION_H MATCHES - "OPENTELEMETRY_VERSION[ \t\r\n]+\"?([^\"]+)\"?") - set(OPENTELEMETRY_VERSION ${CMAKE_MATCH_1}) -else() - message( - FATAL_ERROR - "OPENTELEMETRY_VERSION not found on ${CMAKE_CURRENT_LIST_DIR}/api/include/opentelemetry/version.h" - ) -endif() - -message(STATUS "OPENTELEMETRY_VERSION=${OPENTELEMETRY_VERSION}") - option(WITH_NO_DEPRECATED_CODE "Do not include deprecated code" OFF) set(WITH_STL @@ -197,7 +101,8 @@ endif() option(OPENTELEMETRY_INSTALL "Whether to install opentelemetry targets" ${OPENTELEMETRY_INSTALL_default}) -include("${PROJECT_SOURCE_DIR}/cmake/tools.cmake") +include("${opentelemetry-cpp_SOURCE_DIR}/cmake/tools.cmake") +include("${opentelemetry-cpp_SOURCE_DIR}/cmake/otel-install-functions.cmake") if(NOT WITH_STL STREQUAL "OFF") # These definitions are needed for test projects that do not link against @@ -320,45 +225,31 @@ option(OPENTELEMETRY_SKIP_DYNAMIC_LOADING_TESTS "Whether to build test libraries that are always linked as shared libs" OFF) +option( + OTELCPP_THIRDPARTY_FETCH_CONTENT_ONLY + "Whether to require use of FetchContent to satisfy dependencies from submodules or GitHub repositories" + OFF) + +option( + OTELCPP_THIRDPARTY_FIND_PACKAGE_ONLY + "Whether to require use of find_package to satisfy dependencies with locally installed packages" + OFF) + # # Verify options dependencies # - +if(OTELCPP_THIRDPARTY_FETCH_CONTENT_ONLY + AND OTELCPP_THIRDPARTY_FIND_PACKAGE_ONLY) + message( + FATAL_ERROR + "OTELCPP_THIRDPARTY_FETCH_CONTENT_ONLY and " + "OTELCPP_THIRDPARTY_FIND_PACKAGE_ONLY are mutually " + "exclusive options. Both can be OFF but only one can be ON.") +endif() if(WITH_EXAMPLES_HTTP AND NOT WITH_EXAMPLES) message(FATAL_ERROR "WITH_EXAMPLES_HTTP=ON requires WITH_EXAMPLES=ON") endif() -find_package(Threads) - -function(install_windows_deps) - # Bootstrap vcpkg from CMake and auto-install deps in case if we are missing - # deps on Windows. Respect the target architecture variable. - set(VCPKG_TARGET_ARCHITECTURE - ${ARCH} - PARENT_SCOPE) - message(STATUS "Installing build tools and dependencies...") - set(ENV{ARCH} ${ARCH}) - execute_process( - COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/tools/setup-buildtools.cmd) - set(CMAKE_TOOLCHAIN_FILE - ${CMAKE_CURRENT_SOURCE_DIR}/tools/vcpkg/scripts/buildsystems/vcpkg.cmake - CACHE FILEPATH "") - message( - STATUS - "Make sure that vcpkg.cmake is set as the CMAKE_TOOLCHAIN_FILE at the START of the cmake build process! - Can be command-line arg (cmake -DCMAKE_TOOLCHAIN_FILE=...) or set in your editor of choice." - ) - -endfunction() - -function(set_target_version target_name) - if(OTELCPP_VERSIONED_LIBS) - set_target_properties( - ${target_name} PROPERTIES VERSION ${OPENTELEMETRY_VERSION} - SOVERSION ${OPENTELEMETRY_ABI_VERSION_NO}) - endif() -endfunction() - if(MSVC) # Options for Visual C++ compiler: /Zc:__cplusplus - report an updated value # for recent C++ language standards. Without this option MSVC returns the @@ -369,137 +260,12 @@ if(MSVC) endif() endif() -# include GNUInstallDirs before include cmake/opentelemetry-proto.cmake because -# opentelemetry-proto installs targets to the location variables defined in -# GNUInstallDirs. -include(GNUInstallDirs) - -if(WITH_PROMETHEUS) - find_package(prometheus-cpp CONFIG QUIET) - if(NOT prometheus-cpp_FOUND) - message(STATUS "Trying to use local prometheus-cpp from submodule") - if(EXISTS ${PROJECT_SOURCE_DIR}/third_party/prometheus-cpp/.git) - set(SAVED_ENABLE_TESTING ${ENABLE_TESTING}) - set(SAVED_CMAKE_CXX_CLANG_TIDY ${CMAKE_CXX_CLANG_TIDY}) - set(SAVED_CMAKE_CXX_INCLUDE_WHAT_YOU_USE - ${CMAKE_CXX_INCLUDE_WHAT_YOU_USE}) - set(ENABLE_TESTING OFF) - set(CMAKE_CXX_CLANG_TIDY "") - set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE "") - add_subdirectory(third_party/prometheus-cpp) - set(ENABLE_TESTING ${SAVED_ENABLE_TESTING}) - set(CMAKE_CXX_CLANG_TIDY ${SAVED_CMAKE_CXX_CLANG_TIDY}) - set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE - ${SAVED_CMAKE_CXX_INCLUDE_WHAT_YOU_USE}) - - # Get the version of the prometheus-cpp submodule - find_package(Git QUIET) - if(Git_FOUND) - execute_process( - COMMAND ${GIT_EXECUTABLE} describe --tags --always - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/third_party/prometheus-cpp - OUTPUT_VARIABLE prometheus-cpp_VERSION - OUTPUT_STRIP_TRAILING_WHITESPACE) - string(REGEX REPLACE "^v" "" prometheus-cpp_VERSION - "${prometheus-cpp_VERSION}") - endif() - - message( - STATUS - "Using local prometheus-cpp from submodule. Version = ${prometheus-cpp_VERSION}" - ) - else() - message( - FATAL_ERROR - "\nprometheus-cpp package was not found. Please either provide it manually or clone with submodules. " - "To initialize, fetch and checkout any nested submodules, you can use the following command:\n" - "git submodule update --init --recursive") - endif() - else() - message(STATUS "Using external prometheus-cpp") - endif() +if(NOT WITH_API_ONLY) + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/threads.cmake") endif() -if(WITH_OTLP_GRPC - OR WITH_OTLP_HTTP - OR WITH_OTLP_FILE) - - # Including the CMakeFindDependencyMacro resolves an error from - # gRPCConfig.cmake on some grpc versions. See - # https://github.com/grpc/grpc/pull/33361 for more details. - include(CMakeFindDependencyMacro) - - # Protobuf 3.22+ depends on abseil-cpp and must be found using the cmake - # find_package CONFIG search mode. The following attempts to find Protobuf - # using the CONFIG mode first, and if not found, falls back to the MODULE - # mode. See https://gitlab.kitware.com/cmake/cmake/-/issues/24321 for more - # details. - find_package(Protobuf CONFIG) - if(NOT Protobuf_FOUND) - find_package(Protobuf MODULE) - if(Protobuf_FOUND AND Protobuf_VERSION VERSION_GREATER_EQUAL "3.22.0") - message( - WARNING - "Found Protobuf version ${Protobuf_VERSION} using MODULE mode. " - "Linking errors may occur. Protobuf 3.22+ depends on abseil-cpp " - "and should be found using the CONFIG mode.") - endif() - endif() - - if(WITH_OTLP_GRPC) - find_package(gRPC CONFIG) - endif() - if((NOT Protobuf_FOUND) OR (WITH_OTLP_GRPC AND NOT gRPC_FOUND)) - if(WIN32 AND (NOT DEFINED CMAKE_TOOLCHAIN_FILE)) - install_windows_deps() - endif() - - if(WIN32 AND (NOT DEFINED CMAKE_TOOLCHAIN_FILE)) - message(FATAL_ERROR "Windows dependency installation failed!") - endif() - if(WIN32) - include(${CMAKE_TOOLCHAIN_FILE}) - endif() - - if(NOT Protobuf_FOUND) - find_package(Protobuf CONFIG REQUIRED) - endif() - if(NOT gRPC_FOUND AND WITH_OTLP_GRPC) - find_package(gRPC CONFIG) - endif() - if(WIN32) - # Always use x64 protoc.exe - if(NOT EXISTS "${Protobuf_PROTOC_EXECUTABLE}") - set(Protobuf_PROTOC_EXECUTABLE - ${CMAKE_CURRENT_SOURCE_DIR}/tools/vcpkg/packages/protobuf_x64-windows/tools/protobuf/protoc.exe - ) - endif() - endif() - endif() - # Latest Protobuf imported targets and without legacy module support - if(TARGET protobuf::protoc) - if(CMAKE_CROSSCOMPILING AND Protobuf_PROTOC_EXECUTABLE) - set(PROTOBUF_PROTOC_EXECUTABLE ${Protobuf_PROTOC_EXECUTABLE}) - else() - project_build_tools_get_imported_location(PROTOBUF_PROTOC_EXECUTABLE - protobuf::protoc) - # If protobuf::protoc is not a imported target, then we use the target - # directly for fallback - if(NOT PROTOBUF_PROTOC_EXECUTABLE) - set(PROTOBUF_PROTOC_EXECUTABLE protobuf::protoc) - endif() - endif() - elseif(Protobuf_PROTOC_EXECUTABLE) - # Some versions of FindProtobuf.cmake uses mixed case instead of uppercase - set(PROTOBUF_PROTOC_EXECUTABLE ${Protobuf_PROTOC_EXECUTABLE}) - endif() - include(CMakeDependentOption) - - message(STATUS "PROTOBUF_PROTOC_EXECUTABLE=${PROTOBUF_PROTOC_EXECUTABLE}") - set(SAVED_CMAKE_CXX_CLANG_TIDY ${CMAKE_CXX_CLANG_TIDY}) - set(CMAKE_CXX_CLANG_TIDY "") - include(cmake/opentelemetry-proto.cmake) - set(CMAKE_CXX_CLANG_TIDY ${SAVED_CMAKE_CXX_CLANG_TIDY}) +if(WITH_GSL) + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/ms-gsl.cmake") endif() # @@ -517,33 +283,33 @@ else() endif() # -# Do we need CURL ? +# Do we need ZLIB ? # -if((NOT WITH_API_ONLY) AND WITH_HTTP_CLIENT_CURL) - # No specific version required. - find_package(CURL REQUIRED) - # Set the CURL_VERSION from the legacy CURL_VERSION_STRING Required for CMake - # versions below 4.0 - if(NOT DEFINED CURL_VERSION AND DEFINED CURL_VERSION_STRING) - set(CURL_VERSION ${CURL_VERSION_STRING}) - endif() +if((NOT WITH_API_ONLY) + AND WITH_HTTP_CLIENT_CURL + AND WITH_OTLP_HTTP_COMPRESSION) + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/zlib.cmake") endif() # -# Do we need ZLIB ? +# Do we need CURL ? # -if((NOT WITH_API_ONLY) - AND WITH_HTTP_CLIENT_CURL - AND WITH_OTLP_HTTP_COMPRESSION) - # No specific version required. - find_package(ZLIB REQUIRED) - # Set the ZLIB_VERSION from the legacy ZLIB_VERSION_STRING Required for CMake - # versions below 3.26 - if(NOT DEFINED ZLIB_VERSION AND DEFINED ZLIB_VERSION_STRING) - set(ZLIB_VERSION ${ZLIB_VERSION_STRING}) +if((NOT WITH_API_ONLY) AND WITH_HTTP_CLIENT_CURL) + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/curl.cmake") +endif() + +if(WITH_OTLP_GRPC + OR WITH_OTLP_HTTP + OR WITH_OTLP_FILE) + + if(WITH_OTLP_GRPC) + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/grpc.cmake") endif() + + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/protobuf.cmake") + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/opentelemetry-proto.cmake") endif() # @@ -562,7 +328,15 @@ else() endif() if((NOT WITH_API_ONLY) AND USE_NLOHMANN_JSON) - include(cmake/nlohmann-json.cmake) + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/nlohmann-json.cmake") +endif() + +if(WITH_PROMETHEUS) + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/prometheus-cpp.cmake") +endif() + +if(WITH_OPENTRACING) + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/opentracing-cpp.cmake") endif() if(OTELCPP_MAINTAINER_MODE) @@ -658,199 +432,17 @@ endif(OTELCPP_MAINTAINER_MODE) list(APPEND CMAKE_PREFIX_PATH "${CMAKE_BINARY_DIR}") -include(CTest) if(BUILD_TESTING) - if(EXISTS ${CMAKE_BINARY_DIR}/lib/libgtest.a) - # Prefer GTest from build tree. GTest is not always working with - # CMAKE_PREFIX_PATH - set(GTEST_INCLUDE_DIRS - ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googletest/include - ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googlemock/include) - if(TARGET gtest) - set(GTEST_BOTH_LIBRARIES gtest gtest_main) - else() - set(GTEST_BOTH_LIBRARIES ${CMAKE_BINARY_DIR}/lib/libgtest.a - ${CMAKE_BINARY_DIR}/lib/libgtest_main.a) - endif() - elseif(WIN32) - # Make sure we are always bootsrapped with vcpkg on Windows - find_package(GTest) - if(NOT (GTEST_FOUND OR GTest_FOUND)) - if(DEFINED CMAKE_TOOLCHAIN_FILE) - message( - FATAL_ERROR - "Pleaes install GTest with the CMAKE_TOOLCHAIN_FILE at ${CMAKE_TOOLCHAIN_FILE}" - ) - else() - install_windows_deps() - include(${CMAKE_TOOLCHAIN_FILE}) - find_package(GTest REQUIRED) - endif() - endif() - else() - # Prefer GTest installed by OS distro, brew or vcpkg package manager - find_package(GTest REQUIRED) - endif() - if(NOT GTEST_BOTH_LIBRARIES) - # New GTest package names - if(TARGET GTest::gtest) - set(GTEST_BOTH_LIBRARIES GTest::gtest GTest::gtest_main) - elseif(TARGET GTest::GTest) - set(GTEST_BOTH_LIBRARIES GTest::GTest GTest::Main) - endif() - endif() - if(GTEST_INCLUDE_DIRS) - include_directories(SYSTEM ${GTEST_INCLUDE_DIRS}) - endif() - message(STATUS "GTEST_INCLUDE_DIRS = ${GTEST_INCLUDE_DIRS}") - message(STATUS "GTEST_BOTH_LIBRARIES = ${GTEST_BOTH_LIBRARIES}") - - # Try to find gmock - if(NOT GMOCK_LIB AND TARGET GTest::gmock) - set(GMOCK_LIB GTest::gmock) - elseif(MSVC) - # Explicitly specify that we consume GTest from shared library. The rest of - # code logic below determines whether we link Release or Debug flavor of the - # library. These flavors have different prefix on Windows, gmock and gmockd - # respectively. - add_definitions(-DGTEST_LINKED_AS_SHARED_LIBRARY=1) - if(GMOCK_LIB) - # unset GMOCK_LIB to force find_library to redo the lookup, as the cached - # entry could cause linking to incorrect flavor of gmock and leading to - # runtime error. - unset(GMOCK_LIB CACHE) - endif() - endif() - if(NOT GMOCK_LIB) - if(MSVC AND CMAKE_BUILD_TYPE STREQUAL "Debug") - find_library(GMOCK_LIB gmockd PATH_SUFFIXES lib) - else() - find_library(GMOCK_LIB gmock PATH_SUFFIXES lib) - endif() - # Reset GMOCK_LIB if it was not found, or some target may link - # GMOCK_LIB-NOTFOUND - if(NOT GMOCK_LIB) - unset(GMOCK_LIB) - unset(GMOCK_LIB CACHE) - endif() - endif() - + include(CTest) + include(GoogleTest) + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/googletest.cmake") enable_testing() + if(WITH_BENCHMARK) - # Benchmark respects the CMAKE_PREFIX_PATH - find_package(benchmark CONFIG REQUIRED) + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/benchmark.cmake") endif() endif() -# Record build config and versions -message(STATUS "---------------------------------------------") -message(STATUS "build settings") -message(STATUS "---------------------------------------------") -message(STATUS "OpenTelemetry: ${OPENTELEMETRY_VERSION}") -message(STATUS "OpenTelemetry ABI: ${OPENTELEMETRY_ABI_VERSION_NO}") -message(STATUS "ARCH: ${ARCH}") -message(STATUS "CXX: ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}") -message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") -message(STATUS "CXXFLAGS: ${CMAKE_CXX_FLAGS}") -message(STATUS "CMAKE_CXX_STANDARD: ${CMAKE_CXX_STANDARD}") -message(STATUS "CMAKE_TOOLCHAIN_FILE: ${CMAKE_TOOLCHAIN_FILE}") -message(STATUS "BUILD_SHARED_LIBS: ${BUILD_SHARED_LIBS}") - -message(STATUS "---------------------------------------------") -message(STATUS "opentelemetry-cpp build options") -message(STATUS "---------------------------------------------") -message(STATUS "WITH_API_ONLY: ${WITH_API_ONLY}") -message(STATUS "WITH_NO_DEPRECATED_CODE: ${WITH_NO_DEPRECATED_CODE}") -message(STATUS "WITH_ABI_VERSION_1: ${WITH_ABI_VERSION_1}") -message(STATUS "WITH_ABI_VERSION_2: ${WITH_ABI_VERSION_2}") -message(STATUS "OTELCPP_VERSIONED_LIBS: ${OTELCPP_VERSIONED_LIBS}") -message(STATUS "OTELCPP_MAINTAINER_MODE: ${OTELCPP_MAINTAINER_MODE}") -message(STATUS "WITH_STL: ${WITH_STL}") -message(STATUS "WITH_GSL: ${WITH_GSL}") -message(STATUS "WITH_NO_GETENV: ${WITH_NO_GETENV}") - -message(STATUS "---------------------------------------------") -message(STATUS "opentelemetry-cpp cmake component options") -message(STATUS "---------------------------------------------") -message(STATUS "WITH_OTLP_GRPC: ${WITH_OTLP_GRPC}") -message(STATUS "WITH_OTLP_HTTP: ${WITH_OTLP_HTTP}") -message(STATUS "WITH_OTLP_FILE: ${WITH_OTLP_FILE}") -message(STATUS "WITH_HTTP_CLIENT_CURL: ${WITH_HTTP_CLIENT_CURL}") -message(STATUS "WITH_ZIPKIN: ${WITH_ZIPKIN}") -message(STATUS "WITH_PROMETHEUS: ${WITH_PROMETHEUS}") -message(STATUS "WITH_ELASTICSEARCH: ${WITH_ELASTICSEARCH}") -message(STATUS "WITH_OPENTRACING: ${WITH_OPENTRACING}") -message(STATUS "WITH_ETW: ${WITH_ETW}") -message(STATUS "OPENTELEMETRY_BUILD_DLL: ${OPENTELEMETRY_BUILD_DLL}") - -message(STATUS "---------------------------------------------") -message(STATUS "feature preview options") -message(STATUS "---------------------------------------------") -message(STATUS "WITH_ASYNC_EXPORT_PREVIEW: ${WITH_ASYNC_EXPORT_PREVIEW}") -message( - STATUS - "WITH_THREAD_INSTRUMENTATION_PREVIEW: ${WITH_THREAD_INSTRUMENTATION_PREVIEW}" -) -message( - STATUS "WITH_METRICS_EXEMPLAR_PREVIEW: ${WITH_METRICS_EXEMPLAR_PREVIEW}") -message(STATUS "WITH_REMOVE_METER_PREVIEW: ${WITH_REMOVE_METER_PREVIEW}") -message( - STATUS "WITH_OTLP_GRPC_SSL_MTLS_PREVIEW: ${WITH_OTLP_GRPC_SSL_MTLS_PREVIEW}") -message( - STATUS - "WITH_OTLP_GRPC_CREDENTIAL_PREVIEW: ${WITH_OTLP_GRPC_CREDENTIAL_PREVIEW}") -message(STATUS "WITH_OTLP_RETRY_PREVIEW: ${WITH_OTLP_RETRY_PREVIEW}") -message(STATUS "---------------------------------------------") -message(STATUS "third-party options") -message(STATUS "---------------------------------------------") -message(STATUS "WITH_NLOHMANN_JSON: ${USE_NLOHMANN_JSON}") -message(STATUS "WITH_CURL_LOGGING: ${WITH_CURL_LOGGING}") -message(STATUS "WITH_OTLP_HTTP_COMPRESSION: ${WITH_OTLP_HTTP_COMPRESSION}") -message(STATUS "---------------------------------------------") -message(STATUS "examples and test options") -message(STATUS "---------------------------------------------") -message(STATUS "WITH_BENCHMARK: ${WITH_BENCHMARK}") -message(STATUS "WITH_EXAMPLES: ${WITH_EXAMPLES}") -message(STATUS "WITH_EXAMPLES_HTTP: ${WITH_EXAMPLES_HTTP}") -message(STATUS "WITH_FUNC_TESTS: ${WITH_FUNC_TESTS}") -message(STATUS "BUILD_W3CTRACECONTEXT_TEST: ${BUILD_W3CTRACECONTEXT_TEST}") -message(STATUS "BUILD_TESTING: ${BUILD_TESTING}") -message(STATUS "---------------------------------------------") -message(STATUS "versions") -message(STATUS "---------------------------------------------") -message(STATUS "CMake: ${CMAKE_VERSION}") -message(STATUS "GTest: ${GTest_VERSION}") -message(STATUS "benchmark: ${benchmark_VERSION}") -if(WITH_GSL) - message(STATUS "GSL: ${GSL_VERSION}") -endif() -if(absl_FOUND) - message(STATUS "Abseil: ${absl_VERSION}") -endif() -if(Protobuf_FOUND) - message(STATUS "Protobuf: ${Protobuf_VERSION}") -endif() -if(gRPC_FOUND) - message(STATUS "gRPC: ${gRPC_VERSION}") -endif() -if(CURL_FOUND) - message(STATUS "CURL: ${CURL_VERSION}") -endif() -if(ZLIB_FOUND) - message(STATUS "ZLIB: ${ZLIB_VERSION}") -endif() -if(USE_NLOHMANN_JSON) - message(STATUS "nlohmann-json: ${nlohmann_json_VERSION}") -endif() -if(prometheus-cpp_FOUND) - message(STATUS "prometheus-cpp: ${prometheus-cpp_VERSION}") -endif() -message(STATUS "---------------------------------------------") - -include("${PROJECT_SOURCE_DIR}/cmake/otel-install-functions.cmake") - -include(CMakePackageConfigHelpers) - if(DEFINED OPENTELEMETRY_BUILD_DLL) if(NOT WIN32) message(FATAL_ERROR "Build DLL is only supported on Windows!") @@ -865,39 +457,15 @@ if(DEFINED OPENTELEMETRY_BUILD_DLL) add_definitions(-DOPENTELEMETRY_BUILD_EXPORT_DLL) endif() +otel_print_build_config() + add_subdirectory(api) if(WITH_OPENTRACING) - find_package(OpenTracing CONFIG QUIET) - if(NOT OpenTracing_FOUND) - set(OPENTRACING_DIR "third_party/opentracing-cpp") - message(STATUS "Trying to use local ${OPENTRACING_DIR} from submodule") - if(EXISTS "${PROJECT_SOURCE_DIR}/${OPENTRACING_DIR}/.git") - set(SAVED_BUILD_TESTING ${BUILD_TESTING}) - set(BUILD_TESTING OFF) - set(SAVED_CMAKE_CXX_INCLUDE_WHAT_YOU_USE - ${CMAKE_CXX_INCLUDE_WHAT_YOU_USE}) - set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE "") - add_subdirectory(${OPENTRACING_DIR}) - set(BUILD_TESTING ${SAVED_BUILD_TESTING}) - set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE - ${SAVED_CMAKE_CXX_INCLUDE_WHAT_YOU_USE}) - else() - message( - FATAL_ERROR - "\nopentracing-cpp package was not found. Please either provide it manually or clone with submodules. " - "To initialize, fetch and checkout any nested submodules, you can use the following command:\n" - "git submodule update --init --recursive") - endif() - else() - message(STATUS "Using external opentracing-cpp") - endif() add_subdirectory(opentracing-shim) endif() if(NOT WITH_API_ONLY) - set(BUILD_TESTING ${BUILD_TESTING}) - add_subdirectory(sdk) add_subdirectory(ext) add_subdirectory(exporters) @@ -913,8 +481,10 @@ if(NOT WITH_API_ONLY) endif() endif() -include(cmake/opentelemetry-build-external-component.cmake) -include(cmake/patch-imported-config.cmake) +include( + "${opentelemetry-cpp_SOURCE_DIR}/cmake/opentelemetry-build-external-component.cmake" +) +include("${opentelemetry-cpp_SOURCE_DIR}/cmake/patch-imported-config.cmake") if(OPENTELEMETRY_INSTALL) # Install the cmake config and version files @@ -927,7 +497,17 @@ if(OPENTELEMETRY_INSTALL) otel_install_thirdparty_definitions() if(BUILD_PACKAGE) - include(cmake/package.cmake) + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/package.cmake") include(CPack) endif() endif() + +# Make the version and ABI version available to the user for in-tree builds +# These are the same variables that are cached with +# find_package(opentelemetry-cpp CONFIG) +set(OPENTELEMETRY_ABI_VERSION_NO + "${OPENTELEMETRY_ABI_VERSION_NO}" + CACHE STRING "opentelemetry-cpp ABI version" FORCE) +set(OPENTELEMETRY_VERSION + "${OPENTELEMETRY_VERSION}" + CACHE STRING "opentelemetry-cpp version" FORCE) diff --git a/api/CMakeLists.txt b/api/CMakeLists.txt index 8430a52250..48c9098eaa 100644 --- a/api/CMakeLists.txt +++ b/api/CMakeLists.txt @@ -9,22 +9,7 @@ target_include_directories( set_target_properties(opentelemetry_api PROPERTIES EXPORT_NAME 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() +unset(TARGET_DEPS) if(BUILD_TESTING) add_subdirectory(test) @@ -74,18 +59,8 @@ endif() if(WITH_GSL) target_compile_definitions(opentelemetry_api INTERFACE HAVE_GSL) - - # Guidelines Support Library path. Used if we are not on not get C++20. - # - find_package(Microsoft.GSL QUIET) - if(TARGET Microsoft.GSL::GSL) - target_link_libraries(opentelemetry_api INTERFACE Microsoft.GSL::GSL) - list(APPEND TARGET_DEPS "gsl") - else() - set(GSL_DIR third_party/ms-gsl) - target_include_directories( - opentelemetry_api INTERFACE "$") - endif() + target_link_libraries(opentelemetry_api INTERFACE Microsoft.GSL::GSL) + list(APPEND TARGET_DEPS "gsl") endif() if(WITH_NO_GETENV) @@ -140,6 +115,19 @@ if(APPLE) target_link_libraries(opentelemetry_api INTERFACE "-framework CoreFoundation") endif() +otel_add_component( + COMPONENT + api + TARGETS + opentelemetry_api + FILES_DIRECTORY + "include/opentelemetry" + FILES_DESTINATION + "include" + FILES_MATCHING + PATTERN + "*.h") + include(${PROJECT_SOURCE_DIR}/cmake/pkgconfig.cmake) if(OPENTELEMETRY_INSTALL) diff --git a/cmake/benchmark.cmake b/cmake/benchmark.cmake new file mode 100644 index 0000000000..b1a96a1161 --- /dev/null +++ b/cmake/benchmark.cmake @@ -0,0 +1,16 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +otel_add_thirdparty_package( + PACKAGE_NAME "benchmark" + PACKAGE_SEARCH_MODES "CONFIG" + FETCH_GIT_REPOSITORY "https://github.com/google/benchmark.git" + FETCH_GIT_TAG ${benchmark_GIT_TAG} + FETCH_SOURCE_DIR "${PROJECT_SOURCE_DIR}/third_party/benchmark" + FETCH_CMAKE_ARGS + "-DBENCHMARK_ENABLE_TESTING=OFF" + "-DBENCHMARK_ENABLE_INSTALL=${OPENTELEMETRY_INSTALL}" + REQUIRED_TARGETS "benchmark::benchmark" + VERSION_REGEX "project.*\\([^\\)]*VERSION[ \t]*([0-9]+(\\.[0-9]+)*(\\.[0-9]+)*)" + VERSION_FILE "\${benchmark_SOURCE_DIR}/CMakeLists.txt" +) diff --git a/cmake/curl.cmake b/cmake/curl.cmake new file mode 100644 index 0000000000..9a0b524df6 --- /dev/null +++ b/cmake/curl.cmake @@ -0,0 +1,38 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +if(OPENTELEMETRY_INSTALL) + set(_CURL_DISABLE_INSTALL OFF) +else() + set(_CURL_DISABLE_INSTALL ON) +endif() + +otel_add_thirdparty_package( + PACKAGE_NAME "CURL" + PACKAGE_SEARCH_MODES "CONFIG" "MODULE" + FETCH_NAME "curl" + FETCH_GIT_REPOSITORY "https://github.com/curl/curl.git" + FETCH_GIT_TAG "${curl_GIT_TAG}" + FETCH_CMAKE_ARGS + "-DCURL_DISABLE_INSTALL=${_CURL_DISABLE_INSTALL}" + "-DCURL_USE_LIBPSL=OFF" + "-DBUILD_CURL_EXE=OFF" + "-DBUILD_LIBCURL_DOCS=OFF" + "-DBUILD_MISC_DOCS=OFF" + "-DENABLE_CURL_MANUAL=OFF" + "-DBUILD_SHARED_LIBS=ON" + VERSION_REGEX "#define[ \t]+LIBCURL_VERSION[ \t]+\"([0-9]+\\.[0-9]+\\.[0-9]+(-[A-Za-z0-9]+)?)\"" + VERSION_FILE "\${curl_SOURCE_DIR}/include/curl/curlver.h" +) + +if(NOT TARGET CURL::libcurl) + if(TARGET libcurl_shared) + add_library(CURL::libcurl ALIAS libcurl_shared) + elseif(TARGET libcurl_static) + add_library(CURL::libcurl ALIAS libcurl_static) + endif() +endif() + +if(NOT TARGET CURL::libcurl) + message(FATAL_ERROR "CURL::libcurl imported target not found.") +endif() diff --git a/cmake/googletest.cmake b/cmake/googletest.cmake new file mode 100644 index 0000000000..7d4a2eff8b --- /dev/null +++ b/cmake/googletest.cmake @@ -0,0 +1,25 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +otel_add_thirdparty_package( + PACKAGE_NAME "GTest" + PACKAGE_SEARCH_MODES "CONFIG" + FETCH_NAME googletest + FETCH_GIT_REPOSITORY "https://github.com/google/googletest.git" + FETCH_GIT_TAG "${googletest_GIT_TAG}" + FETCH_SOURCE_DIR "${PROJECT_SOURCE_DIR}/third_party/googletest" + FETCH_CMAKE_ARGS + "-DINSTALL_GTEST=${OPENTELEMETRY_INSTALL}" + "-DBUILD_GMOCK=ON" + REQUIRED_TARGETS "GTest::gtest;GTest::gtest_main;GTest::gmock" + VERSION_REGEX "set\\s*\\(\\s*GOOGLETEST_VERSION[ \t]+([0-9]+(\\.[0-9]+)*)([ \t]|\\))" + VERSION_FILE "\${googletest_SOURCE_DIR}/CMakeLists.txt" +) + +if(NOT GTEST_BOTH_LIBRARIES) + set(GTEST_BOTH_LIBRARIES GTest::gtest GTest::gtest_main) +endif() + +if(NOT GMOCK_LIB) + set(GMOCK_LIB GTest::gmock) +endif() diff --git a/cmake/grpc.cmake b/cmake/grpc.cmake new file mode 100644 index 0000000000..eabcd0950b --- /dev/null +++ b/cmake/grpc.cmake @@ -0,0 +1,68 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +# Including the CMakeFindDependencyMacro resolves an error from +# gRPCConfig.cmake on some grpc versions. See +# https://github.com/grpc/grpc/pull/33361 for more details. +include(CMakeFindDependencyMacro) + +otel_add_thirdparty_package( + PACKAGE_NAME "gRPC" + PACKAGE_SEARCH_MODES "CONFIG" + FETCH_NAME "grpc" + FETCH_GIT_REPOSITORY "https://github.com/grpc/grpc.git" + FETCH_GIT_TAG "${grpc_GIT_TAG}" + FETCH_GIT_SUBMODULES + "third_party/re2" + "third_party/abseil-cpp" + "third_party/protobuf" + "third_party/cares/cares" + "third_party/boringssl-with-bazel" + FETCH_CMAKE_ARGS + "-DgRPC_INSTALL=${OPENTELEMETRY_INSTALL}" + "-DgRPC_BUILD_TESTS=OFF" + "-DgRPC_BUILD_GRPC_CPP_PLUGIN=ON" + "-DgRPC_BUILD_GRPC_CSHARP_PLUGIN=OFF" + "-DgRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN=OFF" + "-DgRPC_BUILD_GRPC_PHP_PLUGIN=OFF" + "-DgRPC_BUILD_GRPC_NODE_PLUGIN=OFF" + "-DgRPC_BUILD_GRPC_PYTHON_PLUGIN=OFF" + "-DgRPC_BUILD_GRPC_RUBY_PLUGIN=OFF" + "-DgRPC_BUILD_GRPCPP_OTEL_PLUGIN=OFF" + "-DRE2_BUILD_TESTING=OFF" + "-DgRPC_ZLIB_PROVIDER=package" + "-DgRPC_RE2_PROVIDER=module" + "-DgRPC_PROTOBUF_PROVIDER=module" + "-DgRPC_ABSL_PROVIDER=module" + "-DgRPC_CARES_PROVIDER=module" + VERSION_REGEX "#define[ \t]+GRPC_CPP_VERSION_STRING[ \t]+\"([0-9]+\\.[0-9]+\\.[0-9]+(-[A-Za-z0-9]+)?)\"" + VERSION_FILE "\${grpc_SOURCE_DIR}/include/grpcpp/version_info.h" +) + +if(TARGET grpc++) + set_target_properties(grpc++ PROPERTIES POSITION_INDEPENDENT_CODE ON + CXX_INCLUDE_WHAT_YOU_USE "" CXX_CLANG_TIDY "") +endif() + +if(TARGET grpc++ AND NOT TARGET gRPC::grpc++) + add_library(gRPC::grpc++ ALIAS grpc++) +endif() + +if(TARGET grpc_cpp_plugin AND NOT TARGET gRPC::grpc_cpp_plugin) + add_executable(gRPC::grpc_cpp_plugin ALIAS grpc_cpp_plugin) +endif() + +if(NOT TARGET gRPC::grpc++) + message(FATAL_ERROR "A required gRPC target (grpc++) was not found") +endif() + +if(CMAKE_CROSSCOMPILING) + find_program(gRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) +else() + if(NOT TARGET gRPC::grpc_cpp_plugin) + message(FATAL_ERROR "A required gRPC target (grpc_cpp_plugin) was not found") + endif() + set(gRPC_CPP_PLUGIN_EXECUTABLE "$") +endif() + +message(STATUS "gRPC_CPP_PLUGIN_EXECUTABLE=${gRPC_CPP_PLUGIN_EXECUTABLE}") diff --git a/cmake/ms-gsl.cmake b/cmake/ms-gsl.cmake new file mode 100644 index 0000000000..4bbd7b514b --- /dev/null +++ b/cmake/ms-gsl.cmake @@ -0,0 +1,17 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +otel_add_thirdparty_package( + PACKAGE_NAME "Microsoft.GSL" + PACKAGE_SEARCH_MODES "CONFIG" + FETCH_NAME "gsl" + FETCH_GIT_REPOSITORY "https://github.com/microsoft/GSL.git" + FETCH_GIT_TAG "${ms-gsl_GIT_TAG}" + FETCH_SOURCE_DIR "${PROJECT_SOURCE_DIR}/third_party/ms-gsl" + FETCH_CMAKE_ARGS + "-DGSL_TEST=OFF" + "-DGSL_INSTALL=${OPENTELEMETRY_INSTALL}" + REQUIRED_TARGETS "Microsoft.GSL::GSL" + VERSION_REGEX "project\\([^\\)]*VERSION[ \t]*([0-9]+(\\.[0-9]+)*(\\.[0-9]+)*)" + VERSION_FILE "\${GSL_SOURCE_DIR}/CMakeLists.txt" +) diff --git a/cmake/nlohmann-json.cmake b/cmake/nlohmann-json.cmake index eb952cb81b..e1b3192620 100644 --- a/cmake/nlohmann-json.cmake +++ b/cmake/nlohmann-json.cmake @@ -1,94 +1,17 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 -# -# The dependency on nlohmann_json can be provided different ways. By order of -# decreasing priority, options are: -# -# 1 - Search for a nlohmann_json package -# -# Packages installed on the local machine are used if found. -# -# The nlohmann_json dependency is not installed, as it already is. -# -# 2 - Search for a nlohmann_json git submodule -# -# When git submodule is used, the nlohmann_json code is located in: -# third_party/nlohmann-json -# -# The nlohmann_json dependency is installed, by building the sub directory with -# JSON_Install=ON -# -# 3 - Download nlohmann_json from github -# -# Code from the development branch is used, unless a specific release tag is -# provided in variable ${nlohmann-json} -# -# The nlohmann_json dependency is installed, by building the downloaded code -# with JSON_Install=ON -# - -# nlohmann_json package is required for most SDK build configurations -find_package(nlohmann_json QUIET) -set(nlohmann_json_clone FALSE) -if(nlohmann_json_FOUND) - message(STATUS "nlohmann::json dependency satisfied by: package") -elseif(TARGET nlohmann_json) - message(STATUS "nlohmann::json is already added as a CMake target!") -elseif(EXISTS ${PROJECT_SOURCE_DIR}/.git - AND EXISTS - ${PROJECT_SOURCE_DIR}/third_party/nlohmann-json/CMakeLists.txt) - message(STATUS "nlohmann::json dependency satisfied by: git submodule") - set(JSON_BuildTests - OFF - CACHE INTERNAL "") - set(JSON_Install - ON - CACHE INTERNAL "") - # This option allows to link nlohmann_json::nlohmann_json target - add_subdirectory(${PROJECT_SOURCE_DIR}/third_party/nlohmann-json) - # This option allows to add header to include directories - include_directories( - ${PROJECT_SOURCE_DIR}/third_party/nlohmann-json/single_include) -else() - if("${nlohmann-json}" STREQUAL "") - set(nlohmann-json "develop") - endif() - message(STATUS "nlohmann::json dependency satisfied by: github download") - set(nlohmann_json_clone TRUE) - include(ExternalProject) - ExternalProject_Add( - nlohmann_json_download - PREFIX third_party - GIT_REPOSITORY https://github.com/nlohmann/json.git - GIT_TAG "${nlohmann-json}" - UPDATE_COMMAND "" - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} - -DJSON_BuildTests=OFF -DJSON_Install=ON - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - TEST_AFTER_INSTALL 0 - DOWNLOAD_NO_PROGRESS 1 - LOG_CONFIGURE 1 - LOG_BUILD 1 - LOG_INSTALL 1) - - ExternalProject_Get_Property(nlohmann_json_download INSTALL_DIR) - set(NLOHMANN_JSON_INCLUDE_DIR - ${INSTALL_DIR}/src/nlohmann_json_download/single_include) - add_library(nlohmann_json_ INTERFACE) - target_include_directories( - nlohmann_json_ INTERFACE "$" - "$") - add_dependencies(nlohmann_json_ nlohmann_json_download) - add_library(nlohmann_json::nlohmann_json ALIAS nlohmann_json_) - - if(OPENTELEMETRY_INSTALL) - install( - TARGETS nlohmann_json_ - EXPORT "${PROJECT_NAME}-third_party_nlohmann_json_target" - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - COMPONENT third_party_nlohmann_json) - endif() -endif() +otel_add_thirdparty_package( + PACKAGE_NAME "nlohmann_json" + PACKAGE_SEARCH_MODES "CONFIG" + FETCH_GIT_REPOSITORY "https://github.com/nlohmann/json.git" + FETCH_GIT_TAG "${nlohmann-json_GIT_TAG}" + FETCH_SOURCE_DIR "${PROJECT_SOURCE_DIR}/third_party/nlohmann-json" + FETCH_CMAKE_ARGS + "-DJSON_BuildTests=OFF" + "-DJSON_Install=${OPENTELEMETRY_INSTALL}" + "-DJSON_MultipleHeaders=OFF" + REQUIRED_TARGETS "nlohmann_json::nlohmann_json" + VERSION_REGEX "project\\([^\\)]*VERSION[ \t]*([0-9]+(\\.[0-9]+)*(\\.[0-9]+)*)" + VERSION_FILE "\${nlohmann_json_SOURCE_DIR}/CMakeLists.txt" +) diff --git a/cmake/opentelemetry-proto.cmake b/cmake/opentelemetry-proto.cmake index 60b3472845..f7ccdd128d 100644 --- a/cmake/opentelemetry-proto.cmake +++ b/cmake/opentelemetry-proto.cmake @@ -20,9 +20,14 @@ # 3 - Download opentelemetry-proto from github # # Code from the required version is used, unless a specific release tag is -# provided in variable ${opentelemetry-proto} +# provided in variable ${opentelemetry-proto_GIT_TAG} # +if(DEFINED ENV{OTELCPP_PROTO_PATH}) + set(OTELCPP_PROTO_PATH "$ENV{OTELCPP_PROTO_PATH}") + message(STATUS "Using OTELCPP_PROTO_PATH from environment variable: ${OTELCPP_PROTO_PATH}") +endif() + if(OTELCPP_PROTO_PATH) if(NOT EXISTS "${OTELCPP_PROTO_PATH}/opentelemetry/proto/common/v1/common.proto") @@ -30,47 +35,48 @@ if(OTELCPP_PROTO_PATH) FATAL_ERROR "OTELCPP_PROTO_PATH does not point to a opentelemetry-proto repository") endif() - message(STATUS "opentelemetry-proto dependency satisfied by: external path") set(PROTO_PATH ${OTELCPP_PROTO_PATH}) - set(needs_proto_download FALSE) -else() - if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/third_party/opentelemetry-proto/.git) - message(STATUS "opentelemetry-proto dependency satisfied by: git submodule") + message(STATUS "opentelemetry-proto dependency satisfied by OTELCPP_PROTO_PATH: ${PROTO_PATH}") +elseif(EXISTS "${PROJECT_SOURCE_DIR}/third_party/opentelemetry-proto/.git") set(PROTO_PATH - "${CMAKE_CURRENT_SOURCE_DIR}/third_party/opentelemetry-proto") - set(needs_proto_download FALSE) - else() - message( - STATUS "opentelemetry-proto dependency satisfied by: github download") - if("${opentelemetry-proto}" STREQUAL "") - file(READ "${CMAKE_CURRENT_LIST_DIR}/../third_party_release" - OTELCPP_THIRD_PARTY_RELEASE_CONTENT) - if(OTELCPP_THIRD_PARTY_RELEASE_CONTENT MATCHES - "opentelemetry-proto=[ \\t]*([A-Za-z0-9_\\.\\-]+)") - set(opentelemetry-proto "${CMAKE_MATCH_1}") - else() - set(opentelemetry-proto "v1.6.0") - endif() - unset(OTELCPP_THIRD_PARTY_RELEASE_CONTENT) - endif() - include(ExternalProject) - ExternalProject_Add( - opentelemetry-proto - GIT_REPOSITORY https://github.com/open-telemetry/opentelemetry-proto.git - GIT_TAG "${opentelemetry-proto}" - UPDATE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - CONFIGURE_COMMAND "" - TEST_AFTER_INSTALL 0 - DOWNLOAD_NO_PROGRESS 1 - LOG_CONFIGURE 1 - LOG_BUILD 1 - LOG_INSTALL 1) - ExternalProject_Get_Property(opentelemetry-proto INSTALL_DIR) - set(PROTO_PATH "${INSTALL_DIR}/src/opentelemetry-proto") - set(needs_proto_download TRUE) - endif() + "${PROJECT_SOURCE_DIR}/third_party/opentelemetry-proto") + message(STATUS "opentelemetry-proto dependency satisfied by git submodule: ${PROTO_PATH}") +endif() + +otel_add_thirdparty_package( + PACKAGE_NAME "opentelemetry-proto" + FETCH_GIT_REPOSITORY "https://github.com/open-telemetry/opentelemetry-proto.git" + FETCH_GIT_TAG "${opentelemetry-proto_GIT_TAG}" + FETCH_SOURCE_DIR "${PROTO_PATH}" + ALWAYS_FETCH + ) + +# If fetching from github then we need to set the proto path to the source directory +# Get the path from the property set by otel_add_thirdparty_package +if(NOT DEFINED PROTO_PATH) + get_property( + PROTO_PATH + DIRECTORY ${PROJECT_SOURCE_DIR} + PROPERTY OTEL_opentelemetry-proto_SOURCE_DIR) +endif() + +if(NOT DEFINED PROTO_PATH) + message(FATAL_ERROR "opentelemetry-proto source directory not found") +endif() + +# opentelemetry-proto's version will be found from the actual git tag used. +find_package(Git QUIET) +if(Git_FOUND) + execute_process( + COMMAND ${GIT_EXECUTABLE} describe --tags HEAD + WORKING_DIRECTORY "${PROTO_PATH}" + OUTPUT_VARIABLE "opentelemetry-proto_TAG_FOUND" + OUTPUT_STRIP_TRAILING_WHITESPACE) + message(STATUS "opentelemetry-proto_TAG_FOUND=${opentelemetry-proto_TAG_FOUND}") + string(REGEX REPLACE "^v" "" opentelemetry-proto_VERSION "${opentelemetry-proto_TAG_FOUND}") + set_property( + DIRECTORY ${PROJECT_SOURCE_DIR} + PROPERTY OTEL_opentelemetry-proto_VERSION "${opentelemetry-proto_VERSION}") endif() set(COMMON_PROTO "${PROTO_PATH}/opentelemetry/proto/common/v1/common.proto") @@ -197,20 +203,6 @@ foreach(IMPORT_DIR ${PROTOBUF_IMPORT_DIRS}) list(APPEND PROTOBUF_INCLUDE_FLAGS "-I${IMPORT_DIR}") endforeach() -if(WITH_OTLP_GRPC) - if(CMAKE_CROSSCOMPILING) - find_program(gRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) - else() - if(TARGET gRPC::grpc_cpp_plugin) - project_build_tools_get_imported_location(gRPC_CPP_PLUGIN_EXECUTABLE - gRPC::grpc_cpp_plugin) - else() - find_program(gRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) - endif() - endif() - message(STATUS "gRPC_CPP_PLUGIN_EXECUTABLE=${gRPC_CPP_PLUGIN_EXECUTABLE}") -endif() - set(PROTOBUF_COMMON_FLAGS "--proto_path=${PROTO_PATH}" "--cpp_out=${GENERATED_PROTOBUF_PATH}") # --experimental_allow_proto3_optional is available from 3.13 and be stable and @@ -243,7 +235,11 @@ set(PROTOBUF_GENERATED_FILES ${PROFILES_SERVICE_PB_H_FILE} ${PROFILES_SERVICE_PB_CPP_FILE}) + +set(PROTOBUF_GENERATE_DEPENDS ${PROTOBUF_PROTOC_EXECUTABLE}) + if(WITH_OTLP_GRPC) + list(APPEND PROTOBUF_GENERATE_DEPENDS ${gRPC_CPP_PLUGIN_EXECUTABLE}) list(APPEND PROTOBUF_COMMON_FLAGS "--grpc_out=generate_mock_code=true:${GENERATED_PROTOBUF_PATH}" --plugin=protoc-gen-grpc="${gRPC_CPP_PLUGIN_EXECUTABLE}") @@ -288,7 +284,7 @@ add_custom_command( ${LOGS_PROTO} ${METRICS_PROTO} ${TRACE_SERVICE_PROTO} ${LOGS_SERVICE_PROTO} ${METRICS_SERVICE_PROTO} ${PROFILES_PROTO} ${PROFILES_SERVICE_PROTO} COMMENT "[Run]: ${PROTOBUF_RUN_PROTOC_COMMAND}" - DEPENDS ${PROTOBUF_PROTOC_EXECUTABLE}) + DEPENDS ${PROTOBUF_GENERATE_DEPENDS}) unset(OTELCPP_PROTO_TARGET_OPTIONS) if(CMAKE_SYSTEM_NAME MATCHES "Windows|MinGW|WindowsStore") @@ -318,9 +314,9 @@ target_include_directories( PUBLIC "$" "$") -# Disable include-what-you-use on generated code. -set_target_properties(opentelemetry_proto PROPERTIES CXX_INCLUDE_WHAT_YOU_USE - "") +# 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 "") if(NOT Protobuf_INCLUDE_DIRS AND TARGET protobuf::libprotobuf) get_target_property(Protobuf_INCLUDE_DIRS protobuf::libprotobuf INTERFACE_INCLUDE_DIRECTORIES) @@ -338,9 +334,9 @@ if(WITH_OTLP_GRPC) ${LOGS_SERVICE_GRPC_PB_CPP_FILE} ${METRICS_SERVICE_GRPC_PB_CPP_FILE}) set_target_version(opentelemetry_proto_grpc) - # Disable include-what-you-use on generated code. + # Disable include-what-you-use and clang-tidy on generated code. set_target_properties(opentelemetry_proto_grpc - PROPERTIES CXX_INCLUDE_WHAT_YOU_USE "") + 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) @@ -361,9 +357,6 @@ if(WITH_OTLP_GRPC) endif() endif() -if(needs_proto_download) - add_dependencies(opentelemetry_proto opentelemetry-proto) -endif() set_target_properties(opentelemetry_proto PROPERTIES EXPORT_NAME proto) patch_protobuf_targets(opentelemetry_proto) diff --git a/cmake/opentracing-cpp.cmake b/cmake/opentracing-cpp.cmake new file mode 100644 index 0000000000..64ced7edff --- /dev/null +++ b/cmake/opentracing-cpp.cmake @@ -0,0 +1,43 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +otel_add_thirdparty_package( + PACKAGE_NAME "OpenTracing" + PACKAGE_SEARCH_MODES "CONFIG" + FETCH_NAME "opentracing" + FETCH_GIT_REPOSITORY "https://github.com/opentracing/opentracing-cpp.git" + FETCH_GIT_TAG "${opentracing-cpp_GIT_TAG}" + FETCH_SOURCE_DIR "${PROJECT_SOURCE_DIR}/third_party/opentracing-cpp" + FETCH_CMAKE_ARGS + "-DBUILD_TESTING=OFF" + VERSION_REGEX "#define[ \t]+OPENTRACING_VERSION[ \t]+\"([0-9]+(\\.[0-9]+)*)\"" + VERSION_FILE "\${opentracing_BINARY_DIR}/include/opentracing/version.h" +) + +function(_patch_opentracing_targets) + get_property(_OpenTracing_SOURCE_DIR DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_OpenTracing_SOURCE_DIR) + get_property(_OpenTracing_BINARY_DIR DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_OpenTracing_BINARY_DIR) + foreach(_target opentracing opentracing-static) + if(TARGET ${_target}) + # Add missing include directories + target_include_directories(${_target} PUBLIC + "$" + "$" + "$" + ) + # Disable CXX_INCLUDE_WHAT_YOU_USE and CXX_CLANG_TIDY + set_target_properties(${_target} + PROPERTIES CXX_INCLUDE_WHAT_YOU_USE "" CXX_CLANG_TIDY "") + # Create alias targets + if(NOT TARGET OpenTracing::${_target}) + add_library(OpenTracing::${_target} ALIAS ${_target}) + endif() + endif() + endforeach() +endfunction() + +_patch_opentracing_targets() + +if(NOT TARGET OpenTracing::opentracing AND NOT TARGET OpenTracing::opentracing-static) + message(FATAL_ERROR "No OpenTracing targets (OpenTracing::opentracing or OpenTracing::opentracing-static) were imported") +endif() diff --git a/cmake/otel-install-functions.cmake b/cmake/otel-install-functions.cmake index 8d72c12ce5..80b604cb8c 100644 --- a/cmake/otel-install-functions.cmake +++ b/cmake/otel-install-functions.cmake @@ -1,6 +1,14 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 -include("${PROJECT_SOURCE_DIR}/cmake/thirdparty-dependency-config.cmake") + +include(GNUInstallDirs) +include(FetchContent) + + +# Initialize properties used below +set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENTS_LIST "") +set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_THIRDPARTY_AVAILABLE_LIST "") +set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_THIRDPARTY_USED_LIST "") ######################################################################## # INTERNAL FUNCTIONS - do not call directly. Use the otel_* "Main" functions @@ -30,8 +38,7 @@ function(_otel_set_component_properties) 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_property(DIRECTORY ${PROJECT_SOURCE_DIR} APPEND PROPERTY OTEL_COMPONENTS_LIST "${_PROPERTIES_COMPONENT}") # Set the component targets property if(_PROPERTIES_TARGETS) @@ -63,8 +70,9 @@ function(_otel_set_component_properties) set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_DEPENDS_${_PROPERTIES_COMPONENT} "${_PROPERTIES_COMPONENT_DEPENDS}") endif() - if(_PROPERTIES_THIRDPARTY_DEPENDS) + if(DEFINED _PROPERTIES_THIRDPARTY_DEPENDS) set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_THIRDPARTY_DEPENDS_${_PROPERTIES_COMPONENT} "${_PROPERTIES_THIRDPARTY_DEPENDS}") + set_property(DIRECTORY ${PROJECT_SOURCE_DIR} APPEND PROPERTY OTEL_THIRDPARTY_USED_LIST "${_PROPERTIES_THIRDPARTY_DEPENDS}") endif() endfunction() @@ -121,20 +129,19 @@ 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. +# If found the thirdparty package name is appended to the OUT_THIRDPARTY_DEPS variable. +# The match is based on the OTEL_THIRDPARTY_AVAILABLE_LIST and +# OTEL__NAMESPACE properties. #------------------------------------------------------------------------ function(_otel_append_thirdparty_found _TARGET OUT_THIRDPARTY_DEPS) + get_property(_DEPENDENCIES_LIST DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_THIRDPARTY_AVAILABLE_LIST) 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}") + foreach(_DEPENDENCY ${_DEPENDENCIES_LIST}) + get_property(_DEPENDENCY_NAMESPACE DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_${_DEPENDENCY}_NAMESPACE) + if(NOT DEFINED _DEPENDENCY_NAMESPACE) + message(FATAL_ERROR " OTEL_${_DEPENDENCY}_NAMESPACE property is not defined for ${_DEPENDENCY}.") endif() + # Search for the dependency namespace in the target name string(FIND "${_TARGET}" "${_DEPENDENCY_NAMESPACE}" _is_thirdparty) if(_is_thirdparty GREATER -1) message(DEBUG " - adding thirdparty dependency ${_DEPENDENCY} from target ${_TARGET}") @@ -308,13 +315,299 @@ function(_otel_populate_component_thirdparty_depends_block IN_COMPONENT COMPONEN string(APPEND _deps_block ")\n\n") set(${COMPONENTS_THIRDPARTY_DEPENDENCIES_BLOCK} "${_deps_block}" PARENT_SCOPE) endfunction() + +#----------------------------------------------------------------------- +function(_otel_save_cache_variables IN_VARIABLES) + foreach (_variable IN LISTS ${IN_VARIABLES}) + # Save the variable to the project source directory property + if(DEFINED CACHE{${_variable}}) + set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_SAVED_VAR_${_variable} "${${_variable}}") + message(STATUS " Saved variable ${_variable} to cache: ${${_variable}}") + endif() + endforeach() +endfunction() + +#----------------------------------------------------------------------- +function(_otel_restore_cache_variables IN_VARIABLES) + foreach (_variable IN LISTS ${IN_VARIABLES}) + # Restore the variable from the cache + get_property(_saved_variable DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_SAVED_VAR_${_variable}) + if(DEFINED _saved_variable) + set(${_variable} "${_saved_variable}" CACHE STRING "" FORCE) + message(STATUS " Restored variable ${_variable} to cache: ${_saved_variable}") + elseif(DEFINED CACHE{${_variable}}) + unset(${_variable} CACHE) + message(STATUS " Restored variable ${_variable} to unset in cache") + endif() + endforeach() +endfunction() + +#----------------------------------------------------------------------- +# _otel_find_package +# Finds a third-party package using the provided search modes. +# Arguments: (from the scope of otel_add_thirdparty_package) +# _THIRDPARTY_PACKAGE_NAME: The name of the package to find +# _THIRDPARTY_PACKAGE_SEARCH_MODES: The search modes to use for finding the package (e.g., "MODULE", "CONFIG") +# Sets output variables at the PARENT_SCOPE: +# Sets the _FOUND variable to TRUE if the package is found and FALSE if not. +# Sets the _VERSION variable to the version of the package found. +# Sets the _SEARCH_MODE_SELECTED variable to the search mode used to find the package. +# Sets the _PROVIDER variable to "package" if the package is found. +function(_otel_find_package) + + foreach(_SEARCH_MODE IN LISTS _THIRDPARTY_PACKAGE_SEARCH_MODES) + message(STATUS " Searching for ${_THIRDPARTY_PACKAGE_NAME} with search mode ${_SEARCH_MODE}") + find_package(${_THIRDPARTY_PACKAGE_NAME} ${_SEARCH_MODE} QUIET) + if(${_THIRDPARTY_PACKAGE_NAME}_FOUND) + set("${_THIRDPARTY_PACKAGE_NAME}_SEARCH_MODE_SELECTED" ${_SEARCH_MODE} PARENT_SCOPE) + break() + endif() + endforeach() + + if(${_THIRDPARTY_PACKAGE_NAME}_FOUND) + # Set _VERSION from _VERSION_STRING for legacy support (See FindCURL and FindZLIB CMake modules) + if(DEFINED ${_THIRDPARTY_PACKAGE_NAME}_VERSION_STRING AND NOT DEFINED ${_THIRDPARTY_PACKAGE_NAME}_VERSION) + set("${_THIRDPARTY_PACKAGE_NAME}_VERSION" "${${_THIRDPARTY_PACKAGE_NAME}_VERSION_STRING}") + endif() + set("${_THIRDPARTY_PACKAGE_NAME}_VERSION" ${${_THIRDPARTY_PACKAGE_NAME}_VERSION} PARENT_SCOPE) + + set("${_THIRDPARTY_PACKAGE_NAME}_PROVIDER" "package" PARENT_SCOPE) + endif() + + set("${_THIRDPARTY_PACKAGE_NAME}_FOUND" ${${_THIRDPARTY_PACKAGE_NAME}_FOUND} PARENT_SCOPE) +endfunction() + #----------------------------------------------------------------------- +# _otel_fetch_content +# Use FetchContent to make a package available +# Arguments: (from the scope of otel_add_thirdparty_package and prefixed with _THIRDPARTY_) +# _THIRDPARTY_PACKAGE_NAME: The name of the package to fetch +# _THIRDPARTY_FETCH_NAME: The name of the package to fetch +# _THIRDPARTY_FETCH_SOURCE_DIR: The directory to fetch the package into +# _THIRDPARTY_FETCH_GIT_REPOSITORY: The git repository URL to fetch the package from +# _THIRDPARTY_FETCH_GIT_TAG: The git tag to checkout +# _THIRDPARTY_FETCH_CMAKE_ARGS: The cmake arguments used to build the package. These are force cached variables. Be careful as they override any existing values and persist. +# Sets output variables at the PARENT_SCOPE: +# _SOURCE_DIR variable to the source directory of the fetched package. +# _BINARY_DIR variable to the binary directory of the fetched package. +# _POPULATED variable to TRUE if the package is populated, FALSE otherwise. +function(_otel_fetch_content) + + if(DEFINED _THIRDPARTY_FETCH_SOURCE_DIR AND EXISTS "${_THIRDPARTY_FETCH_SOURCE_DIR}/.git") + message(STATUS " FetchContent_Declare ${_THIRDPARTY_FETCH_PACKAGE_NAME} from local source at ${_THIRDPARTY_FETCH_SOURCE_DIR}") + FetchContent_Declare( + ${_THIRDPARTY_FETCH_NAME} + SOURCE_DIR ${_THIRDPARTY_FETCH_SOURCE_DIR} + ) + set("${_THIRDPARTY_PACKAGE_NAME}_PROVIDER" "fetch_source" PARENT_SCOPE) + elseif( DEFINED _THIRDPARTY_FETCH_GIT_REPOSITORY AND DEFINED _THIRDPARTY_FETCH_GIT_TAG) + message(STATUS " FetchContent_Declare ${_THIRDPARTY_PACKAGE_NAME} from ${_THIRDPARTY_FETCH_GIT_REPOSITORY} at tag ${_THIRDPARTY_FETCH_GIT_TAG}") + FetchContent_Declare( + ${_THIRDPARTY_FETCH_NAME} + GIT_REPOSITORY + ${_THIRDPARTY_FETCH_GIT_REPOSITORY} + GIT_TAG + ${_THIRDPARTY_FETCH_GIT_TAG} + GIT_SHALLOW ON + GIT_SUBMODULES ${_THIRDPARTY_FETCH_GIT_SUBMODULES} + ) + set("${_THIRDPARTY_PACKAGE_NAME}_PROVIDER" "fetch_repository" PARENT_SCOPE) + else() + message(FATAL_ERROR "No valid source found for ${_THIRDPARTY_PACKAGE_NAME}") + endif() + + # CMake project options must be set in the cache before FetchContent_MakeAvailable is called. + # Save the previous cache values we don't want to override for the opentelemetry-cpp project build + # so they can be restored after the third-party package is configured. + set(_OTEL_CACHE_VARIABLES_TO_SAVE + BUILD_SHARED_LIBS + BUILD_TESTING + ENABLE_TESTING + CMAKE_CXX_CLANG_TIDY + CMAKE_CXX_INCLUDE_WHAT_YOU_USE) + + _otel_save_cache_variables(_OTEL_CACHE_VARIABLES_TO_SAVE) + + FetchContent_GetProperties(${_THIRDPARTY_FETCH_NAME}) + if(NOT ${_THIRDPARTY_FETCH_NAME}_POPULATED) + # The package has not been populated yet and will build in-tree. + # We need to force cache cmake arguments to configure the package. + + # Disable clang tidy and include-what-you-use for the third-party package + set(CMAKE_CXX_CLANG_TIDY "" CACHE STRING "" FORCE) + set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE "" CACHE STRING "" FORCE) + + # Set the CMake cache variables (KEY=VALUE) for the third party package + foreach(_arg IN LISTS _THIRDPARTY_FETCH_CMAKE_ARGS) + if(_arg MATCHES "^-D([^=]+)=(.*)$") + set(_key "${CMAKE_MATCH_1}") + set(_value "${CMAKE_MATCH_2}") + message(DEBUG " Setting ${_key}=${_value}") + set(${_key} "${_value}" CACHE STRING "" FORCE) + else() + message(WARNING " ignoring malformed CMAKE_ARG: ${_arg}") + endif() + endforeach() + endif() + + FetchContent_MakeAvailable(${_THIRDPARTY_FETCH_NAME}) + _otel_restore_cache_variables(_OTEL_CACHE_VARIABLES_TO_SAVE) + + set("${_THIRDPARTY_FETCH_NAME}_SOURCE_DIR" ${${_THIRDPARTY_FETCH_NAME}_SOURCE_DIR} PARENT_SCOPE) + set("${_THIRDPARTY_FETCH_NAME}_BINARY_DIR" ${${_THIRDPARTY_FETCH_NAME}_BINARY_DIR} PARENT_SCOPE) + set("${_THIRDPARTY_FETCH_NAME}_POPULATED" ${${_THIRDPARTY_FETCH_NAME}_POPULATED} PARENT_SCOPE) +endfunction() ######################################################################## # Main functions to support installing components # and the opentlemetry-cpp cmake package config files ######################################################################## +#------------------------------------------------------------------------------- +# otel_add_thirdparty_package +# Add a third party package to the project using CMake's find_package or FetchContent. +# By default the dependencies are found/fetched in the following order: +# Step 1. Search for installed packages by calling find_package using the provided search modes. +# Step 2. Use FetchContent on the provided source directory (used for git submodules) +# Step 3. Use FetchContent to fetch the package from a git repository if not found in the previous steps. +# Arguments: +# PACKAGE_NAME: The name of the package to find or fetch +# PACKAGE_NAMESPACE: The package install namespace. Defaults to PACKAGE_NAME. +# PACKAGE_SEARCH_MODES: The cmake find_package search modes. Multiple search modes can be provided +# (ie: SEARCH_MODES "MODULE" "CONFIG" will search first using the MODULE mode, then CONFIG mode). +# FETCH_NAME: The name of the package to fetch if not found +# FETCH_SOURCE_DIR: The directory to fetch the package into +# FETCH_GIT_REPOSITORY: The git repository URL to fetch the package from +# FETCH_GIT_TAG: The git tag to checkout +# FETCH_CMAKE_ARGS: The cmake arguments used to build the package. These are force cached variables. Be careful as they override any existing values and persist. +# REQUIRED_TARGETS: The targets to check for existence +# VERSION_REGEX: The regex to parse the package version if fetched from source or git repository. +# VERSION_FILE: The file to read the version from when using VERSION_REGEX. + +# PROJECT_SOURCE_DIR directory properties set: +# OTEL_THIRDPARTY_AVAILABLE_LIST: List of third-party packages available in the project +# OTEL__NAMESPACE: The package's install namespace +# OTEL__VERSION: The version of the package found or fetched +# OTEL__PROVIDER: The provider of the package (package, fetch_source, fetch_repository) +# OTEL__SEARCH_MODE: The search mode used to find the package +# OTEL__SOURCE_DIR: Set if the package was fetched +# OTEL__BINARY_DIR: Set if the package was fetched +# OTEL__POPULATED: Set if the package was populated by FetchContent +function(otel_add_thirdparty_package) + + set(optionArgs ALWAYS_FETCH ALWAYS_FIND DO_NOT_FETCH DO_NOT_FIND) + set(oneValueArgs PACKAGE_NAME PACKAGE_NAMESPACE FETCH_NAME FETCH_GIT_REPOSITORY FETCH_GIT_TAG FETCH_SOURCE_DIR VERSION_REGEX VERSION_FILE) + set(multiValueArgs PACKAGE_SEARCH_MODES FETCH_GIT_SUBMODULES FETCH_CMAKE_ARGS REQUIRED_TARGETS ) + cmake_parse_arguments(_THIRDPARTY "${optionArgs}" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}") + + if(NOT _THIRDPARTY_PACKAGE_NAME) + message(FATAL_ERROR "PACKAGE_NAME is required") + endif() + + if(DEFINED _THIRDPARTY_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Unparsed arguments detected: ${_THIRDPARTY_UNPARSED_ARGUMENTS}") + endif() + + if(NOT DEFINED _THIRDPARTY_PACKAGE_NAMESPACE) + set(_THIRDPARTY_PACKAGE_NAMESPACE "${_THIRDPARTY_PACKAGE_NAME}") + endif() + + if(DEFINED _THIRDPARTY_PACKAGE_SEARCH_MODES) + list(GET _THIRDPARTY_PACKAGE_SEARCH_MODES 0 "${_THIRDPARTY_PACKAGE_NAME}_SEARCH_MODE_SELECTED") + endif() + + if(NOT _THIRDPARTY_FETCH_NAME) + set(_THIRDPARTY_FETCH_NAME ${_THIRDPARTY_PACKAGE_NAME}) + endif() + + if(DEFINED _THIRDPARTY_FETCH_GIT_REPOSITORY AND NOT _THIRDPARTY_FETCH_GIT_TAG) + message(FATAL_ERROR "FETCH_GIT_TAG is required if FETCH_GIT_REPOSITORY is defined") + endif() + + set(_FETCH_SUPPORTED FALSE) + if((DEFINED _THIRDPARTY_FETCH_SOURCE_DIR OR DEFINED _THIRDPARTY_FETCH_GIT_REPOSITORY) AND NOT _THIRDPARTY_DO_NOT_FETCH) + set(_FETCH_SUPPORTED TRUE) + endif() + + set(_FIND_SUPPORTED FALSE) + if(DEFINED _THIRDPARTY_PACKAGE_SEARCH_MODES AND NOT _THIRDPARTY_DO_NOT_FIND) + set(_FIND_SUPPORTED TRUE) + endif() + + set(_FIND_ALLOWED FALSE) + if(NOT OTELCPP_THIRDPARTY_FETCH_CONTENT_ONLY OR _THIRDPARTY_ALWAYS_FIND) + set(_FIND_ALLOWED TRUE) + endif() + + set(_FETCH_ALLOWED FALSE) + if(NOT OTELCPP_THIRDPARTY_FIND_PACKAGE_ONLY OR _THIRDPARTY_ALWAYS_FETCH) + set(_FETCH_ALLOWED TRUE) + endif() + + message(STATUS "Adding third party package ${_THIRDPARTY_PACKAGE_NAME}") + message(DEBUG " Search modes: ${_THIRDPARTY_PACKAGE_SEARCH_MODES}") + message(DEBUG " Fetch name: ${_THIRDPARTY_FETCH_NAME}") + message(DEBUG " Source dir: ${_THIRDPARTY_FETCH_SOURCE_DIR}") + message(DEBUG " Git repository: ${_THIRDPARTY_FETCH_GIT_REPOSITORY}") + message(DEBUG " Git tag: ${_THIRDPARTY_FETCH_GIT_TAG}") + message(DEBUG " Git submodules: ${_THIRDPARTY_FETCH_GIT_SUBMODULES}") + message(DEBUG " CMake args: ${_THIRDPARTY_FETCH_CMAKE_ARGS}") + message(DEBUG " Required targets: ${_THIRDPARTY_REQUIRED_TARGETS}") + message(DEBUG " Version regex: ${_THIRDPARTY_VERSION_REGEX}") + message(DEBUG " Version file: ${_THIRDPARTY_VERSION_FILE}") + + if(_FIND_SUPPORTED AND _FIND_ALLOWED) + _otel_find_package() + endif() + + if(NOT ${_THIRDPARTY_PACKAGE_NAME}_FOUND AND _FETCH_SUPPORTED AND _FETCH_ALLOWED) + _otel_fetch_content() + endif() + + # Check for required targets + foreach(_target ${_THIRDPARTY_REQUIRED_TARGETS}) + if(NOT TARGET ${_target}) + message(FATAL_ERROR "Required target ${_target} not found") + endif() + endforeach() + + # Determine the package version if not already defined + if(NOT DEFINED ${_THIRDPARTY_PACKAGE_NAME}_VERSION) + if(${_THIRDPARTY_PACKAGE_NAME}_PROVIDER STREQUAL "package") + set("${_THIRDPARTY_PACKAGE_NAME}_VERSION" "unknown") + elseif(DEFINED _THIRDPARTY_VERSION_REGEX AND DEFINED _THIRDPARTY_VERSION_FILE) + string(CONFIGURE "${_THIRDPARTY_VERSION_FILE}" _CONFIGURED_VERSION_FILEPATH) + if(NOT EXISTS "${_CONFIGURED_VERSION_FILEPATH}") + message(WARNING "Version file ${_CONFIGURED_VERSION_FILEPATH} does not exist") + else() + file(READ "${_CONFIGURED_VERSION_FILEPATH}" _VERSION_FILE_CONTENTS) + if(_VERSION_FILE_CONTENTS MATCHES ${_THIRDPARTY_VERSION_REGEX}) + set("${_THIRDPARTY_PACKAGE_NAME}_VERSION" "${CMAKE_MATCH_1}") + else() + message(WARNING "Failed to parse version from ${_THIRDPARTY_VERSION_FILE} using regex ${_THIRDPARTY_VERSION_REGEX}") + endif() + endif() + endif() + endif() + + message(STATUS " ${_THIRDPARTY_PACKAGE_NAME} version: ${${_THIRDPARTY_PACKAGE_NAME}_VERSION}") + message(STATUS " ${_THIRDPARTY_PACKAGE_NAME} provider: ${${_THIRDPARTY_PACKAGE_NAME}_PROVIDER}") + + set_property(DIRECTORY ${PROJECT_SOURCE_DIR} APPEND PROPERTY "OTEL_THIRDPARTY_AVAILABLE_LIST" "${_THIRDPARTY_PACKAGE_NAME}") + set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY "OTEL_${_THIRDPARTY_PACKAGE_NAME}_VERSION" "${${_THIRDPARTY_PACKAGE_NAME}_VERSION}") + set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY "OTEL_${_THIRDPARTY_PACKAGE_NAME}_PROVIDER" "${${_THIRDPARTY_PACKAGE_NAME}_PROVIDER}") + set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY "OTEL_${_THIRDPARTY_PACKAGE_NAME}_NAMESPACE" "${_THIRDPARTY_PACKAGE_NAMESPACE}") + if(DEFINED "${_THIRDPARTY_PACKAGE_NAME}_SEARCH_MODE_SELECTED") + set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY "OTEL_${_THIRDPARTY_PACKAGE_NAME}_SEARCH_MODE" "${${_THIRDPARTY_PACKAGE_NAME}_SEARCH_MODE_SELECTED}") + endif() + + if(NOT ${_THIRDPARTY_PACKAGE_NAME}_PROVIDER STREQUAL "package") + set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY "OTEL_${_THIRDPARTY_PACKAGE_NAME}_SOURCE_DIR" "${${_THIRDPARTY_FETCH_NAME}_SOURCE_DIR}") + set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY "OTEL_${_THIRDPARTY_PACKAGE_NAME}_BINARY_DIR" "${${_THIRDPARTY_FETCH_NAME}_BINARY_DIR}") + set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY "OTEL_${_THIRDPARTY_PACKAGE_NAME}_POPULATED" "${${_THIRDPARTY_FETCH_NAME}_POPULATED}") + endif() +endfunction() + #----------------------------------------------------------------------- # otel_add_component: # Adds a component to the list of components to be installed. A component name and list of targest are required. @@ -447,17 +740,22 @@ function(otel_install_thirdparty_definitions) set(OTEL_THIRDPARTY_DEPENDENCY_VERSIONS_BLOCK "") set(OTEL_THIRDPARTY_DEPENDENCY_SEARCH_MODES_BLOCK "") + get_property(OTEL_THIRDPARTY_DEPENDENCIES_SUPPORTED DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_THIRDPARTY_USED_LIST) + list(REMOVE_DUPLICATES OTEL_THIRDPARTY_DEPENDENCIES_SUPPORTED) + # Populate OTEL_THIRDPARTY_DEPENDENCY_VERSIONS_BLOCK - foreach(_DEPENDENCY ${OTEL_THIRDPARTY_DEPENDENCIES_SUPPORTED}) + foreach(_DEPENDENCY IN LISTS OTEL_THIRDPARTY_DEPENDENCIES_SUPPORTED) + get_property(_dependency_VERSION DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_${_DEPENDENCY}_VERSION) string(APPEND OTEL_THIRDPARTY_DEPENDENCY_VERSIONS_BLOCK - "set(OTEL_${_DEPENDENCY}_VERSION \"${${_DEPENDENCY}_VERSION}\")\n" + "set(OTEL_${_DEPENDENCY}_VERSION \"${_dependency_VERSION}\")\n" ) endforeach() # Populate OTEL_THIRDPARTY_DEPENDENCY_SEARCH_MODES_BLOCK - foreach(_DEPENDENCY ${OTEL_THIRDPARTY_DEPENDENCIES_SUPPORTED}) + foreach(_DEPENDENCY IN LISTS OTEL_THIRDPARTY_DEPENDENCIES_SUPPORTED) + get_property(_dependency_SEARCH_MODE DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_${_DEPENDENCY}_SEARCH_MODE) string(APPEND OTEL_THIRDPARTY_DEPENDENCY_SEARCH_MODES_BLOCK - "set(OTEL_${_DEPENDENCY}_SEARCH_MODE \"${OTEL_${_DEPENDENCY}_SEARCH_MODE}\")\n" + "set(OTEL_${_DEPENDENCY}_SEARCH_MODE \"${_dependency_SEARCH_MODE}\")\n" ) endforeach() @@ -481,19 +779,19 @@ endfunction() # otel_install_cmake_config() #----------------------------------------------------------------------- function(otel_install_cmake_config) + include(CMakePackageConfigHelpers) + # 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) + PATH_VARS 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( @@ -503,4 +801,101 @@ function(otel_install_cmake_config) "${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 +endfunction() + +#----------------------------------------------------------------------- +# otel_print_build_config +# Prints the build configuration and options used to build opentelemetry-cpp. +function(otel_print_build_config) + # Record build config and versions + message(STATUS "---------------------------------------------") + message(STATUS "build settings") + message(STATUS "---------------------------------------------") + message(STATUS "OpenTelemetry: ${OPENTELEMETRY_VERSION}") + message(STATUS "OpenTelemetry ABI: ${OPENTELEMETRY_ABI_VERSION_NO}") + message(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}") + message(STATUS "CXX: ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}") + message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") + message(STATUS "CXXFLAGS: ${CMAKE_CXX_FLAGS}") + message(STATUS "CMAKE_CXX_STANDARD: ${CMAKE_CXX_STANDARD}") + message(STATUS "CMAKE_TOOLCHAIN_FILE: ${CMAKE_TOOLCHAIN_FILE}") + message(STATUS "BUILD_SHARED_LIBS: ${BUILD_SHARED_LIBS}") + + message(STATUS "---------------------------------------------") + message(STATUS "opentelemetry-cpp build options") + message(STATUS "---------------------------------------------") + message(STATUS "WITH_API_ONLY: ${WITH_API_ONLY}") + message(STATUS "WITH_NO_DEPRECATED_CODE: ${WITH_NO_DEPRECATED_CODE}") + message(STATUS "WITH_ABI_VERSION_1: ${WITH_ABI_VERSION_1}") + message(STATUS "WITH_ABI_VERSION_2: ${WITH_ABI_VERSION_2}") + message(STATUS "OTELCPP_VERSIONED_LIBS: ${OTELCPP_VERSIONED_LIBS}") + message(STATUS "OTELCPP_MAINTAINER_MODE: ${OTELCPP_MAINTAINER_MODE}") + message(STATUS "WITH_STL: ${WITH_STL}") + message(STATUS "WITH_GSL: ${WITH_GSL}") + message(STATUS "WITH_NO_GETENV: ${WITH_NO_GETENV}") + message(STATUS "OTELCPP_THIRDPARTY_FETCH_CONTENT_ONLY: ${OTELCPP_THIRDPARTY_FETCH_CONTENT_ONLY}") + message(STATUS "OTELCPP_THIRDPARTY_FIND_PACKAGE_ONLY: ${OTELCPP_THIRDPARTY_FIND_PACKAGE_ONLY}") + + message(STATUS "---------------------------------------------") + message(STATUS "opentelemetry-cpp cmake component options") + message(STATUS "---------------------------------------------") + message(STATUS "WITH_OTLP_GRPC: ${WITH_OTLP_GRPC}") + message(STATUS "WITH_OTLP_HTTP: ${WITH_OTLP_HTTP}") + message(STATUS "WITH_OTLP_FILE: ${WITH_OTLP_FILE}") + message(STATUS "WITH_HTTP_CLIENT_CURL: ${WITH_HTTP_CLIENT_CURL}") + message(STATUS "WITH_ZIPKIN: ${WITH_ZIPKIN}") + message(STATUS "WITH_PROMETHEUS: ${WITH_PROMETHEUS}") + message(STATUS "WITH_ELASTICSEARCH: ${WITH_ELASTICSEARCH}") + message(STATUS "WITH_OPENTRACING: ${WITH_OPENTRACING}") + message(STATUS "WITH_ETW: ${WITH_ETW}") + message(STATUS "OPENTELEMETRY_BUILD_DLL: ${OPENTELEMETRY_BUILD_DLL}") + + message(STATUS "---------------------------------------------") + message(STATUS "feature preview options") + message(STATUS "---------------------------------------------") + message(STATUS "WITH_ASYNC_EXPORT_PREVIEW: ${WITH_ASYNC_EXPORT_PREVIEW}") + message( + STATUS + "WITH_THREAD_INSTRUMENTATION_PREVIEW: ${WITH_THREAD_INSTRUMENTATION_PREVIEW}" + ) + message( + STATUS "WITH_METRICS_EXEMPLAR_PREVIEW: ${WITH_METRICS_EXEMPLAR_PREVIEW}") + message(STATUS "WITH_REMOVE_METER_PREVIEW: ${WITH_REMOVE_METER_PREVIEW}") + message( + STATUS "WITH_OTLP_GRPC_SSL_MTLS_PREVIEW: ${WITH_OTLP_GRPC_SSL_MTLS_PREVIEW}") + message(STATUS "WITH_OTLP_GRPC_CREDENTIAL_PREVIEW: ${WITH_OTLP_GRPC_CREDENTIAL_PREVIEW}") + message(STATUS "WITH_OTLP_RETRY_PREVIEW: ${WITH_OTLP_RETRY_PREVIEW}") + message(STATUS "---------------------------------------------") + message(STATUS "third-party options") + message(STATUS "---------------------------------------------") + message(STATUS "WITH_NLOHMANN_JSON: ${USE_NLOHMANN_JSON}") + message(STATUS "WITH_CURL_LOGGING: ${WITH_CURL_LOGGING}") + message(STATUS "WITH_OTLP_HTTP_COMPRESSION: ${WITH_OTLP_HTTP_COMPRESSION}") + message(STATUS "---------------------------------------------") + message(STATUS "examples and test options") + message(STATUS "---------------------------------------------") + message(STATUS "WITH_BENCHMARK: ${WITH_BENCHMARK}") + message(STATUS "WITH_EXAMPLES: ${WITH_EXAMPLES}") + message(STATUS "WITH_EXAMPLES_HTTP: ${WITH_EXAMPLES_HTTP}") + message(STATUS "WITH_FUNC_TESTS: ${WITH_FUNC_TESTS}") + message(STATUS "BUILD_W3CTRACECONTEXT_TEST: ${BUILD_W3CTRACECONTEXT_TEST}") + message(STATUS "BUILD_TESTING: ${BUILD_TESTING}") + message(STATUS "---------------------------------------------") + message(STATUS "versions") + message(STATUS "---------------------------------------------") + message(STATUS "CMake: ${CMAKE_VERSION}") + + get_property(_DEPENDENCIES_LIST DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_THIRDPARTY_AVAILABLE_LIST) + foreach(_DEPENDENCY IN LISTS _DEPENDENCIES_LIST) + get_property(_dependency_PROVIDER DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_${_DEPENDENCY}_PROVIDER) + get_property(_dependency_VERSION DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_${_DEPENDENCY}_VERSION) + get_property(_dependency_SEARCH_MODE DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_${_DEPENDENCY}_SEARCH_MODE) + if(DEFINED _dependency_SEARCH_MODE) + set(_dependency_SEARCH_MODE ", ${_dependency_SEARCH_MODE}") + else() + set(_dependency_SEARCH_MODE "") + endif() + message(STATUS "${_DEPENDENCY}: ${_dependency_VERSION} (${_dependency_PROVIDER}${_dependency_SEARCH_MODE})") + endforeach() + message(STATUS "---------------------------------------------") +endfunction() diff --git a/cmake/prometheus-cpp.cmake b/cmake/prometheus-cpp.cmake new file mode 100644 index 0000000000..8579742038 --- /dev/null +++ b/cmake/prometheus-cpp.cmake @@ -0,0 +1,18 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +otel_add_thirdparty_package( + PACKAGE_NAME "prometheus-cpp" + PACKAGE_SEARCH_MODES "CONFIG" + FETCH_GIT_REPOSITORY "https://github.com/jupp0r/prometheus-cpp.git" + FETCH_GIT_TAG "${prometheus-cpp_GIT_TAG}" + FETCH_SOURCE_DIR "${PROJECT_SOURCE_DIR}/third_party/prometheus-cpp" + FETCH_GIT_SUBMODULES "3rdparty/civetweb" + FETCH_CMAKE_ARGS + "-DENABLE_TESTING=OFF" + "-DENABLE_PUSH=OFF" + "-DUSE_THIRDPARTY_LIBRARIES=ON" + REQUIRED_TARGETS "prometheus-cpp::core;prometheus-cpp::pull" + VERSION_REGEX "project\\([^\\)]*VERSION[ \t]*([0-9]+(\\.[0-9]+)*(\\.[0-9]+)*)" + VERSION_FILE "\${prometheus-cpp_SOURCE_DIR}/CMakeLists.txt" +) diff --git a/cmake/protobuf.cmake b/cmake/protobuf.cmake new file mode 100644 index 0000000000..9dd289f573 --- /dev/null +++ b/cmake/protobuf.cmake @@ -0,0 +1,63 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +get_property(_gRPC_PROVIDER DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_gRPC_PROVIDER) + +set(protobuf_ADD_PACKAGE_ARGS "") + +if(DEFINED _gRPC_PROVIDER AND NOT _gRPC_PROVIDER STREQUAL "package" AND TARGET libprotobuf) + # gRPC was fetched and built protobuf as a submodule + list(APPEND protobuf_ADD_PACKAGE_ARGS + VERSION_FILE "\${grpc_SOURCE_DIR}/third_party/protobuf/version.json" + DO_NOT_FETCH + DO_NOT_FIND + ) + set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_Protobuf_PROVIDER "grpc_submodule") +else() + list(APPEND protobuf_ADD_PACKAGE_ARGS + VERSION_FILE "\${protobuf_SOURCE_DIR}/version.json") +endif() + +otel_add_thirdparty_package( + PACKAGE_NAME "Protobuf" + PACKAGE_SEARCH_MODES "CONFIG" "MODULE" + PACKAGE_NAMESPACE "protobuf" + FETCH_NAME "protobuf" + FETCH_GIT_REPOSITORY "https://github.com/protocolbuffers/protobuf.git" + FETCH_GIT_TAG "${protobuf_GIT_TAG}" + FETCH_CMAKE_ARGS + "-Dprotobuf_INSTALL=${OPENTELEMETRY_INSTALL}" + "-Dprotobuf_BUILD_TESTS=OFF" + "-Dprotobuf_BUILD_EXAMPLES=OFF" + REQUIRED_TARGETS "protobuf::libprotobuf" + VERSION_REGEX "\"cpp\"[ \t]*:[ \t]*\"([0-9]+\\.[0-9]+(\\.[0-9]+)?)\"" + VERSION_FILE "\${protobuf_SOURCE_DIR}/version.json" + ${protobuf_ADD_PACKAGE_ARGS} + ) + +# Protobuf 3.22+ depends on abseil-cpp and must be found using the cmake +# find_package CONFIG search mode. The following attempts to find Protobuf +# using the CONFIG mode first, and if not found, falls back to the MODULE +# mode. See https://gitlab.kitware.com/cmake/cmake/-/issues/24321 for more +# details. +get_property(_Protobuf_VERSION DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_Protobuf_VERSION) +if(DEFINED _Protobuf_VERSION AND _Protobuf_VERSION VERSION_LESS 3.22.0) + set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_Protobuf_SEARCH_MODE "") +else() + set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_Protobuf_SEARCH_MODE "CONFIG") +endif() + +if(TARGET libprotobuf) + set_target_properties(libprotobuf PROPERTIES POSITION_INDEPENDENT_CODE ON CXX_CLANG_TIDY "" CXX_INCLUDE_WHAT_YOU_USE "") +endif() + +if(CMAKE_CROSSCOMPILING) + find_program(PROTOBUF_PROTOC_EXECUTABLE protoc) +else() + if(NOT TARGET protobuf::protoc) + message(FATAL_ERROR "A required protobuf target (protobuf::protoc) was not found") + endif() + set(PROTOBUF_PROTOC_EXECUTABLE "$") +endif() + +message(STATUS "PROTOBUF_PROTOC_EXECUTABLE=${PROTOBUF_PROTOC_EXECUTABLE}") diff --git a/cmake/templates/opentelemetry-cpp-config.cmake.in b/cmake/templates/opentelemetry-cpp-config.cmake.in index 46655f8ff6..c84904dbab 100644 --- a/cmake/templates/opentelemetry-cpp-config.cmake.in +++ b/cmake/templates/opentelemetry-cpp-config.cmake.in @@ -211,9 +211,10 @@ endforeach() # handle the QUIETLY and REQUIRED arguments and set opentelemetry-cpp_FOUND to # TRUE if all variables listed contain valid results, e.g. valid file paths. include("FindPackageHandleStandardArgs") +set(${CMAKE_FIND_PACKAGE_NAME}_CONFIG ${CMAKE_CURRENT_LIST_FILE}) find_package_handle_standard_args( ${CMAKE_FIND_PACKAGE_NAME} - FOUND_VAR ${CMAKE_FIND_PACKAGE_NAME}_FOUND + CONFIG_MODE REQUIRED_VARS OPENTELEMETRY_CPP_INCLUDE_DIRS OPENTELEMETRY_CPP_LIBRARIES) if(${CMAKE_FIND_PACKAGE_NAME}_FOUND) diff --git a/cmake/thirdparty-dependency-config.cmake b/cmake/thirdparty-dependency-config.cmake deleted file mode 100644 index 046e3a540f..0000000000 --- a/cmake/thirdparty-dependency-config.cmake +++ /dev/null @@ -1,46 +0,0 @@ -# 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/threads.cmake b/cmake/threads.cmake new file mode 100644 index 0000000000..dd31dcca93 --- /dev/null +++ b/cmake/threads.cmake @@ -0,0 +1,12 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +otel_add_thirdparty_package( + PACKAGE_NAME "Threads" + PACKAGE_SEARCH_MODES "MODULE" + REQUIRED_TARGETS "Threads::Threads" + ALWAYS_FIND + ) + +# Threads does not have a version, so we set it to an empty string instead of "unknown". +set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_Threads_VERSION "") diff --git a/cmake/tools.cmake b/cmake/tools.cmake index ffc3732d2b..c0cd102014 100644 --- a/cmake/tools.cmake +++ b/cmake/tools.cmake @@ -220,3 +220,13 @@ function(project_build_tools_patch_default_imported_config) endif() endforeach() endfunction() + +#------------------------------------------------------------------------------- +# Set the target version for a given target +function(set_target_version target_name) + if(OTELCPP_VERSIONED_LIBS) + set_target_properties( + ${target_name} PROPERTIES VERSION ${OPENTELEMETRY_VERSION} + SOVERSION ${OPENTELEMETRY_ABI_VERSION_NO}) + endif() +endfunction() diff --git a/cmake/version.cmake b/cmake/version.cmake new file mode 100644 index 0000000000..0d0c731978 --- /dev/null +++ b/cmake/version.cmake @@ -0,0 +1,73 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +set(OTELCPP_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/..") +get_filename_component(OTELCPP_SOURCE_DIR "${OTELCPP_SOURCE_DIR}" ABSOLUTE) +set(OTELCPP_API_VERSION_FILE "${OTELCPP_SOURCE_DIR}/api/include/opentelemetry/version.h") + +file(READ "${OTELCPP_API_VERSION_FILE}" + OPENTELEMETRY_CPP_HEADER_VERSION_H) + +if(NOT DEFINED OPENTELEMETRY_CPP_HEADER_VERSION_H) + message(FATAL_ERROR "${OTELCPP_API_VERSION_FILE} not found") +endif() + +if(OPENTELEMETRY_CPP_HEADER_VERSION_H MATCHES + "OPENTELEMETRY_VERSION[ \t\r\n]+\"?([^\"]+)\"?") + set(OPENTELEMETRY_VERSION ${CMAKE_MATCH_1}) +else() + message( + FATAL_ERROR + "OPENTELEMETRY_VERSION not found on ${OTELCPP_API_VERSION_FILE}" + ) +endif() + +if(OPENTELEMETRY_CPP_HEADER_VERSION_H MATCHES "OPENTELEMETRY_ABI_VERSION_NO[ \t\r\n]+\"?([0-9]+)\"?") + math(EXPR OPENTELEMETRY_ABI_VERSION_DEFAULT ${CMAKE_MATCH_1}) +endif() + +if(NOT OPENTELEMETRY_VERSION OR OPENTELEMETRY_VERSION VERSION_LESS_EQUAL "0.0.0") + message(FATAL_ERROR "Failed to extract OpenTelemetry C++ version (${OPENTELEMETRY_VERSION}) from ${OTELCPP_API_VERSION_FILE}") +endif() + +if(NOT OPENTELEMETRY_ABI_VERSION_DEFAULT) + message(FATAL_ERROR "Failed to extract OpenTelemetry C++ ABI version from ${OTELCPP_API_VERSION_FILE}") +endif() + +message(STATUS "OpenTelemetry C++ version: ${OPENTELEMETRY_VERSION}") + +# Allow overriding the third-party version tags file with -DOTELCPP_THIRDPARTY_FILE= +if(NOT OTELCPP_THIRDPARTY_FILE) + set(OTELCPP_THIRDPARTY_FILE "${OTELCPP_SOURCE_DIR}/third_party_release") +elseif(NOT IS_ABSOLUTE OTELCPP_THIRDPARTY_FILE ) + string(PREPEND OTELCPP_THIRDPARTY_FILE "${OTELCPP_SOURCE_DIR}/") +endif() + +if(NOT EXISTS "${OTELCPP_THIRDPARTY_FILE}") + message(FATAL_ERROR "Third-party version tags file not found: ${OTELCPP_THIRDPARTY_FILE}") +endif() + +message(STATUS "Reading third-party version tags from ${OTELCPP_THIRDPARTY_FILE}") + +file(STRINGS "${OTELCPP_THIRDPARTY_FILE}" OTELCPP_THIRDPARTY_FILE_CONTENT) + +set(OTELCPP_THIRDPARTY_PACKAGE_LIST "") +# Parse the third-party tags file +foreach(_raw_line IN LISTS OTELCPP_THIRDPARTY_FILE_CONTENT) + # Strip leading/trailing whitespace + string(STRIP "${_raw_line}" _line) + # Skip empty lines and comments + if(_line STREQUAL "" OR _line MATCHES "^#") + continue() + endif() + + # Match "package_name=git_tag" + if(_line MATCHES "^([^=]+)=(.+)$") + set(_third_party_name "${CMAKE_MATCH_1}") + set(_git_tag "${CMAKE_MATCH_2}") + set("${_third_party_name}_GIT_TAG" "${_git_tag}") + list(APPEND OTELCPP_THIRDPARTY_PACKAGE_LIST "${_third_party_name}") + else() + message(FATAL_ERROR "Could not parse third-party tag. Invalid line in ${OTELCPP_THIRDPARTY_FILE}. Line:\n ${_raw_line}") + endif() +endforeach() diff --git a/cmake/zlib.cmake b/cmake/zlib.cmake new file mode 100644 index 0000000000..75550b1d75 --- /dev/null +++ b/cmake/zlib.cmake @@ -0,0 +1,14 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +# ZLIB must be found as an installed package for now. +# Fetching ZLIB and building in-tree is not supported. +# Protobuf, gRPC, prometheus-cpp, civetweb, CURL, and other dependencies require ZLIB and import its target. +# When ZLIB::ZLIB is an alias of the shared library then inconsistent linking may occur. + +otel_add_thirdparty_package( + PACKAGE_NAME "ZLIB" + PACKAGE_SEARCH_MODES "MODULE" "CONFIG" + REQUIRED_TARGETS "ZLIB::ZLIB" + ALWAYS_FIND + ) diff --git a/examples/http/CMakeLists.txt b/examples/http/CMakeLists.txt index 693781f598..0aff680302 100644 --- a/examples/http/CMakeLists.txt +++ b/examples/http/CMakeLists.txt @@ -7,7 +7,7 @@ add_executable(http_server server.cc) target_link_libraries( http_client PRIVATE opentelemetry-cpp::trace opentelemetry-cpp::http_client_curl - opentelemetry-cpp::ostream_span_exporter ${CURL_LIBRARIES}) + opentelemetry-cpp::ostream_span_exporter CURL::libcurl) target_link_libraries( http_server diff --git a/exporters/etw/CMakeLists.txt b/exporters/etw/CMakeLists.txt index 82147007dc..82e405bd85 100644 --- a/exporters/etw/CMakeLists.txt +++ b/exporters/etw/CMakeLists.txt @@ -15,9 +15,6 @@ target_link_libraries( opentelemetry_exporter_etw INTERFACE opentelemetry_api opentelemetry_trace nlohmann_json::nlohmann_json) target_link_libraries(opentelemetry_exporter_etw INTERFACE opentelemetry_logs) -if(nlohmann_json_clone) - add_dependencies(opentelemetry_exporter_etw nlohmann_json::nlohmann_json) -endif() otel_add_component( COMPONENT diff --git a/exporters/otlp/CMakeLists.txt b/exporters/otlp/CMakeLists.txt index 3ec20517e0..629d9f4c1e 100644 --- a/exporters/otlp/CMakeLists.txt +++ b/exporters/otlp/CMakeLists.txt @@ -22,7 +22,6 @@ target_link_libraries(opentelemetry_otlp_recordable PUBLIC opentelemetry_metrics) if(WITH_OTLP_GRPC) - find_package(gRPC REQUIRED) add_library( opentelemetry_exporter_otlp_grpc_client src/otlp_grpc_client.cc src/otlp_grpc_client_factory.cc @@ -127,10 +126,6 @@ if(WITH_OTLP_HTTP) "$" "$") - if(nlohmann_json_clone) - add_dependencies(opentelemetry_exporter_otlp_http_client - nlohmann_json::nlohmann_json) - endif() target_include_directories( opentelemetry_exporter_otlp_http_client PUBLIC "$" @@ -202,10 +197,6 @@ if(WITH_OTLP_FILE) PUBLIC opentelemetry_sdk opentelemetry_common PRIVATE opentelemetry_proto $) - if(nlohmann_json_clone) - add_dependencies(opentelemetry_exporter_otlp_file_client - nlohmann_json::nlohmann_json) - endif() target_include_directories( opentelemetry_exporter_otlp_file_client PUBLIC "$" diff --git a/exporters/prometheus/CMakeLists.txt b/exporters/prometheus/CMakeLists.txt index 5dd75be48a..d6eb288b9b 100644 --- a/exporters/prometheus/CMakeLists.txt +++ b/exporters/prometheus/CMakeLists.txt @@ -1,10 +1,6 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 -if(NOT TARGET prometheus-cpp::core) - find_package(prometheus-cpp CONFIG REQUIRED) -endif() - add_library( opentelemetry_exporter_prometheus src/exporter.cc src/exporter_options.cc src/exporter_factory.cc @@ -19,22 +15,10 @@ target_include_directories( PUBLIC "$" "$") -set(PROMETHEUS_EXPORTER_TARGETS opentelemetry_exporter_prometheus) -if(TARGET pull) - list(APPEND PROMETHEUS_EXPORTER_TARGETS pull) -endif() -if(TARGET core) - list(APPEND PROMETHEUS_EXPORTER_TARGETS core) -endif() -if(TARGET util) - list(APPEND PROMETHEUS_EXPORTER_TARGETS util) -endif() -set(PROMETHEUS_CPP_TARGETS prometheus-cpp::pull prometheus-cpp::core) -if(TARGET prometheus-cpp::util) - list(APPEND PROMETHEUS_CPP_TARGETS prometheus-cpp::util) -endif() -target_link_libraries(opentelemetry_exporter_prometheus - PUBLIC opentelemetry_metrics ${PROMETHEUS_CPP_TARGETS}) +target_link_libraries( + opentelemetry_exporter_prometheus + PUBLIC opentelemetry_metrics prometheus-cpp::core + PRIVATE prometheus-cpp::pull) otel_add_component( COMPONENT diff --git a/exporters/zipkin/CMakeLists.txt b/exporters/zipkin/CMakeLists.txt index 548a9fd44d..9fc92ba7a5 100644 --- a/exporters/zipkin/CMakeLists.txt +++ b/exporters/zipkin/CMakeLists.txt @@ -59,7 +59,7 @@ if(BUILD_TESTING) ${GMOCK_LIB} opentelemetry_exporter_zipkin_trace opentelemetry_resources - ${CURL_LIBRARIES}) + CURL::libcurl) gtest_add_tests( TARGET zipkin_exporter_test diff --git a/ext/src/http/client/curl/CMakeLists.txt b/ext/src/http/client/curl/CMakeLists.txt index 0c1d8c6195..d238a1c4dd 100644 --- a/ext/src/http/client/curl/CMakeLists.txt +++ b/ext/src/http/client/curl/CMakeLists.txt @@ -11,40 +11,10 @@ set_target_version(opentelemetry_http_client_curl) target_link_libraries(opentelemetry_http_client_curl PUBLIC opentelemetry_common) -unset(CURL_IMPORTED_TARGET_NAME) - -foreach(FIND_CURL_IMPORTED_TARGET CURL::libcurl CURL::libcurl_shared - CURL::libcurl_static) - if(TARGET ${FIND_CURL_IMPORTED_TARGET}) - set(CURL_IMPORTED_TARGET_NAME ${FIND_CURL_IMPORTED_TARGET}) - break() - endif() -endforeach() - -if(TARGET ${CURL_IMPORTED_TARGET_NAME}) - target_link_libraries( - opentelemetry_http_client_curl - PUBLIC opentelemetry_ext - PRIVATE ${CURL_IMPORTED_TARGET_NAME}) - - # Some versions of libcurl do not export the link directories, which may cause - # link errors - project_build_tools_get_imported_location(CURL_LIB_FILE_PATH - ${CURL_IMPORTED_TARGET_NAME}) - get_filename_component(CURL_LIB_DIR_PATH "${CURL_LIB_FILE_PATH}" DIRECTORY) - - if(CURL_LIB_DIR_PATH) - target_link_directories(opentelemetry_http_client_curl PUBLIC - "$") - endif() -else() - target_include_directories(opentelemetry_http_client_curl - INTERFACE "${CURL_INCLUDE_DIRS}") - target_link_libraries( - opentelemetry_http_client_curl - PUBLIC opentelemetry_ext - PRIVATE ${CURL_LIBRARIES}) -endif() +target_link_libraries( + opentelemetry_http_client_curl + PUBLIC opentelemetry_ext + PRIVATE CURL::libcurl) if(WITH_CURL_LOGGING) target_compile_definitions(opentelemetry_http_client_curl @@ -52,19 +22,10 @@ if(WITH_CURL_LOGGING) endif() if(WITH_OTLP_HTTP_COMPRESSION) - if(TARGET ZLIB::ZLIB) - target_link_libraries( - opentelemetry_http_client_curl - PUBLIC opentelemetry_ext - PRIVATE ZLIB::ZLIB) - else() - target_include_directories(opentelemetry_http_client_curl - INTERFACE "${ZLIB_INCLUDE_DIRS}") - target_link_libraries( - opentelemetry_http_client_curl - PUBLIC opentelemetry_ext - PRIVATE ${ZLIB_LIBRARIES}) - endif() + target_link_libraries( + opentelemetry_http_client_curl + PUBLIC opentelemetry_ext + PRIVATE ZLIB::ZLIB) endif() otel_add_component(COMPONENT ext_http_curl TARGETS diff --git a/ext/test/http/CMakeLists.txt b/ext/test/http/CMakeLists.txt index f4d3774735..b7707bd8c2 100644 --- a/ext/test/http/CMakeLists.txt +++ b/ext/test/http/CMakeLists.txt @@ -4,28 +4,10 @@ if(WITH_HTTP_CLIENT_CURL) set(FILENAME curl_http_test) add_executable(${FILENAME} ${FILENAME}.cc) - target_link_libraries(${FILENAME} ${GMOCK_LIB} ${GTEST_BOTH_LIBRARIES} - ${CMAKE_THREAD_LIBS_INIT}) - - unset(CURL_IMPORTED_TARGET_NAME) - - foreach(FIND_CURL_IMPORTED_TARGET CURL::libcurl CURL::libcurl_shared - CURL::libcurl_static) - if(TARGET ${FIND_CURL_IMPORTED_TARGET}) - set(CURL_IMPORTED_TARGET_NAME ${FIND_CURL_IMPORTED_TARGET}) - break() - endif() - endforeach() - - if(TARGET ${CURL_IMPORTED_TARGET_NAME}) - target_link_libraries(${FILENAME} opentelemetry_http_client_curl - opentelemetry_common ${CURL_IMPORTED_TARGET_NAME}) - else() - target_include_directories(${FILENAME} PRIVATE ${CURL_INCLUDE_DIRS}) - target_link_libraries(${FILENAME} ${CURL_LIBRARIES} - opentelemetry_http_client_curl opentelemetry_common) - endif() - + target_link_libraries( + ${FILENAME} + PRIVATE ${GMOCK_LIB} ${GTEST_BOTH_LIBRARIES} opentelemetry_http_client_curl + opentelemetry_common CURL::libcurl) gtest_add_tests( TARGET ${FILENAME} TEST_PREFIX ext.http.curl. diff --git a/ext/test/w3c_tracecontext_http_test_server/CMakeLists.txt b/ext/test/w3c_tracecontext_http_test_server/CMakeLists.txt index f4cfb7ee09..095da7ad80 100644 --- a/ext/test/w3c_tracecontext_http_test_server/CMakeLists.txt +++ b/ext/test/w3c_tracecontext_http_test_server/CMakeLists.txt @@ -6,8 +6,4 @@ target_link_libraries( w3c_tracecontext_http_test_server PRIVATE ${CMAKE_THREAD_LIBS_INIT} opentelemetry_trace opentelemetry_http_client_curl opentelemetry_exporter_ostream_span - ${CURL_LIBRARIES} nlohmann_json::nlohmann_json) -if(nlohmann_json_clone) - add_dependencies(w3c_tracecontext_http_test_server - nlohmann_json::nlohmann_json) -endif() + CURL::libcurl nlohmann_json::nlohmann_json) diff --git a/opentracing-shim/CMakeLists.txt b/opentracing-shim/CMakeLists.txt index 5e3b89c5b7..3a0db5a456 100644 --- a/opentracing-shim/CMakeLists.txt +++ b/opentracing-shim/CMakeLists.txt @@ -1,37 +1,34 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 -set(this_target opentelemetry_opentracing_shim) +add_library( + opentelemetry_opentracing_shim src/shim_utils.cc src/span_shim.cc + src/span_context_shim.cc src/tracer_shim.cc) -add_library(${this_target} src/shim_utils.cc src/span_shim.cc - src/span_context_shim.cc src/tracer_shim.cc) - -set_target_properties(${this_target} PROPERTIES EXPORT_NAME opentracing_shim) -set_target_version(${this_target}) +set_target_properties(opentelemetry_opentracing_shim + PROPERTIES EXPORT_NAME opentracing_shim) +set_target_version(opentelemetry_opentracing_shim) target_include_directories( - ${this_target} PUBLIC "$" - "$") + opentelemetry_opentracing_shim + PUBLIC "$" + "$") + +target_link_libraries(opentelemetry_opentracing_shim PUBLIC opentelemetry_api) -if(OPENTRACING_DIR) - target_include_directories( - ${this_target} - PUBLIC - "$" - "$" - "$" - ) - target_link_libraries(${this_target} opentelemetry_api opentracing) +if(TARGET OpenTracing::opentracing) + target_link_libraries(opentelemetry_opentracing_shim + PUBLIC OpenTracing::opentracing) else() - target_link_libraries(${this_target} opentelemetry_api - OpenTracing::opentracing) + target_link_libraries(opentelemetry_opentracing_shim + PUBLIC OpenTracing::opentracing-static) endif() otel_add_component( COMPONENT shims_opentracing TARGETS - ${this_target} + opentelemetry_opentracing_shim FILES_DIRECTORY "include/opentelemetry/opentracingshim" FILES_DESTINATION @@ -43,20 +40,10 @@ otel_add_component( if(BUILD_TESTING) foreach(testname propagation_test shim_utils_test span_shim_test span_context_shim_test tracer_shim_test) - add_executable(${testname} "test/${testname}.cc") - - if(OPENTRACING_DIR) - target_link_libraries( - ${testname} ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} - opentelemetry_api opentelemetry_opentracing_shim opentracing) - else() - target_link_libraries( - ${testname} ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} - opentelemetry_api opentelemetry_opentracing_shim - OpenTracing::opentracing) - endif() - + target_link_libraries( + ${testname} PRIVATE ${GTEST_BOTH_LIBRARIES} Threads::Threads + opentelemetry_opentracing_shim) gtest_add_tests( TARGET ${testname} TEST_PREFIX opentracing_shim. diff --git a/sdk/test/metrics/CMakeLists.txt b/sdk/test/metrics/CMakeLists.txt index 3eb65fbe30..1b69d31aac 100644 --- a/sdk/test/metrics/CMakeLists.txt +++ b/sdk/test/metrics/CMakeLists.txt @@ -38,7 +38,7 @@ foreach( instrument_descriptor_test) add_executable(${testname} "${testname}.cc") target_link_libraries( - ${testname} ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} + ${testname} ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIB} ${CMAKE_THREAD_LIBS_INIT} metrics_common_test_utils opentelemetry_resources) target_compile_definitions(${testname} PRIVATE UNIT_TESTING) gtest_add_tests( From da6acebfe0759ee1aa1a7e6516a49fe657f26913 Mon Sep 17 00:00:00 2001 From: Douglas Barker Date: Sun, 8 Jun 2025 19:29:42 -0600 Subject: [PATCH 2/7] Adds a cmake project to build and install all third party dependencies. Adds a install_thirdparty.sh bash script. Use the script in ci and remove the separate install scripts for abseil, googletest, protobuf, and grpc. Adds third party tag files and removes references to specific third party versions from ci workflows. --- .github/workflows/ci.yml | 143 ++----- .github/workflows/cmake_install.yml | 136 ++++--- .github/workflows/iwyu.yml | 5 +- ci/README.md | 1 - ci/do_ci.ps1 | 14 +- ci/do_ci.sh | 24 +- ci/install_abseil.sh | 73 ---- ci/install_protobuf.sh | 76 ---- ci/install_thirdparty.sh | 52 +++ ci/setup_ci_environment.sh | 4 +- ci/setup_googletest.sh | 56 --- ci/setup_grpc.sh | 154 ------- ci/setup_windows_ci_environment.ps1 | 3 + install/cmake/CMakeLists.txt | 382 ++++++++++++++++++ install/cmake/third_party_latest | 17 + install/cmake/third_party_minimum | 18 + install/cmake/third_party_stable | 18 + install/conan/conanfile_latest.txt | 2 +- .../shims_opentracing/CMakeLists.txt | 8 +- .../cmake/fetch_content_test/CMakeLists.txt | 30 +- third_party_release | 32 +- 21 files changed, 681 insertions(+), 567 deletions(-) delete mode 100755 ci/install_abseil.sh delete mode 100755 ci/install_protobuf.sh create mode 100755 ci/install_thirdparty.sh delete mode 100755 ci/setup_googletest.sh delete mode 100755 ci/setup_grpc.sh create mode 100644 install/cmake/CMakeLists.txt create mode 100644 install/cmake/third_party_latest create mode 100644 install/cmake/third_party_minimum create mode 100644 install/cmake/third_party_stable diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ac3ba914b7..2e7d9f8dcb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,8 +21,6 @@ jobs: # submodules: 'recursive' # - name: setup # env: -# PROTOBUF_VERSION: '23.3' -# ABSEIL_CPP_VERSION: '20230125.3' # CXX_STANDARD: '14' # CC: /usr/bin/gcc-10 # CXX: /usr/bin/g++-10 @@ -30,9 +28,6 @@ jobs: # sudo -E ./ci/setup_gcc10.sh # sudo -E ./ci/setup_ci_environment.sh # sudo -E ./ci/setup_cmake.sh -# sudo -E ./ci/setup_googletest.sh -# sudo -E ./ci/install_abseil.sh -# sudo -E ./ci/install_protobuf.sh cmake_test: name: CMake test (prometheus, elasticsearch, zipkin) @@ -52,7 +47,6 @@ jobs: run: | sudo -E ./ci/setup_ci_environment.sh sudo -E ./ci/setup_cmake.sh - sudo -E ./ci/setup_googletest.sh - name: run cmake tests run: | ./ci/do_ci.sh cmake.test @@ -62,7 +56,7 @@ jobs: runs-on: ubuntu-24.04 env: CXX_STANDARD: '17' - BUILD_TYPE: 'Debug' + BUILD_TYPE: 'Release' steps: - name: Harden the runner (Audit all outbound calls) uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 @@ -75,11 +69,6 @@ jobs: run: | sudo -E ./ci/setup_ci_environment.sh sudo -E ./ci/setup_cmake.sh - sudo -E ./ci/setup_googletest.sh - - name: Install abseil, protobuf, and grpc with apt - run: | - sudo -E apt-get update - sudo -E apt-get install -y libabsl-dev libprotobuf-dev libgrpc++-dev protobuf-compiler protobuf-compiler-grpc - name: run fetch content cmake test run: | ./ci/do_ci.sh cmake.fetch_content.test @@ -87,33 +76,26 @@ jobs: cmake_gcc_maintainer_sync_test: name: CMake gcc 14 (maintainer mode, sync) runs-on: ubuntu-24.04 + env: + CC: /usr/bin/gcc-14 + CXX: /usr/bin/g++-14 + CXX_STANDARD: '14' 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 - env: - CC: /usr/bin/gcc-14 - CXX: /usr/bin/g++-14 - PROTOBUF_VERSION: 21.12 run: | - sudo apt remove needrestart #refer: https://github.com/actions/runner-images/issues/9937 sudo -E ./ci/setup_ci_environment.sh sudo -E ./ci/setup_cmake.sh - sudo -E ./ci/setup_googletest.sh - sudo -E ./ci/install_protobuf.sh - - name: setup grpc + - name: install dependencies run: | - sudo ./ci/setup_grpc.sh + sudo -E ./ci/install_thirdparty.sh /usr/local third_party_release - name: run cmake gcc (maintainer mode, sync) - env: - CC: /usr/bin/gcc-14 - CXX: /usr/bin/g++-14 run: | ./ci/do_ci.sh cmake.maintainer.sync.test - name: generate test cert @@ -129,33 +111,26 @@ jobs: cmake_gcc_maintainer_async_test: name: CMake gcc 14 (maintainer mode, async) runs-on: ubuntu-24.04 + env: + CC: /usr/bin/gcc-14 + CXX: /usr/bin/g++-14 + CXX_STANDARD: '14' 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 - env: - CC: /usr/bin/gcc-14 - CXX: /usr/bin/g++-14 - PROTOBUF_VERSION: 21.12 run: | - sudo apt remove needrestart #refer: https://github.com/actions/runner-images/issues/9937 sudo -E ./ci/setup_ci_environment.sh sudo -E ./ci/setup_cmake.sh - sudo -E ./ci/setup_googletest.sh - sudo -E ./ci/install_protobuf.sh - - name: setup grpc + - name: install dependencies run: | - sudo ./ci/setup_grpc.sh + sudo -E ./ci/install_thirdparty.sh /usr/local third_party_release - name: run cmake gcc (maintainer mode, async) - env: - CC: /usr/bin/gcc-14 - CXX: /usr/bin/g++-14 run: | ./ci/do_ci.sh cmake.maintainer.async.test - name: generate test cert @@ -171,33 +146,26 @@ jobs: cmake_clang_maintainer_sync_test: name: CMake clang 18 (maintainer mode, sync) runs-on: ubuntu-24.04 + env: + CC: /usr/bin/clang-18 + CXX: /usr/bin/clang++-18 + CXX_STANDARD: '14' 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 - env: - CC: /usr/bin/clang-18 - CXX: /usr/bin/clang++-18 - PROTOBUF_VERSION: 21.12 run: | - sudo apt remove needrestart #refer: https://github.com/actions/runner-images/issues/9937 sudo -E ./ci/setup_ci_environment.sh sudo -E ./ci/setup_cmake.sh - sudo -E ./ci/setup_googletest.sh - sudo -E ./ci/install_protobuf.sh - - name: setup grpc + - name: install dependencies run: | - sudo ./ci/setup_grpc.sh + sudo -E ./ci/install_thirdparty.sh /usr/local third_party_release - name: run cmake clang (maintainer mode, sync) - env: - CC: /usr/bin/clang-18 - CXX: /usr/bin/clang++-18 run: | ./ci/do_ci.sh cmake.maintainer.sync.test - name: generate test cert @@ -213,33 +181,26 @@ jobs: cmake_clang_maintainer_async_test: name: CMake clang 18 (maintainer mode, async) runs-on: ubuntu-24.04 + env: + CC: /usr/bin/clang-18 + CXX: /usr/bin/clang++-18 + CXX_STANDARD: '14' 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 - env: - CC: /usr/bin/clang-18 - CXX: /usr/bin/clang++-18 - PROTOBUF_VERSION: 21.12 run: | - sudo apt remove needrestart #refer: https://github.com/actions/runner-images/issues/9937 sudo -E ./ci/setup_ci_environment.sh sudo -E ./ci/setup_cmake.sh - sudo -E ./ci/setup_googletest.sh - sudo -E ./ci/install_protobuf.sh - - name: setup grpc + - name: install dependencies run: | - sudo ./ci/setup_grpc.sh + sudo -E ./ci/install_thirdparty.sh /usr/local third_party_release - name: run cmake clang (maintainer mode, async) - env: - CC: /usr/bin/clang-18 - CXX: /usr/bin/clang++-18 run: | ./ci/do_ci.sh cmake.maintainer.async.test - name: generate test cert @@ -255,33 +216,26 @@ jobs: cmake_clang_maintainer_abiv2_test: name: CMake clang 18 (maintainer mode, abiv2) runs-on: ubuntu-24.04 + env: + CC: /usr/bin/clang-18 + CXX: /usr/bin/clang++-18 + CXX_STANDARD: '14' 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 - env: - CC: /usr/bin/clang-18 - CXX: /usr/bin/clang++-18 - PROTOBUF_VERSION: 21.12 run: | - sudo apt remove needrestart #refer: https://github.com/actions/runner-images/issues/9937 sudo -E ./ci/setup_ci_environment.sh sudo -E ./ci/setup_cmake.sh - sudo -E ./ci/setup_googletest.sh - sudo -E ./ci/install_protobuf.sh - - name: setup grpc + - name: install dependencies run: | - sudo ./ci/setup_grpc.sh + sudo -E ./ci/install_thirdparty.sh /usr/local third_party_release - name: run cmake clang (maintainer mode, abiv2) - env: - CC: /usr/bin/clang-18 - CXX: /usr/bin/clang++-18 run: | ./ci/do_ci.sh cmake.maintainer.abiv2.test - name: generate test cert @@ -374,7 +328,6 @@ jobs: run: | sudo -E ./ci/setup_ci_environment.sh sudo -E ./ci/setup_cmake.sh - sudo -E ./ci/setup_googletest.sh - name: run cmake tests (without otlp-exporter) env: CC: /usr/bin/gcc-12 @@ -398,7 +351,6 @@ jobs: run: | sudo -E ./ci/setup_ci_environment.sh sudo -E ./ci/setup_cmake.sh - sudo -E ./ci/setup_googletest.sh - name: run cmake tests (enable opentracing-shim) run: ./ci/do_ci.sh cmake.opentracing_shim.test @@ -418,7 +370,6 @@ jobs: run: | sudo -E ./ci/setup_ci_environment.sh sudo -E ./ci/setup_cmake.sh - sudo -E ./ci/setup_googletest.sh - name: run tests (enable stl) env: CXX_STANDARD: '14' @@ -440,7 +391,6 @@ jobs: run: | sudo -E ./ci/setup_ci_environment.sh sudo -E ./ci/setup_cmake.sh - sudo -E ./ci/setup_googletest.sh - name: run tests (enable stl) env: CXX_STANDARD: '17' @@ -462,7 +412,6 @@ jobs: run: | sudo -E ./ci/setup_ci_environment.sh sudo -E ./ci/setup_cmake.sh - sudo -E ./ci/setup_googletest.sh - name: run tests env: CXX_STANDARD: '20' @@ -492,7 +441,6 @@ jobs: run: | sudo -E ./ci/setup_ci_environment.sh sudo -E ./ci/setup_cmake.sh - sudo -E ./ci/setup_googletest.sh - name: run tests env: CC: /usr/bin/clang @@ -524,7 +472,6 @@ jobs: run: | sudo -E ./ci/setup_ci_environment.sh sudo -E ./ci/setup_cmake.sh - sudo -E ./ci/setup_googletest.sh - name: run tests env: CXX_STANDARD: '23' @@ -554,7 +501,6 @@ jobs: run: | sudo -E ./ci/setup_ci_environment.sh sudo -E ./ci/setup_cmake.sh - sudo -E ./ci/setup_googletest.sh - name: run tests env: CC: /usr/bin/clang @@ -586,10 +532,8 @@ jobs: run: | sudo -E ./ci/setup_ci_environment.sh sudo -E ./ci/setup_cmake.sh - sudo -E ./ci/setup_googletest.sh - name: run otlp exporter tests run: | - sudo ./ci/setup_grpc.sh ./ci/do_ci.sh cmake.exporter.otprotocol.test - name: generate test cert env: @@ -604,31 +548,25 @@ jobs: cmake_modern_protobuf_grpc_with_abseil_test: name: CMake test (with modern protobuf,grpc and abseil) runs-on: ubuntu-latest + env: + CXX_STANDARD: '14' 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 - env: - PROTOBUF_VERSION: '23.3' - ABSEIL_CPP_VERSION: '20230125.3' - CXX_STANDARD: '14' run: | sudo -E ./ci/setup_ci_environment.sh sudo -E ./ci/setup_cmake.sh - sudo -E ./ci/setup_googletest.sh - sudo -E ./ci/install_abseil.sh - sudo -E ./ci/install_protobuf.sh + - name: install dependencies + run: | + sudo -E ./ci/install_thirdparty.sh /usr/local install/cmake/third_party_stable - name: run otlp exporter tests - env: - CXX_STANDARD: '14' run: | - sudo -E ./ci/setup_grpc.sh -m -p protobuf -p abseil-cpp ./ci/do_ci.sh cmake.exporter.otprotocol.test cmake_do_not_install_test: @@ -647,10 +585,8 @@ jobs: run: | sudo -E ./ci/setup_ci_environment.sh sudo -E ./ci/setup_cmake.sh - sudo -E ./ci/setup_googletest.sh - name: run otlp exporter tests run: | - sudo ./ci/setup_grpc.sh ./ci/do_ci.sh cmake.do_not_install.test cmake_otprotocol_shared_libs_with_static_grpc_test: @@ -669,10 +605,8 @@ jobs: run: | sudo -E ./ci/setup_ci_environment.sh sudo -E ./ci/setup_cmake.sh - sudo -E ./ci/setup_googletest.sh - name: run otlp exporter tests run: | - sudo ./ci/setup_grpc.sh -T ./ci/do_ci.sh cmake.exporter.otprotocol.shared_libs.with_static_grpc.test plugin_test: @@ -694,7 +628,6 @@ jobs: run: | sudo -E ./ci/setup_ci_environment.sh sudo -E ./ci/setup_cmake.sh - sudo -E ./ci/setup_googletest.sh - name: run tests env: CC: /usr/bin/gcc-12 @@ -982,8 +915,6 @@ jobs: egress-policy: audit - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - name: setup - run: sudo apt remove needrestart && sudo ./ci/install_format_tools.sh #refer: https://github.com/actions/runner-images/issues/9937 - name: run tests run: ./ci/do_ci.sh format @@ -1124,7 +1055,6 @@ jobs: run: | sudo -E ./ci/setup_ci_environment.sh sudo -E ./ci/setup_cmake.sh - sudo -E ./ci/setup_googletest.sh - name: run tests and generate report env: CC: /usr/bin/gcc-10 @@ -1221,7 +1151,6 @@ jobs: run: | sudo -E ./ci/setup_ci_environment.sh sudo -E ./ci/setup_cmake.sh - sudo -E ./ci/setup_googletest.sh - name: run w3c trace-context test server (background) env: CXX_STANDARD: '14' diff --git a/.github/workflows/cmake_install.yml b/.github/workflows/cmake_install.yml index 8d28b9ee85..623e997618 100644 --- a/.github/workflows/cmake_install.yml +++ b/.github/workflows/cmake_install.yml @@ -19,6 +19,7 @@ jobs: CMAKE_VERSION: '3.31.6' # cxx17 is the default for windows-2022 CXX_STANDARD: '17' + CMAKE_EXTRA_ARGS: "-DWITH_STL=CXX17 -DOTELCPP_THIRDPARTY_FIND_PACKAGE_ONLY=ON" steps: - name: Harden the runner (Audit all outbound calls) uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 @@ -44,6 +45,7 @@ jobs: # Set to the latest version of cmake 3.x CMAKE_VERSION: '3.31.6' CXX_STANDARD: '20' + CMAKE_EXTRA_ARGS: "-DWITH_GSL=ON -DOTELCPP_THIRDPARTY_FIND_PACKAGE_ONLY=ON" steps: - name: Harden the runner (Audit all outbound calls) uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 @@ -75,19 +77,50 @@ jobs: 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 libcurl, zlib, nlohmann-json with apt + - name: Setup CI Environment run: | sudo -E ./ci/setup_ci_environment.sh sudo -E ./ci/setup_cmake.sh - sudo -E ./ci/setup_googletest.sh - - name: Install abseil, protobuf, and grpc with apt + - name: Install Dependencies run: | sudo -E apt-get update - sudo -E apt-get install -y libabsl-dev libprotobuf-dev libgrpc++-dev protobuf-compiler protobuf-compiler-grpc + sudo -E apt-get install -y libabsl-dev libcurl4-openssl-dev zlib1g-dev nlohmann-json3-dev libprotobuf-dev libgrpc++-dev protobuf-compiler protobuf-compiler-grpc + - name: Run Tests (static libs) + 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 + + ubuntu_2404_all_fetch: + name: Ubuntu 24.04 fetch all dependencies (static libs - shared libs - opentracing shim) + runs-on: ubuntu-24.04 + env: + INSTALL_TEST_DIR: '/home/runner/install_test' + # CMake 3.28 is apt package version for Ubuntu 24.04 + CMAKE_VERSION: '3.28.3' + # The default cxx standard for Ubuntu 24.04 + CXX_STANDARD: '17' + CMAKE_EXTRA_ARGS: "-DOTELCPP_THIRDPARTY_FETCH_CONTENT_ONLY=ON" + 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: + # Don't checkout the submodules. + submodules: false + - name: Setup CI Environment + run: | + sudo -E ./ci/setup_ci_environment.sh + sudo -E ./ci/setup_cmake.sh - name: Run Tests (static libs) env: BUILD_SHARED_LIBS: 'OFF' @@ -96,43 +129,36 @@ jobs: env: BUILD_SHARED_LIBS: 'ON' run: ./ci/do_ci.sh cmake.install.test + - name: Run OpenTracing Shim Test + run: ./ci/do_ci.sh cmake.opentracing_shim.install.test ubuntu_2404_latest: name: Ubuntu 24.04 latest versions cxx20 (static libs) runs-on: ubuntu-24.04 env: INSTALL_TEST_DIR: '/home/runner/install_test' + OTELCPP_PROTO_PATH: '/home/runner/third-party/opentelemetry-proto' # Set to the latest version of cmake 3.x CMAKE_VERSION: '3.31.6' # Set to the latest cxx standard supported by opentelemetry-cpp CXX_STANDARD: '20' - # Versions below set to the latest version available - # The abseil and protobuf versions are taken from - # the grpc submodules at the GRPC_VERSION tag - GOOGLETEST_VERSION: '1.16.0' - ABSEIL_CPP_VERSION: '20240722.1' - PROTOBUF_VERSION: '29.0' - GRPC_VERSION: 'v1.71.0' + CMAKE_EXTRA_ARGS: '-DWITH_STL=CXX20 -DOTELCPP_THIRDPARTY_FIND_PACKAGE_ONLY=ON' 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 gtest, libcurl, zlib, nlohmann-json with apt + submodules: false + - name: Setup CI Environment run: | sudo -E ./ci/setup_ci_environment.sh sudo -E ./ci/setup_cmake.sh - sudo -E ./ci/setup_googletest.sh - - name: Build abseil, protobuf, and grpc with ci scripts + - name: Install Dependencies run: | - sudo -E ./ci/install_abseil.sh - sudo -E ./ci/install_protobuf.sh - sudo -E ./ci/setup_grpc.sh -r $GRPC_VERSION -s $CXX_STANDARD -p protobuf -p abseil-cpp + sudo -E ./ci/install_thirdparty.sh /usr/local install/cmake/third_party_latest - name: Run Tests (static libs) env: BUILD_SHARED_LIBS: 'OFF' @@ -143,35 +169,27 @@ jobs: runs-on: ubuntu-22.04 env: INSTALL_TEST_DIR: '/home/runner/install_test' + OTELCPP_PROTO_PATH: '/home/runner/third-party/opentelemetry-proto' # CMake 3.22 is the apt package version for Ubuntu 22.04 CMAKE_VERSION: '3.22.0' CXX_STANDARD: '17' - # These are stable versions tested in the main ci workflow - # and defaults in the devcontainer - GOOGLETEST_VERSION: '1.14.0' - ABSEIL_CPP_VERSION: '20230125.3' - PROTOBUF_VERSION: '23.3' - GRPC_VERSION: 'v1.55.0' + CMAKE_EXTRA_ARGS: "-DWITH_STL=CXX17 -DOTELCPP_THIRDPARTY_FIND_PACKAGE_ONLY=ON" 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 gtest, libcurl, zlib, nlohmann-json with apt + submodules: false + - name: Setup CI Environment run: | sudo -E ./ci/setup_ci_environment.sh sudo -E ./ci/setup_cmake.sh - sudo -E ./ci/setup_googletest.sh - - name: Build abseil, protobuf, and grpc with ci scripts + - name: Install Dependencies run: | - sudo -E ./ci/install_abseil.sh - sudo -E ./ci/install_protobuf.sh - sudo -E ./ci/setup_grpc.sh -r $GRPC_VERSION -s $CXX_STANDARD -p protobuf -p abseil-cpp + sudo -E ./ci/install_thirdparty.sh /usr/local install/cmake/third_party_stable - name: Run Tests (static libs) env: BUILD_SHARED_LIBS: 'OFF' @@ -186,36 +204,28 @@ jobs: runs-on: ubuntu-22.04 env: INSTALL_TEST_DIR: '/home/runner/install_test' + OTELCPP_PROTO_PATH: '/home/runner/third-party/opentelemetry-proto' # Set to the current minimum version of cmake CMAKE_VERSION: '3.14.0' # cxx14 is the default for Ubuntu 22.04 CXX_STANDARD: '14' - # This is the apt package version of googletest for Ubuntu 22.04 - GOOGLETEST_VERSION: '1.11.0' - # These are minimum versions tested in the main ci workflow - ABSEIL_CPP_VERSION: '20220623.2' - PROTOBUF_VERSION: '21.12' - GRPC_VERSION: 'v1.49.2' - BUILD_TYPE: 'Debug' + CMAKE_EXTRA_ARGS: "-DWITH_GSL=ON -DOTELCPP_THIRDPARTY_FIND_PACKAGE_ONLY=ON" + BUILD_TYPE: 'Release' 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 gtest, libcurl, zlib, nlohmann-json with apt + submodules: false + - name: Setup CI Environment run: | sudo -E ./ci/setup_ci_environment.sh sudo -E ./ci/setup_cmake.sh - sudo -E ./ci/setup_googletest.sh - - name: Build abseil, protobuf, and grpc with ci scripts + - name: Install Dependencies run: | - sudo -E ./ci/install_abseil.sh - sudo -E ./ci/install_protobuf.sh - sudo -E ./ci/setup_grpc.sh -r $GRPC_VERSION -s $CXX_STANDARD -p protobuf -p abseil-cpp + sudo -E ./ci/install_thirdparty.sh /usr/local install/cmake/third_party_minimum - name: Run Tests (static libs) env: BUILD_SHARED_LIBS: 'OFF' @@ -233,6 +243,7 @@ jobs: # CMake 3.28 is apt package version for Ubuntu 24.04 CMAKE_VERSION: '3.28.3' CXX_STANDARD: '17' + CMAKE_EXTRA_ARGS: "-DOTELCPP_THIRDPARTY_FIND_PACKAGE_ONLY=ON" CMAKE_TOOLCHAIN_FILE: /home/runner/conan/build/Debug/generators/conan_toolchain.cmake BUILD_TYPE: 'Debug' steps: @@ -243,7 +254,10 @@ jobs: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: - submodules: 'recursive' + submodules: false + - name: Get required submodules + run: | + git submodule update --init --depth 1 third_party/opentelemetry-proto - name: Install Conan run: | python3 -m pip install pip==25.0.1 @@ -270,13 +284,14 @@ 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 - opentracing shim) 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_EXTRA_ARGS: "-DOTELCPP_THIRDPARTY_FIND_PACKAGE_ONLY=ON" CMAKE_TOOLCHAIN_FILE: /home/runner/conan/build/Debug/generators/conan_toolchain.cmake BUILD_TYPE: 'Debug' steps: @@ -287,7 +302,10 @@ jobs: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: - submodules: 'recursive' + submodules: false + - name: Get required submodules + run: | + git submodule update --init --depth 1 third_party/opentelemetry-proto - name: Install Conan run: | python3 -m pip install pip==25.0.1 @@ -306,6 +324,8 @@ jobs: run: | export PKG_CONFIG_PATH=$INSTALL_TEST_DIR/lib/pkgconfig:$PKG_CONFIG_PATH ./ci/verify_packages.sh + - name: Run OpenTracing Shim Test + run: ./ci/do_ci.sh cmake.opentracing_shim.install.test macos_14_conan_stable: name: macOS 14 conan stable versions cxx17 (static libs) @@ -314,6 +334,7 @@ jobs: INSTALL_TEST_DIR: '/Users/runner/install_test' CMAKE_VERSION: '3.28.3' CXX_STANDARD: '17' + CMAKE_EXTRA_ARGS: "-DOTELCPP_THIRDPARTY_FIND_PACKAGE_ONLY=ON" CMAKE_TOOLCHAIN_FILE: '/Users/runner/conan/build/Debug/generators/conan_toolchain.cmake' BUILD_TYPE: 'Debug' steps: @@ -324,7 +345,10 @@ jobs: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: - submodules: 'recursive' + submodules: false + - name: Get required submodules + run: | + git submodule update --init --depth 1 third_party/opentelemetry-proto - name: Install Conan and tools run: | brew install conan autoconf automake libtool coreutils @@ -347,6 +371,7 @@ jobs: # Set to the latest version of cmake 3.x CMAKE_VERSION: '3.31.6' CXX_STANDARD: '17' + CMAKE_EXTRA_ARGS: "-DOTELCPP_THIRDPARTY_FIND_PACKAGE_ONLY=ON" BUILD_TYPE: 'Debug' steps: - name: Harden the runner (Audit all outbound calls) @@ -356,7 +381,10 @@ jobs: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: - submodules: 'recursive' + submodules: false + - name: Get required submodules + run: | + git submodule update --init --depth 1 third_party/opentelemetry-proto - name: Install Dependencies with Homebrew run: | ./ci/setup_cmake_macos.sh diff --git a/.github/workflows/iwyu.yml b/.github/workflows/iwyu.yml index f1fac1bbe7..8306039db2 100644 --- a/.github/workflows/iwyu.yml +++ b/.github/workflows/iwyu.yml @@ -30,6 +30,7 @@ jobs: build-essential \ ninja-build \ libssl-dev \ + zlib1g-dev \ libcurl4-openssl-dev \ libabsl-dev \ libprotobuf-dev \ @@ -40,11 +41,13 @@ jobs: libgtest-dev \ libbenchmark-dev \ llvm-dev \ - libclang-dev + libclang-dev \ + zlib1g-dev \ sudo ./ci/setup_cmake.sh - name: Install include-what-you-use run: | sudo ./ci/install_iwyu.sh + - name: Prepare CMake run: | TOPDIR=`pwd` diff --git a/ci/README.md b/ci/README.md index 39d9a19acc..dbebea289d 100644 --- a/ci/README.md +++ b/ci/README.md @@ -24,7 +24,6 @@ by invoking the script checker. * `benchmark`: run all benchmarks. * `format`: use `tools/format.sh` to enforce text formatting. -* `third_party.tags`: store third_party release tags. * `code.coverage`: build cmake targets with CXX option `--coverage` and run tests. diff --git a/ci/do_ci.ps1 b/ci/do_ci.ps1 index 42dd1c0140..a64ef13ef4 100644 --- a/ci/do_ci.ps1 +++ b/ci/do_ci.ps1 @@ -330,6 +330,17 @@ switch ($action) { $CXX_STANDARD = 14 } Write-Host "Using CXX_STANDARD: $CXX_STANDARD" + + if (Test-Path Env:\CMAKE_EXTRA_ARGS) { + # Split on any run of whitespace; filter out any empty tokens + $CMAKE_EXTRA_ARGS = $Env:CMAKE_EXTRA_ARGS -split '\s+' | + Where-Object { -not [string]::IsNullOrWhiteSpace($_) } + } + else { + $CMAKE_EXTRA_ARGS = @() + } + + Write-Host "CMAKE_EXTRA_ARGS is: $CMAKE_EXTRA_ARGS" $CMAKE_OPTIONS = @( "-DCMAKE_CXX_STANDARD=$CXX_STANDARD", @@ -362,7 +373,8 @@ switch ($action) { -DWITH_EXAMPLES=ON ` -DWITH_EXAMPLES_HTTP=ON ` -DBUILD_W3CTRACECONTEXT_TEST=ON ` - -DOPENTELEMETRY_INSTALL=ON + -DOPENTELEMETRY_INSTALL=ON ` + @CMAKE_EXTRA_ARGS $exit = $LASTEXITCODE if ($exit -ne 0) { diff --git a/ci/do_ci.sh b/ci/do_ci.sh index a7ed4945eb..177c667fea 100755 --- a/ci/do_ci.sh +++ b/ci/do_ci.sh @@ -367,9 +367,6 @@ elif [[ "$1" == "cmake.legacy.exporter.otprotocol.test" ]]; then -DWITH_OTLP_FILE=ON \ -DWITH_ASYNC_EXPORT_PREVIEW=ON \ "${SRC_DIR}" - grpc_cpp_plugin=`which grpc_cpp_plugin` - proto_make_file="CMakeFiles/opentelemetry_proto.dir/build.make" - sed -i "s~gRPC_CPP_PLUGIN_EXECUTABLE-NOTFOUND~$grpc_cpp_plugin~" ${proto_make_file} #fixme make -j $(nproc) cd exporters/otlp && make test exit 0 @@ -384,9 +381,6 @@ elif [[ "$1" == "cmake.exporter.otprotocol.test" ]]; then -DWITH_OTLP_GRPC_CREDENTIAL_PREVIEW=ON \ -DWITH_OTLP_RETRY_PREVIEW=ON \ "${SRC_DIR}" - grpc_cpp_plugin=`which grpc_cpp_plugin` - proto_make_file="CMakeFiles/opentelemetry_proto.dir/build.make" - sed -i "s~gRPC_CPP_PLUGIN_EXECUTABLE-NOTFOUND~$grpc_cpp_plugin~" ${proto_make_file} #fixme make -j $(nproc) cd exporters/otlp && make test exit 0 @@ -399,9 +393,6 @@ elif [[ "$1" == "cmake.exporter.otprotocol.shared_libs.with_static_grpc.test" ]] -DWITH_OTLP_FILE=ON \ -DBUILD_SHARED_LIBS=ON \ "${SRC_DIR}" - grpc_cpp_plugin=`which grpc_cpp_plugin` - proto_make_file="CMakeFiles/opentelemetry_proto.dir/build.make" - sed -i "s~gRPC_CPP_PLUGIN_EXECUTABLE-NOTFOUND~$grpc_cpp_plugin~" ${proto_make_file} #fixme make -j $(nproc) cd exporters/otlp && make test exit 0 @@ -414,9 +405,6 @@ elif [[ "$1" == "cmake.exporter.otprotocol.with_async_export.test" ]]; then -DWITH_OTLP_FILE=ON \ -DWITH_ASYNC_EXPORT_PREVIEW=ON \ "${SRC_DIR}" - grpc_cpp_plugin=`which grpc_cpp_plugin` - proto_make_file="CMakeFiles/opentelemetry_proto.dir/build.make" - sed -i "s~gRPC_CPP_PLUGIN_EXECUTABLE-NOTFOUND~$grpc_cpp_plugin~" ${proto_make_file} #fixme make -j $(nproc) cd exporters/otlp && make test exit 0 @@ -440,9 +428,6 @@ elif [[ "$1" == "cmake.do_not_install.test" ]]; then -DWITH_ASYNC_EXPORT_PREVIEW=ON \ -DOPENTELEMETRY_INSTALL=OFF \ "${SRC_DIR}" - grpc_cpp_plugin=`which grpc_cpp_plugin` - proto_make_file="CMakeFiles/opentelemetry_proto.dir/build.make" - sed -i "s~gRPC_CPP_PLUGIN_EXECUTABLE-NOTFOUND~$grpc_cpp_plugin~" ${proto_make_file} #fixme make -j $(nproc) cd exporters/otlp && make test exit 0 @@ -455,7 +440,8 @@ elif [[ "$1" == "cmake.install.test" ]]; then echo "BUILD_SHARED_LIBS is set to: OFF" fi CMAKE_OPTIONS+=("-DCMAKE_POSITION_INDEPENDENT_CODE=ON") - + read -r -a CMAKE_EXTRA_ARGS <<< "$CMAKE_EXTRA_ARGS" + echo "CMAKE_EXTRA_ARGS is set to: ${CMAKE_EXTRA_ARGS[*]}" cd "${BUILD_DIR}" rm -rf * rm -rf ${INSTALL_TEST_DIR}/* @@ -482,6 +468,7 @@ elif [[ "$1" == "cmake.install.test" ]]; then -DWITH_EXAMPLES_HTTP=ON \ -DBUILD_W3CTRACECONTEXT_TEST=ON \ -DOPENTELEMETRY_INSTALL=ON \ + "${CMAKE_EXTRA_ARGS[@]}" \ "${SRC_DIR}" make -j $(nproc) @@ -680,11 +667,6 @@ elif [[ "$1" == "code.coverage" ]]; then lcov --remove coverage.info '*/ext/http/server/*'> tmp_coverage.info 2>/dev/null cp tmp_coverage.info coverage.info exit 0 -elif [[ "$1" == "third_party.tags" ]]; then - echo "gRPC=v1.49.2" > third_party_release - echo "abseil=20240116.1" >> third_party_release - git submodule foreach --quiet 'echo "$name=$(git describe --tags HEAD)"' | sed 's:.*/::' >> third_party_release - exit 0 fi echo "Invalid do_ci.sh target, see ci/README.md for valid targets." diff --git a/ci/install_abseil.sh b/ci/install_abseil.sh deleted file mode 100755 index 04ac0e0037..0000000000 --- a/ci/install_abseil.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/bash - -# Copyright The OpenTelemetry Authors -# SPDX-License-Identifier: Apache-2.0 - -set -ex -export DEBIAN_FRONTEND=noninteractive -[ -z "${ABSEIL_CPP_VERSION}" ] && export ABSEIL_CPP_VERSION="20240116.1" - -TOPDIR=`pwd` - -BUILD_DIR=/tmp/ -INSTALL_DIR=/usr/local/ -pushd $BUILD_DIR -git clone --depth=1 -b ${ABSEIL_CPP_VERSION} https://github.com/abseil/abseil-cpp.git -cd abseil-cpp -ABSEIL_CPP_BUILD_OPTIONS=( - "-DBUILD_TESTING=OFF" - "-DCMAKE_POSITION_INDEPENDENT_CODE=ON" - "-DCMAKE_INSTALL_PREFIX=$INSTALL_DIR" -) - -if [ ! -z "${CXX_STANDARD}" ]; then - ABSEIL_CPP_BUILD_OPTIONS+=("-DCMAKE_CXX_STANDARD=${CXX_STANDARD}") - ABSEIL_CPP_BUILD_OPTIONS+=("-DCMAKE_CXX_STANDARD_REQUIRED=ON") - ABSEIL_CPP_BUILD_OPTIONS+=("-DCMAKE_CXX_EXTENSIONS=OFF") -fi - -# -# ABSEIL_CPP_VERSION="20240116.1" fails to build with CMake 3.30 -# ABSEIL_CPP_VERSION="20240116.2" fails to build with CMake 3.30 -# note that somehow the same builds with CMake 3.29.6 -# -# Error reported: -# CMake Error at CMake/AbseilHelpers.cmake:317 (target_link_libraries): -# The link interface of target "test_allocator" contains: -# -# GTest::gmock -# -# but the target was not found. Possible reasons include: -# -# * There is a typo in the target name. -# * A find_package call is missing for an IMPORTED target. -# * An ALIAS target is missing. -# -# Call Stack (most recent call first): -# absl/container/CMakeLists.txt:206 (absl_cc_library) -# -# Root cause: -# https://github.com/abseil/abseil-cpp/pull/1536 -# -# Applying fix from abseil commit 779a3565ac6c5b69dd1ab9183e500a27633117d5 -# -# TODO(marcalff) Cleanup once abseil is upgraded to the next LTS - - -if [ "${ABSEIL_CPP_VERSION}" = "20240116.1" ] || [ "${ABSEIL_CPP_VERSION}" = "20240116.2" ]; then - echo "Patching abseil" - patch -p1 < ${TOPDIR}/ci/fix-abseil-cpp-issue-1536.patch -else - echo "Not patching abseil" -fi - -echo "Building abseil ${ABSEIL_CPP_VERSION}" -echo "CMake build options:" "${ABSEIL_CPP_BUILD_OPTIONS[@]}" - -mkdir build && pushd build -cmake "${ABSEIL_CPP_BUILD_OPTIONS[@]}" .. -make -j $(nproc) -make install -popd -popd -export PATH=${INSTALL_DIR}/bin:$PATH # ensure to use the installed abseil diff --git a/ci/install_protobuf.sh b/ci/install_protobuf.sh deleted file mode 100755 index ac041b6334..0000000000 --- a/ci/install_protobuf.sh +++ /dev/null @@ -1,76 +0,0 @@ -#!/bin/bash - -# Copyright The OpenTelemetry Authors -# SPDX-License-Identifier: Apache-2.0 - -set -e - -[ -z "${PROTOBUF_VERSION}" ] && export PROTOBUF_VERSION="21.12" - -# -# Note -# -# protobuf uses two release number schemes, -# for example 3.21.12 and 21.12, -# and both tags corresponds to the same commit: -# -# commit f0dc78d7e6e331b8c6bb2d5283e06aa26883ca7c (HEAD -> release-3.21.12, tag: v3.21.12, tag: v21.12) -# Author: Protobuf Team Bot -# Date: Mon Dec 12 16:03:12 2022 -0800 -# -# Updating version.json and repo version numbers to: 21.12 -# -# tag v21.12 corresponds to the 'protoc version', or repo version -# tag v3.21.12 corresponds to the 'cpp version' -# -# protobuf-cpp-3.21.12.tar.gz: -# - is provided under releases/download/v21.12 -# - is no longer provided under releases/download/v3.21.12, -# -# Use the "repo version number" (PROTOBUF_VERSION=21.12) -# when calling this script -# - -CPP_PROTOBUF_BUILD_OPTIONS=( - "-DCMAKE_POSITION_INDEPENDENT_CODE=ON" - "-Dprotobuf_BUILD_TESTS=OFF" - "-Dprotobuf_BUILD_EXAMPLES=OFF" -) - -if [ ! -z "${CXX_STANDARD}" ]; then - CPP_PROTOBUF_BUILD_OPTIONS+=("-DCMAKE_CXX_STANDARD=${CXX_STANDARD}") - CPP_PROTOBUF_BUILD_OPTIONS+=("-DCMAKE_CXX_STANDARD_REQUIRED=ON") - CPP_PROTOBUF_BUILD_OPTIONS+=("-DCMAKE_CXX_EXTENSIONS=OFF") -fi - -# After protobuf 22/4.22, protobuf depends on absl and we can use -# "-Dprotobuf_ABSL_PROVIDER=package" to tell protobuf to find absl from the -# system. Otherwise, it will build absl from source. -# 4.XX.YY and 3.XX.YY are alias of XX.YY, and source pacakges are moved into the -# tag of XX.YY and without -cpp suffix from protobuf v22. -if [[ ${PROTOBUF_VERSION/.*/} -ge 22 ]]; then - export CPP_PROTOBUF_VERSION="${PROTOBUF_VERSION}" - CPP_PROTOBUF_PACKAGE_NAME="protobuf-${CPP_PROTOBUF_VERSION}" - CPP_PROTOBUF_BUILD_OPTIONS=(${CPP_PROTOBUF_BUILD_OPTIONS[@]} "-Dprotobuf_ABSL_PROVIDER=package") -else - export CPP_PROTOBUF_VERSION="3.${PROTOBUF_VERSION}" - CPP_PROTOBUF_PACKAGE_NAME="protobuf-cpp-${CPP_PROTOBUF_VERSION}" -fi - -cd /tmp -wget https://github.com/google/protobuf/releases/download/v${PROTOBUF_VERSION}/${CPP_PROTOBUF_PACKAGE_NAME}.tar.gz -tar zxf ${CPP_PROTOBUF_PACKAGE_NAME}.tar.gz --no-same-owner - -echo "Building protobuf ${CPP_PROTOBUF_VERSION}" -echo "CMake build options:" "${CPP_PROTOBUF_BUILD_OPTIONS[@]}" - -mkdir protobuf-${CPP_PROTOBUF_VERSION}/build && pushd protobuf-${CPP_PROTOBUF_VERSION}/build -if [ -e "../CMakeLists.txt" ]; then - cmake .. "${CPP_PROTOBUF_BUILD_OPTIONS[@]}" -else - cmake ../cmake "${CPP_PROTOBUF_BUILD_OPTIONS[@]}" -fi -make -j $(nproc) -make install -popd -ldconfig diff --git a/ci/install_thirdparty.sh b/ci/install_thirdparty.sh new file mode 100755 index 0000000000..0b7a62f59a --- /dev/null +++ b/ci/install_thirdparty.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +set -e + +# Usage ./install_thirdparty.sh +usage() { + echo "Usage: $0 " + echo " install-path: Path where third-party libraries will be installed" + echo " thirdparty-tags-file: Optional file containing tags for third-party libraries (default: opentelemetry-cpp/third_party_release)" + exit 1 +} + +THRIDPARTY_BUILD_DIR=$HOME/third-party-build +THIRDPARTY_TAGS_FILE='' +SRC_DIR="$(pwd)" + +if [ $# -eq 0 ] || [ $# -gt 2 ] || [ "$1" = "--help" ] || [ "$1" = "-h" ]; then + usage +fi + +if [ $# -ge 1 ]; then + THIRDPARTY_INSTALL_DIR="$1" +fi + +if [ $# -eq 2 ]; then + THIRDPARTY_TAGS_FILE="$2" +fi + +if [ ! -f "${SRC_DIR}/install/cmake/CMakeLists.txt" ]; then + echo "Error: ${SRC_DIR}/install/cmake/CMakeLists.txt not found" + echo "Please run this script from the root of the opentelemetry-cpp repository" + usage +fi + +mkdir -p "${THRIDPARTY_BUILD_DIR}" +cd "${THRIDPARTY_BUILD_DIR}" +rm -rf ./* + +cmake -S "${SRC_DIR}"/install/cmake -B . \ + -DCMAKE_INSTALL_PREFIX="${THIRDPARTY_INSTALL_DIR}" \ + -DCMAKE_CXX_STANDARD="$CXX_STANDARD" \ + -DOTELCPP_THIRDPARTY_FILE="${THIRDPARTY_TAGS_FILE}" \ + -DOTELCPP_PROTO_PATH="${OTELCPP_PROTO_PATH}" + +make -j"$(nproc)" + +if [ "${THIRDPARTY_INSTALL_DIR}" = "/usr/local" ]; then + ldconfig +fi diff --git a/ci/setup_ci_environment.sh b/ci/setup_ci_environment.sh index 794f2e490f..cbf170ef26 100755 --- a/ci/setup_ci_environment.sh +++ b/ci/setup_ci_environment.sh @@ -12,4 +12,6 @@ apt-get install --no-install-recommends --no-install-suggests -y \ git \ valgrind \ lcov \ - pkg-config + pkg-config \ + zlib1g-dev \ + sudo diff --git a/ci/setup_googletest.sh b/ci/setup_googletest.sh deleted file mode 100755 index 7b4a20840f..0000000000 --- a/ci/setup_googletest.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/bin/bash - -# Copyright The OpenTelemetry Authors -# SPDX-License-Identifier: Apache-2.0 - -set -e - -export DEBIAN_FRONTEND=noninteractive -apt-get update - -if [ -z "${GOOGLETEST_VERSION}" ]; then - # Version by default. Requires C++14. - export GOOGLETEST_VERSION=1.14.0 -fi - -OLD_GOOGLETEST_VERSION_REGEXP="^1\.([0-9]|10|11|12)(\..*)?$" - -if [[ ${GOOGLETEST_VERSION} =~ ${OLD_GOOGLETEST_VERSION_REGEXP} ]]; then - # Old (up to 1.12.x included) download URL format. - GOOGLETEST_VERSION_PATH="release-${GOOGLETEST_VERSION}" - GOOGLETEST_FOLDER_PATH="googletest-release-${GOOGLETEST_VERSION}" -else - # New (since 1.13.0) download URL format. - GOOGLETEST_VERSION_PATH="v${GOOGLETEST_VERSION}" - GOOGLETEST_FOLDER_PATH="googletest-${GOOGLETEST_VERSION}" -fi - -googletest_install() -{ - # Follows these instructions - # https://gist.github.com/dlime/313f74fd23e4267c4a915086b84c7d3d - tmp_dir=$(mktemp -d) - pushd $tmp_dir - wget https://github.com/google/googletest/archive/${GOOGLETEST_VERSION_PATH}.tar.gz - tar -xf ${GOOGLETEST_VERSION_PATH}.tar.gz - cd ${GOOGLETEST_FOLDER_PATH}/ - mkdir build && cd build - cmake .. -DBUILD_SHARED_LIBS=ON -DINSTALL_GTEST=ON -DCMAKE_INSTALL_PREFIX:PATH=/usr - make -j $(nproc) - make install - ldconfig - popd -} - -set +e -echo \ - libbenchmark-dev \ - zlib1g-dev \ - sudo \ - libcurl4-openssl-dev \ - nlohmann-json-dev \ - nlohmann-json3 \ - nlohmann-json3-dev | xargs -n 1 apt-get install --ignore-missing --no-install-recommends --no-install-suggests -y -set -e - -googletest_install diff --git a/ci/setup_grpc.sh b/ci/setup_grpc.sh deleted file mode 100755 index c922af50c7..0000000000 --- a/ci/setup_grpc.sh +++ /dev/null @@ -1,154 +0,0 @@ -#!/bin/bash - -# Copyright The OpenTelemetry Authors -# SPDX-License-Identifier: Apache-2.0 - -set -e -export DEBIAN_FRONTEND=noninteractive -old_grpc_version='v1.33.2' -new_grpc_version='v1.49.2' -modern_grpc_version='v1.55.0' -gcc_version_for_new_grpc='5.1' -std_version='14' -if [ ! -z "${CXX_STANDARD}" ]; then - std_version="${CXX_STANDARD}" -fi -install_grpc_version=${new_grpc_version} -install_dir='/usr/local/' -build_shared_libs='' -build_internal_abseil_cpp=1 -GRPC_BUILD_OPTIONS=() -usage() { - echo "Usage: $0 [options...]" 1>&2; - echo "Available options:" 1>&2; - echo " -v Set GCC version" 1>&2; - echo " -h Show help message and exit" 1>&2; - echo " -i Set installation prefix" 1>&2; - echo " -m Use the modern gRPC version" 1>&2; - echo " -p Let gRPC find protobuf or abseil-cpp by CONFIG package" 1>&2; - echo " -r Specify the version of gRPC" 1>&2; - echo " -s Specify std version(CMAKE_CXX_STANDARD)" 1>&2; - echo " -T Build static libraries" 1>&2; - echo " -H Build shared libraries" 1>&2; -} - -while getopts ":v:hi:mp:r:s:TH" o; do - case "${o}" in - v) - gcc_version=${OPTARG} - ;; - h) - usage - exit 0; - ;; - i) - install_dir=${OPTARG} - ;; - p) - if [ "${OPTARG}" == "protobuf" ]; then - GRPC_BUILD_OPTIONS=(${GRPC_BUILD_OPTIONS[@]} "-DgRPC_PROTOBUF_PROVIDER=package") - elif [ "${OPTARG}" == "abseil-cpp" ]; then - GRPC_BUILD_OPTIONS=(${GRPC_BUILD_OPTIONS[@]} "-DgRPC_ABSL_PROVIDER=package") - build_internal_abseil_cpp=0 - else - usage - exit 1; - fi - ;; - r) - install_grpc_version=${OPTARG} - ;; - m) - install_grpc_version=${modern_grpc_version} - ;; - s) - std_version=${OPTARG} - ;; - T) - build_shared_libs="OFF" - ;; - H) - build_shared_libs="ON" - ;; - *) - usage - exit 1; - ;; - esac -done - -if [ -z "${gcc_version}" ]; then - gcc_version=`gcc --version | awk '/gcc/ {print $NF}'` -fi -if [[ "${gcc_version}" < "${gcc_version_for_new_grpc}" ]] && [[ "${gcc_version:1:1}" == "." ]]; then - echo "${gcc_version} less than ${gcc_version_for_new_grpc}" - std_version='11' - install_grpc_version=${old_grpc_version} -fi -if ! type cmake > /dev/null; then - #cmake not installed, exiting - exit 1 -fi -export BUILD_DIR=/tmp/ -export INSTALL_DIR=${install_dir} -pushd $BUILD_DIR -echo "installing grpc version: ${install_grpc_version}" -git clone --depth=1 -b ${install_grpc_version} https://github.com/grpc/grpc -pushd grpc -git submodule init -git submodule update --depth 1 - -if [[ $build_internal_abseil_cpp -ne 0 ]]; then - mkdir -p "third_party/abseil-cpp/build" && pushd "third_party/abseil-cpp/build" - set -x - - ABSEIL_CPP_BUILD_OPTIONS=( - -DCMAKE_BUILD_TYPE=Release - -DCMAKE_CXX_STANDARD=${std_version} - -DCMAKE_CXX_STANDARD_REQUIRED=ON - -DCMAKE_CXX_EXTENSIONS=OFF - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE - -DCMAKE_INSTALL_PREFIX=$INSTALL_DIR - ) - if [ ! -z "$build_shared_libs" ]; then - ABSEIL_CPP_BUILD_OPTIONS=(${ABSEIL_CPP_BUILD_OPTIONS[@]} "-DBUILD_SHARED_LIBS=$build_shared_libs") - fi - cmake "${ABSEIL_CPP_BUILD_OPTIONS[@]}" .. - make -j $(nproc) - make install - popd -fi -mkdir -p build && pushd build - -GRPC_BUILD_OPTIONS=( - ${GRPC_BUILD_OPTIONS[@]} - -DgRPC_INSTALL=ON - -DCMAKE_CXX_STANDARD=${std_version} - -DCMAKE_CXX_STANDARD_REQUIRED=ON - -DCMAKE_CXX_EXTENSIONS=OFF - -DgRPC_BUILD_TESTS=OFF - -DgRPC_BUILD_GRPC_CPP_PLUGIN=ON - -DgRPC_BUILD_GRPC_CSHARP_PLUGIN=OFF - -DgRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN=OFF - -DgRPC_BUILD_GRPC_PHP_PLUGIN=OFF - -DgRPC_BUILD_GRPC_NODE_PLUGIN=OFF - -DgRPC_BUILD_GRPC_PYTHON_PLUGIN=OFF - -DgRPC_BUILD_GRPC_RUBY_PLUGIN=OFF - -DgRPC_BUILD_GRPCPP_OTEL_PLUGIN=OFF - -DCMAKE_INSTALL_PREFIX=$INSTALL_DIR - -DCMAKE_PREFIX_PATH=$INSTALL_DIR -) -if [ ! -z "$build_shared_libs" ]; then - GRPC_BUILD_OPTIONS=(${GRPC_BUILD_OPTIONS[@]} "-DBUILD_SHARED_LIBS=$build_shared_libs") -fi - -echo "Building gRPC ${install_grpc_version}" -echo "CMake build options:" "${GRPC_BUILD_OPTIONS[@]}" - -cmake "${GRPC_BUILD_OPTIONS[@]}" .. -make -j $(nproc) -make install -popd -popd - -export PATH=${INSTALL_DIR}/bin:$PATH # ensure to use the installed grpc diff --git a/ci/setup_windows_ci_environment.ps1 b/ci/setup_windows_ci_environment.ps1 index f5c761edb9..1773cf64c1 100755 --- a/ci/setup_windows_ci_environment.ps1 +++ b/ci/setup_windows_ci_environment.ps1 @@ -10,6 +10,9 @@ $VCPKG_DIR = (Get-Item -Path ".\").FullName ./bootstrap-vcpkg.bat ./vcpkg integrate install +# Microsoft.GSL +./vcpkg "--vcpkg-root=$VCPKG_DIR" install ms-gsl:x64-windows + # Google Benchmark ./vcpkg "--vcpkg-root=$VCPKG_DIR" install benchmark:x64-windows diff --git a/install/cmake/CMakeLists.txt b/install/cmake/CMakeLists.txt new file mode 100644 index 0000000000..2c31ede3cb --- /dev/null +++ b/install/cmake/CMakeLists.txt @@ -0,0 +1,382 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.14) +project(opentelemetry-cpp-thirdparty-install LANGUAGES CXX) + +# Added in CMake 3.16. ExternalProject_Add() with GIT_SUBMODULES "" initializes +# no submodules. +if(POLICY CMP0097) + cmake_policy(SET CMP0097 NEW) +endif() + +# Added in CMake 3.19 ExternalProject step targets fully adopt their steps. This +# is required for parallel builds. +if(POLICY CMP0114) + cmake_policy(SET CMP0114 NEW) +endif() + +# This file uses CMake's ExternalProject module to fetch, build, and install all +# opentelemetry-cpp dependencies + +include(ExternalProject) + +# Set the third-party version tags file to read. +set(OTELCPP_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/../..") +get_filename_component(OTELCPP_SOURCE_DIR "${OTELCPP_SOURCE_DIR}" ABSOLUTE) + +if(NOT DEFINED OTELCPP_THIRDPARTY_FILE) + set(OTELCPP_THIRDPARTY_FILE "${OTELCPP_SOURCE_DIR}/third_party_release") +elseif(NOT IS_ABSOLUTE OTELCPP_THIRDPARTY_FILE) + string(PREPEND OTELCPP_THIRDPARTY_FILE "${OTELCPP_SOURCE_DIR}/") +endif() + +message( + STATUS "Reading third-party version tags from ${OTELCPP_THIRDPARTY_FILE} ...") + +file(STRINGS "${OTELCPP_THIRDPARTY_FILE}" _THIRDPARTY_FILE_CONTENT) +set(_THIRDPARTY_PACKAGE_LIST "") + +# Parse the third-party tags file +foreach(_raw_line IN LISTS _THIRDPARTY_FILE_CONTENT) + string(STRIP "${_raw_line}" _line) + if(_line STREQUAL "" OR _line MATCHES "^#") + continue() + endif() + + # Match "package_name=git_tag" + if(_line MATCHES "^([^=]+)=(.+)$") + set(_package "${CMAKE_MATCH_1}") + set(_git_tag "${CMAKE_MATCH_2}") + set("${_package}_GIT_TAG" "${_git_tag}") + list(APPEND _THIRDPARTY_PACKAGE_LIST "${_package}") + message(STATUS " - ${_package}: ${${_package}_GIT_TAG}") + else() + message( + FATAL_ERROR + "Could not parse third-party tag. Invalid line in ${OTELCPP_THIRDPARTY_FILE}. Line:\n ${_raw_line}" + ) + endif() +endforeach() + +if(OTELCPP_THIRDPARTY_FILE STREQUAL + "${OPENTELEMETRY_CPP_SOURCE_DIR}/third_party_release") + set(USE_SUBMODULES ON) +else() + set(USE_SUBMODULES OFF) +endif() + +if(NOT DEFINED CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 17) +endif() + +set(CMAKE_OPTIONS + "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" + "-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}" + "-DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX}" + "-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}" + "-DCMAKE_CXX_STANDARD_REQUIRED=ON" + "-DCMAKE_CXX_EXTENSIONS=OFF" + "-DCMAKE_POSITION_INDEPENDENT_CODE=ON") + +message(STATUS "Installing third-party packages....") +message(STATUS " opentelemetry-cpp_SOURCE_DIR = ${OTELCPP_SOURCE_DIR}") +message(STATUS " third-party packages = ${_THIRDPARTY_PACKAGE_LIST}") +message(STATUS " third-party tags file = ${OTELCPP_THIRDPARTY_FILE}") +message(STATUS " opentelemetry-proto path = ${OTELCPP_PROTO_PATH}") +message(STATUS " CMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}") +message(STATUS " CMAKE_OPTIONS=${CMAKE_OPTIONS}") + +# ------------------------------------------------------------------------ +# ---- zlib ---- +ExternalProject_Add( + zlib + STEP_TARGETS install + GIT_REPOSITORY "https://github.com/madler/zlib.git" + GIT_TAG ${zlib_GIT_TAG} + GIT_SHALLOW ON + PREFIX ${CMAKE_BINARY_DIR}/external/zlib + INSTALL_DIR ${CMAKE_INSTALL_PREFIX} + CMAKE_ARGS "${CMAKE_OPTIONS}" "-DZLIB_BUILD_EXAMPLES=OFF") + +# ------------------------------------------------------------------------ +# ---- curl ---- +ExternalProject_Add( + curl + DEPENDS zlib + STEP_TARGETS build install + GIT_REPOSITORY "https://github.com/curl/curl.git" + GIT_TAG ${curl_GIT_TAG} + GIT_SHALLOW ON + PREFIX ${CMAKE_BINARY_DIR}/external/curl + INSTALL_DIR ${CMAKE_INSTALL_PREFIX} + CMAKE_ARGS "${CMAKE_OPTIONS}" + "-DCURL_USE_LIBPSL=OFF" + "-DBUILD_CURL_EXE=OFF" + "-DBUILD_LIBCURL_DOCS=OFF" + "-DBUILD_MISC_DOCS=OFF" + "-DENABLE_CURL_MANUAL=OFF" + "-DBUILD_SHARED_LIBS=ON") + +add_dependencies(curl-build zlib-install) +# ------------------------------------------------------------------------ +# ---- abseil-cpp ---- +ExternalProject_Add( + abseil + STEP_TARGETS install + GIT_REPOSITORY "https://github.com/abseil/abseil-cpp.git" + GIT_TAG ${abseil_GIT_TAG} + GIT_SHALLOW ON + PREFIX ${CMAKE_BINARY_DIR}/external/abseil + INSTALL_DIR ${CMAKE_INSTALL_PREFIX} + CMAKE_ARGS "${CMAKE_OPTIONS}" "-DABSL_BUILD_TESTING=OFF" + "-DABSL_ENABLE_INSTALL=ON") + +# ------------------------------------------------------------------------ +# ---- protobuf ---- +ExternalProject_Add( + protobuf + STEP_TARGETS build install + DEPENDS zlib abseil + GIT_REPOSITORY "https://github.com/protocolbuffers/protobuf.git" + GIT_TAG ${protobuf_GIT_TAG} + GIT_SHALLOW ON + GIT_SUBMODULES "" + PREFIX ${CMAKE_BINARY_DIR}/external/protobuf + INSTALL_DIR ${CMAKE_INSTALL_PREFIX} + CMAKE_ARGS "${CMAKE_OPTIONS}" + "-Dprotobuf_WITH_ZLIB=ON" + "-Dprotobuf_ZLIB_PROVIDER=package" + "-Dprotobuf_ABSL_PROVIDER=package" + "-Dprotobuf_INSTALL=ON" + "-Dprotobuf_BUILD_TESTS=OFF" + "-Dprotobuf_BUILD_EXAMPLES=OFF") + +add_dependencies(protobuf-build zlib-install abseil-install) + +# ------------------------------------------------------------------------ +# ---- grpc ---- +ExternalProject_Add( + grpc + DEPENDS zlib abseil protobuf + STEP_TARGETS build + GIT_REPOSITORY "https://github.com/grpc/grpc.git" + GIT_TAG ${grpc_GIT_TAG} + GIT_SHALLOW ON + GIT_SUBMODULES "third_party/re2" "third_party/cares/cares" + "third_party/boringssl-with-bazel" + PREFIX ${CMAKE_BINARY_DIR}/external/grpc + INSTALL_DIR ${CMAKE_INSTALL_PREFIX} + CMAKE_ARGS "${CMAKE_OPTIONS}" + "-DgRPC_INSTALL=ON" + "-DgRPC_BUILD_TESTS=OFF" + "-DgRPC_BUILD_GRPC_CPP_PLUGIN=ON" + "-DgRPC_BUILD_GRPC_CSHARP_PLUGIN=OFF" + "-DgRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN=OFF" + "-DgRPC_BUILD_GRPC_PHP_PLUGIN=OFF" + "-DgRPC_BUILD_GRPC_NODE_PLUGIN=OFF" + "-DgRPC_BUILD_GRPC_PYTHON_PLUGIN=OFF" + "-DgRPC_BUILD_GRPC_RUBY_PLUGIN=OFF" + "-DgRPC_BUILD_GRPCPP_OTEL_PLUGIN=OFF" + "-DRE2_BUILD_TESTING=OFF" + "-DgRPC_ZLIB_PROVIDER=package" + "-DgRPC_PROTOBUF_PROVIDER=package" + "-DgRPC_ABSL_PROVIDER=package") +add_dependencies(grpc-build zlib-install abseil-install protobuf-install) + +# ------------------------------------------------------------------------ +# ---- benchmark ---- +set(benchmark_ARGS + PREFIX + ${CMAKE_BINARY_DIR}/external/benchmark + INSTALL_DIR + ${CMAKE_INSTALL_PREFIX} + CMAKE_ARGS + "${CMAKE_OPTIONS}" + "-DBENCHMARK_ENABLE_TESTING=OFF" + "-DBENCHMARK_ENABLE_INSTALL=ON" + "-DBUILD_SHARED_LIBS=ON") + +if(USE_SUBMODULES + AND EXISTS "${OPENTELEMETRY_CPP_SOURCE_DIR}/third_party/benchmark/.git") + message(STATUS "Using submodule for benchmark") + ExternalProject_Add( + benchmark + SOURCE_DIR "${OPENTELEMETRY_CPP_SOURCE_DIR}/third_party/benchmark" + ${benchmark_ARGS}) +else() + ExternalProject_Add( + benchmark + GIT_REPOSITORY "https://github.com/google/benchmark.git" + GIT_TAG ${benchmark_GIT_TAG} + GIT_SHALLOW ON + ${benchmark_ARGS}) +endif() + +# ----------------------------------------------------------------------- +# ---- googletest ---- +set(googletest_ARGS + PREFIX + ${CMAKE_BINARY_DIR}/external/googletest + INSTALL_DIR + ${CMAKE_INSTALL_PREFIX} + CMAKE_ARGS + "${CMAKE_OPTIONS}" + "-DINSTALL_GTEST=ON" + "-DBUILD_GMOCK=ON" + "-DBUILD_SHARED_LIBS=ON") + +if(USE_SUBMODULES + AND EXISTS "${OPENTELEMETRY_CPP_SOURCE_DIR}/third_party/googletest/.git") + message(STATUS "Using submodule for googletest") + ExternalProject_Add( + googletest + SOURCE_DIR "${OPENTELEMETRY_CPP_SOURCE_DIR}/third_party/googletest" + ${googletest_ARGS}) +else() + ExternalProject_Add( + googletest + GIT_REPOSITORY "https://github.com/google/googletest.git" + GIT_TAG ${googletest_GIT_TAG} + GIT_SHALLOW ON + ${googletest_ARGS}) +endif() + +# ---------------------------------------------------------------------- +# ---- Microsoft.GSL ---- +set(ms-gsl_ARGS + PREFIX + ${CMAKE_BINARY_DIR}/external/ms-gsl + INSTALL_DIR + ${CMAKE_INSTALL_PREFIX} + CMAKE_ARGS + "${CMAKE_OPTIONS}" + "-DGSL_TEST=OFF" + "-DGSL_INSTALL=ON") + +if(USE_SUBMODULES AND EXISTS + "${OPENTELEMETRY_CPP_SOURCE_DIR}/third_party/ms-gsl/.git") + message(STATUS "Using submodule for ms-gsl") + ExternalProject_Add( + ms-gsl + SOURCE_DIR "${OPENTELEMETRY_CPP_SOURCE_DIR}/third_party/ms-gsl" + ${ms-gsl_ARGS}) +else() + ExternalProject_Add( + ms-gsl + GIT_REPOSITORY "https://github.com/microsoft/GSL.git" + GIT_TAG ${ms-gsl_GIT_TAG} + GIT_SHALLOW ON + ${ms-gsl_ARGS}) +endif() + +# ---------------------------------------------------------------------- +# ---- nlohmann-json ---- +set(nhlohmann-json_ARGS + PREFIX + ${CMAKE_BINARY_DIR}/external/nlohmann-json + INSTALL_DIR + ${CMAKE_INSTALL_PREFIX} + CMAKE_ARGS + "${CMAKE_OPTIONS}" + "-DJSON_BuildTests=OFF" + "-DJSON_Install=ON" + "-DJSON_MultipleHeaders=OFF") + +if(USE_SUBMODULES + AND EXISTS "${OPENTELEMETRY_CPP_SOURCE_DIR}/third_party/nlohmann-json/.git") + message(STATUS "Using submodule for nlohmann-json") + ExternalProject_Add( + nlohmann-json + SOURCE_DIR "${OPENTELEMETRY_CPP_SOURCE_DIR}/third_party/nlohmann-json" + ${nhlohmann-json_ARGS}) +else() + ExternalProject_Add( + nlohmann-json + GIT_REPOSITORY "https://github.com/nlohmann/json.git" + GIT_TAG ${nhlohmann-json_GIT_TAG} + GIT_SHALLOW ON + ${nhlohmann-json_ARGS}) +endif() + +# ---------------------------------------------------------------------- +# ---- opentelemetry-proto ---- +if(DEFINED OTELCPP_PROTO_PATH) + message( + STATUS + "Adding opentelemetry-proto: OTELCPP_PROTO_PATH: ${OTELCPP_PROTO_PATH}") + ExternalProject_Add( + opentelemetry-proto + GIT_REPOSITORY "https://github.com/open-telemetry/opentelemetry-proto.git" + GIT_TAG ${opentelemetry-proto_GIT_TAG} + GIT_SHALLOW ON + SOURCE_DIR ${OTELCPP_PROTO_PATH} + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "") +endif() + +# ---------------------------------------------------------------------- +# ---- opentracing-cpp ---- + +set(opentracing-cpp_ARGS + PREFIX + ${CMAKE_BINARY_DIR}/external/opentracing-cpp + INSTALL_DIR + ${CMAKE_INSTALL_PREFIX} + CMAKE_ARGS + "${CMAKE_OPTIONS}" + "-DBUILD_TESTING=OFF") + +if(USE_SUBMODULES + AND EXISTS + "${OPENTELEMETRY_CPP_SOURCE_DIR}/third_party/opentracing-cpp/.git") + message(STATUS "Using submodule for opentracing-cpp") + ExternalProject_Add( + opentracing-cpp + SOURCE_DIR "${OPENTELEMETRY_CPP_SOURCE_DIR}/third_party/opentracing-cpp" + ${opentracing-cpp_ARGS}) +else() + ExternalProject_Add( + opentracing-cpp + GIT_REPOSITORY "https://github.com/opentracing/opentracing-cpp.git" + GIT_TAG ${opentracing-cpp_GIT_TAG} + GIT_SHALLOW ON + ${opentracing-cpp_ARGS}) +endif() + +# ---------------------------------------------------------------------- +# ---- prometheus-cpp ---- +set(prometheus-cpp_ARGS + PREFIX + ${CMAKE_BINARY_DIR}/external/prometheus-cpp + INSTALL_DIR + ${CMAKE_INSTALL_PREFIX} + STEP_TARGETS + build + DEPENDS + zlib + curl + CMAKE_ARGS + "${CMAKE_OPTIONS}" + "-DENABLE_TESTING=OFF" + "-DENABLE_PUSH=ON" + "-DENABLE_PULL=ON") + +if(USE_SUBMODULES + AND EXISTS "${OPENTELEMETRY_CPP_SOURCE_DIR}/third_party/prometheus-cpp/.git") + message(STATUS "Using submodule for prometheus-cpp") + ExternalProject_Add( + prometheus-cpp + SOURCE_DIR "${OPENTELEMETRY_CPP_SOURCE_DIR}/third_party/prometheus-cpp" + ${prometheus-cpp_ARGS}) +else() + ExternalProject_Add( + prometheus-cpp + GIT_REPOSITORY "https://github.com/jupp0r/prometheus-cpp.git" + GIT_TAG ${prometheus-cpp_GIT_TAG} + GIT_SHALLOW ON + GIT_SUBMODULES "3rdparty/civetweb" ${prometheus-cpp_ARGS}) +endif() + +add_dependencies(prometheus-cpp-build zlib-install curl-install) diff --git a/install/cmake/third_party_latest b/install/cmake/third_party_latest new file mode 100644 index 0000000000..98a4e0a6a9 --- /dev/null +++ b/install/cmake/third_party_latest @@ -0,0 +1,17 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +# Latest version git tags of third-party dependencies + +abseil=20240722.1 +zlib=v1.3.1 +curl=curl-8_14_1 +protobuf=v6.30.2 +grpc=v1.72.1 +benchmark=v1.9.4 +googletest=v1.17.0 +ms-gsl=v4.2.0 +nlohmann-json=v3.12.0 +opentelemetry-proto=v1.7.0 +opentracing-cpp=v1.6.0 +prometheus-cpp=v1.3.0 diff --git a/install/cmake/third_party_minimum b/install/cmake/third_party_minimum new file mode 100644 index 0000000000..075cf5b004 --- /dev/null +++ b/install/cmake/third_party_minimum @@ -0,0 +1,18 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +# Minimum supported version git tags of third-party dependencies + +abseil=20220623.2 +zlib=v1.2.11 +curl=curl-7_81_0 +protobuf=v3.21.6 +grpc=v1.49.2 +benchmark=v1.6.1 +googletest=v1.12.0 +ms-gsl=v3.1.0 +nlohmann-json=v3.10.5 +opentelemetry-proto=v1.6.0 +opentracing-cpp=v1.6.0 +prometheus-cpp=v1.1.0 + diff --git a/install/cmake/third_party_stable b/install/cmake/third_party_stable new file mode 100644 index 0000000000..2e6c107ce1 --- /dev/null +++ b/install/cmake/third_party_stable @@ -0,0 +1,18 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +# "Stable" version git tags for third-party dependencies + +abseil=20230125.3 +zlib=v1.3.1 +curl=curl-8_12_0 +protobuf=v4.23.1 +grpc=v1.55.0 +benchmark=v1.8.3 +googletest=v1.14.0 +ms-gsl=v4.0.0 +nlohmann-json=v3.11.3 +opentelemetry-proto=v1.6.0 +opentracing-cpp=v1.6.0 +prometheus-cpp=v1.3.0 + diff --git a/install/conan/conanfile_latest.txt b/install/conan/conanfile_latest.txt index 6db1d7b130..bece732038 100644 --- a/install/conan/conanfile_latest.txt +++ b/install/conan/conanfile_latest.txt @@ -25,7 +25,7 @@ protobuf/*:shared=False abseil/*:fPIC=True abseil/*:shared=False opentracing-cpp/*:fPIC=True -opentracing-cpp/*:shared=True +opentracing-cpp/*:shared=False pcre2/*:with_bzip2=False [test_requires] diff --git a/install/test/cmake/component_tests/shims_opentracing/CMakeLists.txt b/install/test/cmake/component_tests/shims_opentracing/CMakeLists.txt index f541f15dd2..21440a7bd3 100644 --- a/install/test/cmake/component_tests/shims_opentracing/CMakeLists.txt +++ b/install/test/cmake/component_tests/shims_opentracing/CMakeLists.txt @@ -6,8 +6,12 @@ project(opentelemetry-cpp-shims_opentracing-install-test LANGUAGES CXX) find_package(opentelemetry-cpp REQUIRED COMPONENTS shims_opentracing) -if(NOT TARGET OpenTracing::opentracing) - message(FATAL_ERROR "OpenTracing::opentracing target not found") +if(NOT TARGET OpenTracing::opentracing AND NOT TARGET + OpenTracing::opentracing-static) + message( + FATAL_ERROR + "OpenTracing::opentracing or OpenTracing::opentracing-static was not found" + ) endif() find_package(GTest CONFIG REQUIRED) diff --git a/install/test/cmake/fetch_content_test/CMakeLists.txt b/install/test/cmake/fetch_content_test/CMakeLists.txt index 79df956248..99e6cd3d84 100644 --- a/install/test/cmake/fetch_content_test/CMakeLists.txt +++ b/install/test/cmake/fetch_content_test/CMakeLists.txt @@ -8,8 +8,6 @@ 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) @@ -27,8 +25,34 @@ message( ) include(FetchContent) + +FetchContent_Declare( + googletest SOURCE_DIR ${OPENTELEMETRY_CPP_SRC_DIR}/third_party/googletest) + FetchContent_Declare(opentelemetry-cpp SOURCE_DIR ${OPENTELEMETRY_CPP_SRC_DIR}) -FetchContent_MakeAvailable(opentelemetry-cpp) + +FetchContent_MakeAvailable(googletest opentelemetry-cpp) + +if(NOT DEFINED OPENTELEMETRY_VERSION OR OPENTELEMETRY_VERSION + VERSION_LESS_EQUAL 0.0.0) + message( + FATAL_ERROR + "OpenTelemetry C++ version not set after FetchContent_MakeAvailable(opentelemetry-cpp)." + ) +endif() + +if(NOT DEFINED OPENTELEMETRY_ABI_VERSION_NO OR OPENTELEMETRY_ABI_VERSION_NO + LESS 1) + message( + FATAL_ERROR + "OpenTelemetry C++ ABI version number not defined in the source directory" + ) +endif() + +message( + STATUS + "OpenTelemetry C++ version: ${OPENTELEMETRY_VERSION}, ABI version: ${OPENTELEMETRY_ABI_VERSION_NO}" +) add_executable( fetch_content_src_test diff --git a/third_party_release b/third_party_release index 8761dc9338..f07fcecfdb 100644 --- a/third_party_release +++ b/third_party_release @@ -1,23 +1,23 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 -# -# MAINTAINER -# -# This file is used for the CMake build. -# -# When changing (add, upgrade, remove) dependencies -# please update: -# - the Bazel build, see file -# /bazel/repository.bzl -# - git submodule, see command -# git submodule status -# -gRPC=v1.49.2 -abseil=20240116.1 +# Git tags of third-party dependencies + +# This file is used to: +# - Install third-party dependencies with the opentelemetry-cpp-thirdparty-install project (./install/cmake/CMakeLists.txt) +# - Fetch third-party dependencies with FetchContent when using CMake to build opentelemetry-cpp + +# To update a dependency version, manually edit the release git tag below. +# If the dependency is also a submodule, please manually update it to the new tag. + +abseil=20220623.2 +zlib=v1.3.1 +curl=curl-8_12_0 +protobuf=v3.21.6 +grpc=v1.49.2 benchmark=v1.8.3 -googletest=1.14.0 -ms-gsl=v3.1.0-67-g6f45293 +googletest=v1.14.0 +ms-gsl=v3.1.0 nlohmann-json=v3.12.0 opentelemetry-proto=v1.6.0 opentracing-cpp=v1.6.0 From 7cb256ad91cfd78691cb5a20d609183b64f6b982 Mon Sep 17 00:00:00 2001 From: Douglas Barker Date: Sun, 8 Jun 2025 19:30:13 -0600 Subject: [PATCH 3/7] Update the devcontainer to use the new install_thirdparty script. --- .devcontainer/Dockerfile.dev | 16 ++++------------ .devcontainer/README.md | 20 -------------------- .devcontainer/devcontainer.json | 5 +---- 3 files changed, 5 insertions(+), 36 deletions(-) diff --git a/.devcontainer/Dockerfile.dev b/.devcontainer/Dockerfile.dev index decee711fc..9fb2a291d6 100644 --- a/.devcontainer/Dockerfile.dev +++ b/.devcontainer/Dockerfile.dev @@ -9,15 +9,9 @@ ARG INSTALL_PACKAGES= ARG CXX_STANDARD=17 ARG CMAKE_VERSION=3.31.6 -ARG ABSEIL_CPP_VERSION=20230125.3 -ARG PROTOBUF_VERSION=23.3 -ARG GRPC_VERSION=v1.55.0 ENV CXX_STANDARD=${CXX_STANDARD} ENV CMAKE_VERSION=${CMAKE_VERSION} -ENV ABSEIL_CPP_VERSION=${ABSEIL_CPP_VERSION} -ENV PROTOBUF_VERSION=${PROTOBUF_VERSION} -ENV GRPC_VERSION=${GRPC_VERSION} COPY ci /opt/ci @@ -25,17 +19,12 @@ RUN apt update && apt install -y wget \ ninja-build \ llvm-dev \ libclang-dev \ - libcurl4-openssl-dev \ clang-tidy \ shellcheck RUN cd /opt/ci && bash setup_cmake.sh RUN cd /opt/ci && bash setup_ci_environment.sh RUN cd /opt/ci && bash install_iwyu.sh -RUN cd /opt && bash ci/setup_googletest.sh \ - && bash ci/install_abseil.sh \ - && bash ci/install_protobuf.sh \ - && bash ci/setup_grpc.sh -r $GRPC_VERSION -s $CXX_STANDARD -p protobuf -p abseil-cpp ADD https://github.com/bazelbuild/bazelisk/releases/download/v1.22.1/bazelisk-linux-amd64 /usr/local/bin @@ -48,6 +37,7 @@ ENV USER_UID=${USER_UID} ENV USER_GID=${USER_GID} ENV IS_CONTAINER_BUILD=true +COPY install /opt/install COPY ./.devcontainer/customize_container.sh /tmp/opentelemetry_cpp/devcontainer/customize_container.sh RUN /tmp/opentelemetry_cpp/devcontainer/customize_container.sh RUN apt install -y npm && npm install -g markdownlint-cli@0.44.0 @@ -55,7 +45,9 @@ RUN apt install -y npm && npm install -g markdownlint-cli@0.44.0 USER devuser WORKDIR /workspaces/opentelemetry-cpp +RUN cd /opt && bash ci/install_thirdparty.sh /home/devuser/third-party/install-stable install/cmake/third_party_stable +ENV CMAKE_PREFIX_PATH=/home/devuser/third-party/install-stable ENTRYPOINT [] -CMD ["/bin/bash"] \ No newline at end of file +CMD ["/bin/bash"] diff --git a/.devcontainer/README.md b/.devcontainer/README.md index bea6f8c4d5..fc9a2ccf4a 100644 --- a/.devcontainer/README.md +++ b/.devcontainer/README.md @@ -17,26 +17,6 @@ environment variables (for evaluation in `devcontainer.json`). * Host Environment Variable: `OTEL_CPP_DEVCONTAINER_CXX_STANDARD` -* **abseil-cpp version:** - This is the version of abseil-cpp that will be used to build protobuf, gRPC, - and opentelemetry-cpp. - * Docker ARG: - `ABSEIL_CPP_VERSION` - * Host Environment Variable: - `OTEL_CPP_DEVCONTAINER_ABSEIL_CPP_VERSION` - -* **Protobuf version:** - * Docker ARG: - `PROTOBUF_VERSION` - * Host Environment Variable: - `OTEL_CPP_DEVCONTAINER_PROTOBUF_VERSION` - -* **gRPC version:** - * Docker ARG: - `GRPC_VERSION` - * Host Environment Variable: - `OTEL_CPP_DEVCONTAINER_GRPC_VERSION` - * **User ID (UID):** User ID (Default: `1000`) * Docker ARG: diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 8087122423..63a17e614f 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -12,10 +12,7 @@ "USER_GID": "${localEnv:OTEL_CPP_DEVCONTAINER_USER_GID:1000}", "INSTALL_PACKAGES": "${localEnv:OTEL_CPP_DEVCONTAINER_INSTALL_PACKAGES:}", "CMAKE_VERSION": "${localEnv:OTEL_CPP_DEVCONTAINER_CMAKE_VERSION:3.31.6}", - "CXX_STANDARD": "${localEnv:OTEL_CPP_DEVCONTAINER_CXX_STANDARD:17}", - "GRPC_VERSION": "${localEnv:OTEL_CPP_DEVCONTAINER_GRPC_VERSION:v1.55.0}", - "PROTOBUF_VERSION": "${localEnv:OTEL_CPP_DEVCONTAINER_PROTOBUF_VERSION:23.3}", - "ABSEIL_CPP_VERSION":"${localEnv:OTEL_CPP_DEVCONTAINER_ABSEIL_CPP_VERSION:20230125.3}" + "CXX_STANDARD": "${localEnv:OTEL_CPP_DEVCONTAINER_CXX_STANDARD:17}" } }, "customizations": { From dc3e65f0f22221566680a941dc1acd9f6b826910 Mon Sep 17 00:00:00 2001 From: Douglas Barker Date: Sun, 8 Jun 2025 20:12:34 -0600 Subject: [PATCH 4/7] fix ci issues --- .github/workflows/ci.yml | 3 ++- .github/workflows/codeql-analysis.yml | 2 -- .github/workflows/iwyu.yml | 3 +-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2e7d9f8dcb..c6c8cfa18e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -913,7 +913,8 @@ jobs: uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit - + - name: setup + run: sudo ./ci/install_format_tools.sh - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: run tests run: ./ci/do_ci.sh format diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index d26461d6db..1c774bd2fc 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -34,9 +34,7 @@ jobs: env: CC: /usr/bin/gcc-12 CXX: /usr/bin/g++-12 - GOOGLETEST_VERSION: 1.12.1 run: | - sudo -E ./ci/setup_googletest.sh sudo -E ./ci/setup_ci_environment.sh - name: Initialize CodeQL uses: github/codeql-action/init@fca7ace96b7d713c7035871441bd52efbe39e27e # v3.28.19 diff --git a/.github/workflows/iwyu.yml b/.github/workflows/iwyu.yml index 8306039db2..9bfa69e96d 100644 --- a/.github/workflows/iwyu.yml +++ b/.github/workflows/iwyu.yml @@ -41,8 +41,7 @@ jobs: libgtest-dev \ libbenchmark-dev \ llvm-dev \ - libclang-dev \ - zlib1g-dev \ + libclang-dev sudo ./ci/setup_cmake.sh - name: Install include-what-you-use run: | From 6f5b1afe26de1554ab3ec3702e12943388aeaf85 Mon Sep 17 00:00:00 2001 From: Douglas Barker Date: Mon, 9 Jun 2025 10:43:49 -0600 Subject: [PATCH 5/7] fix and cleanup ci and clang-tidy github workflow files --- .github/workflows/ci.yml | 3 +-- .github/workflows/clang-tidy.yaml | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c6c8cfa18e..d950365f5a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -56,7 +56,6 @@ jobs: runs-on: ubuntu-24.04 env: CXX_STANDARD: '17' - BUILD_TYPE: 'Release' steps: - name: Harden the runner (Audit all outbound calls) uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 @@ -913,9 +912,9 @@ jobs: uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: setup run: sudo ./ci/install_format_tools.sh - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: run tests run: ./ci/do_ci.sh format diff --git a/.github/workflows/clang-tidy.yaml b/.github/workflows/clang-tidy.yaml index 93a8cd86d8..a3d2038914 100644 --- a/.github/workflows/clang-tidy.yaml +++ b/.github/workflows/clang-tidy.yaml @@ -24,8 +24,6 @@ jobs: - name: Setup Environment env: - PROTOBUF_VERSION: '23.3' - ABSEIL_CPP_VERSION: '20230125.3' CXX_STANDARD: '14' run: | sudo apt update -y From b5443d47a62885278300dd742a9c6360e456c404 Mon Sep 17 00:00:00 2001 From: Douglas Barker Date: Mon, 9 Jun 2025 10:47:38 -0600 Subject: [PATCH 6/7] clean up comments on third_party_release file. Fix installing third party projects using the git submodules --- install/cmake/CMakeLists.txt | 284 +++++++++++++++++------------------ third_party_release | 22 +-- 2 files changed, 154 insertions(+), 152 deletions(-) diff --git a/install/cmake/CMakeLists.txt b/install/cmake/CMakeLists.txt index 2c31ede3cb..cefb935f1d 100644 --- a/install/cmake/CMakeLists.txt +++ b/install/cmake/CMakeLists.txt @@ -25,7 +25,7 @@ include(ExternalProject) set(OTELCPP_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/../..") get_filename_component(OTELCPP_SOURCE_DIR "${OTELCPP_SOURCE_DIR}" ABSOLUTE) -if(NOT DEFINED OTELCPP_THIRDPARTY_FILE) +if(NOT OTELCPP_THIRDPARTY_FILE) set(OTELCPP_THIRDPARTY_FILE "${OTELCPP_SOURCE_DIR}/third_party_release") elseif(NOT IS_ABSOLUTE OTELCPP_THIRDPARTY_FILE) string(PREPEND OTELCPP_THIRDPARTY_FILE "${OTELCPP_SOURCE_DIR}/") @@ -59,8 +59,7 @@ foreach(_raw_line IN LISTS _THIRDPARTY_FILE_CONTENT) endif() endforeach() -if(OTELCPP_THIRDPARTY_FILE STREQUAL - "${OPENTELEMETRY_CPP_SOURCE_DIR}/third_party_release") +if(OTELCPP_THIRDPARTY_FILE STREQUAL "${OTELCPP_SOURCE_DIR}/third_party_release") set(USE_SUBMODULES ON) else() set(USE_SUBMODULES OFF) @@ -182,123 +181,122 @@ ExternalProject_Add( "-DgRPC_ZLIB_PROVIDER=package" "-DgRPC_PROTOBUF_PROVIDER=package" "-DgRPC_ABSL_PROVIDER=package") + add_dependencies(grpc-build zlib-install abseil-install protobuf-install) # ------------------------------------------------------------------------ # ---- benchmark ---- -set(benchmark_ARGS - PREFIX - ${CMAKE_BINARY_DIR}/external/benchmark - INSTALL_DIR - ${CMAKE_INSTALL_PREFIX} - CMAKE_ARGS - "${CMAKE_OPTIONS}" - "-DBENCHMARK_ENABLE_TESTING=OFF" - "-DBENCHMARK_ENABLE_INSTALL=ON" - "-DBUILD_SHARED_LIBS=ON") - -if(USE_SUBMODULES - AND EXISTS "${OPENTELEMETRY_CPP_SOURCE_DIR}/third_party/benchmark/.git") + +set(benchmark_ARGS "") +if(USE_SUBMODULES AND EXISTS "${OTELCPP_SOURCE_DIR}/third_party/benchmark/.git") message(STATUS "Using submodule for benchmark") - ExternalProject_Add( - benchmark - SOURCE_DIR "${OPENTELEMETRY_CPP_SOURCE_DIR}/third_party/benchmark" - ${benchmark_ARGS}) + list(APPEND benchmark_ARGS SOURCE_DIR + "${OTELCPP_SOURCE_DIR}/third_party/benchmark") else() - ExternalProject_Add( - benchmark - GIT_REPOSITORY "https://github.com/google/benchmark.git" - GIT_TAG ${benchmark_GIT_TAG} - GIT_SHALLOW ON - ${benchmark_ARGS}) + list( + APPEND + benchmark_ARGS + SOURCE_DIR + GIT_REPOSITORY + "https://github.com/google/benchmark.git" + GIT_TAG + ${benchmark_GIT_TAG} + GIT_SHALLOW + ON) endif() +ExternalProject_Add( + benchmark + ${benchmark_ARGS} + PREFIX ${CMAKE_BINARY_DIR}/external/benchmark + INSTALL_DIR ${CMAKE_INSTALL_PREFIX} + CMAKE_ARGS "${CMAKE_OPTIONS}" "-DBENCHMARK_ENABLE_TESTING=OFF" + "-DBENCHMARK_ENABLE_INSTALL=ON" "-DBUILD_SHARED_LIBS=ON") + # ----------------------------------------------------------------------- # ---- googletest ---- -set(googletest_ARGS - PREFIX - ${CMAKE_BINARY_DIR}/external/googletest - INSTALL_DIR - ${CMAKE_INSTALL_PREFIX} - CMAKE_ARGS - "${CMAKE_OPTIONS}" - "-DINSTALL_GTEST=ON" - "-DBUILD_GMOCK=ON" - "-DBUILD_SHARED_LIBS=ON") - -if(USE_SUBMODULES - AND EXISTS "${OPENTELEMETRY_CPP_SOURCE_DIR}/third_party/googletest/.git") + +set(googletest_ARGS "") +if(USE_SUBMODULES AND EXISTS + "${OTELCPP_SOURCE_DIR}/third_party/googletest/.git") message(STATUS "Using submodule for googletest") - ExternalProject_Add( - googletest - SOURCE_DIR "${OPENTELEMETRY_CPP_SOURCE_DIR}/third_party/googletest" - ${googletest_ARGS}) + list(APPEND googletest_ARGS SOURCE_DIR + "${OTELCPP_SOURCE_DIR}/third_party/googletest") else() - ExternalProject_Add( - googletest - GIT_REPOSITORY "https://github.com/google/googletest.git" - GIT_TAG ${googletest_GIT_TAG} - GIT_SHALLOW ON - ${googletest_ARGS}) + list( + APPEND + googletest_ARGS + GIT_REPOSITORY + "https://github.com/google/googletest.git" + GIT_TAG + ${googletest_GIT_TAG} + GIT_SHALLOW + ON) endif() +ExternalProject_Add( + googletest + ${googletest_ARGS} + PREFIX ${CMAKE_BINARY_DIR}/external/googletest + INSTALL_DIR ${CMAKE_INSTALL_PREFIX} + CMAKE_ARGS "${CMAKE_OPTIONS}" "-DINSTALL_GTEST=ON" "-DBUILD_GMOCK=ON" + "-DBUILD_SHARED_LIBS=ON") + # ---------------------------------------------------------------------- # ---- Microsoft.GSL ---- -set(ms-gsl_ARGS - PREFIX - ${CMAKE_BINARY_DIR}/external/ms-gsl - INSTALL_DIR - ${CMAKE_INSTALL_PREFIX} - CMAKE_ARGS - "${CMAKE_OPTIONS}" - "-DGSL_TEST=OFF" - "-DGSL_INSTALL=ON") -if(USE_SUBMODULES AND EXISTS - "${OPENTELEMETRY_CPP_SOURCE_DIR}/third_party/ms-gsl/.git") +set(ms-gsl_ARGS "") +if(USE_SUBMODULES AND EXISTS "${OTELCPP_SOURCE_DIR}/third_party/ms-gsl/.git") message(STATUS "Using submodule for ms-gsl") - ExternalProject_Add( - ms-gsl - SOURCE_DIR "${OPENTELEMETRY_CPP_SOURCE_DIR}/third_party/ms-gsl" - ${ms-gsl_ARGS}) + list(APPEND ms-gsl_ARGS SOURCE_DIR "${OTELCPP_SOURCE_DIR}/third_party/ms-gsl") else() - ExternalProject_Add( - ms-gsl - GIT_REPOSITORY "https://github.com/microsoft/GSL.git" - GIT_TAG ${ms-gsl_GIT_TAG} - GIT_SHALLOW ON - ${ms-gsl_ARGS}) + list( + APPEND + ms-gsl_ARGS + GIT_REPOSITORY + "https://github.com/microsoft/GSL.git" + GIT_TAG + ${ms-gsl_GIT_TAG} + GIT_SHALLOW + ON) endif() +ExternalProject_Add( + ms-gsl + ${ms-gsl_ARGS} + PREFIX ${CMAKE_BINARY_DIR}/external/ms-gsl + INSTALL_DIR ${CMAKE_INSTALL_PREFIX} + CMAKE_ARGS "${CMAKE_OPTIONS}" "-DGSL_TEST=OFF" "-DGSL_INSTALL=ON") + # ---------------------------------------------------------------------- # ---- nlohmann-json ---- -set(nhlohmann-json_ARGS - PREFIX - ${CMAKE_BINARY_DIR}/external/nlohmann-json - INSTALL_DIR - ${CMAKE_INSTALL_PREFIX} - CMAKE_ARGS - "${CMAKE_OPTIONS}" - "-DJSON_BuildTests=OFF" - "-DJSON_Install=ON" - "-DJSON_MultipleHeaders=OFF") - -if(USE_SUBMODULES - AND EXISTS "${OPENTELEMETRY_CPP_SOURCE_DIR}/third_party/nlohmann-json/.git") + +set(nhlohmann-json_ARGS "") +if(USE_SUBMODULES AND EXISTS + "${OTELCPP_SOURCE_DIR}/third_party/nlohmann-json/.git") message(STATUS "Using submodule for nlohmann-json") - ExternalProject_Add( - nlohmann-json - SOURCE_DIR "${OPENTELEMETRY_CPP_SOURCE_DIR}/third_party/nlohmann-json" - ${nhlohmann-json_ARGS}) + list(APPEND nhlohmann-json_ARGS SOURCE_DIR + "${OTELCPP_SOURCE_DIR}/third_party/nlohmann-json") else() - ExternalProject_Add( - nlohmann-json - GIT_REPOSITORY "https://github.com/nlohmann/json.git" - GIT_TAG ${nhlohmann-json_GIT_TAG} - GIT_SHALLOW ON - ${nhlohmann-json_ARGS}) + list( + APPEND + nhlohmann-json_ARGS + GIT_REPOSITORY + "https://github.com/nlohmann/json.git" + GIT_TAG + ${nhlohmann-json_GIT_TAG} + GIT_SHALLOW + ON) endif() +ExternalProject_Add( + nlohmann-json + ${nhlohmann-json_ARGS} + PREFIX ${CMAKE_BINARY_DIR}/external/nlohmann-json + INSTALL_DIR ${CMAKE_INSTALL_PREFIX} + CMAKE_ARGS "${CMAKE_OPTIONS}" "-DJSON_BuildTests=OFF" "-DJSON_Install=ON" + "-DJSON_MultipleHeaders=OFF") + # ---------------------------------------------------------------------- # ---- opentelemetry-proto ---- if(DEFINED OTELCPP_PROTO_PATH) @@ -319,64 +317,64 @@ endif() # ---------------------------------------------------------------------- # ---- opentracing-cpp ---- -set(opentracing-cpp_ARGS - PREFIX - ${CMAKE_BINARY_DIR}/external/opentracing-cpp - INSTALL_DIR - ${CMAKE_INSTALL_PREFIX} - CMAKE_ARGS - "${CMAKE_OPTIONS}" - "-DBUILD_TESTING=OFF") - -if(USE_SUBMODULES - AND EXISTS - "${OPENTELEMETRY_CPP_SOURCE_DIR}/third_party/opentracing-cpp/.git") +set(opentracing-cpp_ARGS "") +if(USE_SUBMODULES AND EXISTS + "${OTELCPP_SOURCE_DIR}/third_party/opentracing-cpp/.git") message(STATUS "Using submodule for opentracing-cpp") - ExternalProject_Add( - opentracing-cpp - SOURCE_DIR "${OPENTELEMETRY_CPP_SOURCE_DIR}/third_party/opentracing-cpp" - ${opentracing-cpp_ARGS}) + list(APPEND opentracing-cpp_ARGS SOURCE_DIR + "${OTELCPP_SOURCE_DIR}/third_party/opentracing-cpp" + ${opentracing-cpp_ARGS}) else() - ExternalProject_Add( - opentracing-cpp - GIT_REPOSITORY "https://github.com/opentracing/opentracing-cpp.git" - GIT_TAG ${opentracing-cpp_GIT_TAG} - GIT_SHALLOW ON - ${opentracing-cpp_ARGS}) + list( + APPEND + opentracing-cpp_ARGS + GIT_REPOSITORY + "https://github.com/opentracing/opentracing-cpp.git" + GIT_TAG + ${opentracing-cpp_GIT_TAG} + GIT_SHALLOW + ON) endif() +ExternalProject_Add( + opentracing-cpp + ${opentracing-cpp_ARGS} + PREFIX ${CMAKE_BINARY_DIR}/external/opentracing-cpp + INSTALL_DIR ${CMAKE_INSTALL_PREFIX} + CMAKE_ARGS "${CMAKE_OPTIONS}" "-DBUILD_TESTING=OFF") + # ---------------------------------------------------------------------- # ---- prometheus-cpp ---- -set(prometheus-cpp_ARGS - PREFIX - ${CMAKE_BINARY_DIR}/external/prometheus-cpp - INSTALL_DIR - ${CMAKE_INSTALL_PREFIX} - STEP_TARGETS - build - DEPENDS - zlib - curl - CMAKE_ARGS - "${CMAKE_OPTIONS}" - "-DENABLE_TESTING=OFF" - "-DENABLE_PUSH=ON" - "-DENABLE_PULL=ON") - -if(USE_SUBMODULES - AND EXISTS "${OPENTELEMETRY_CPP_SOURCE_DIR}/third_party/prometheus-cpp/.git") + +set(prometheus-cpp_ARGS "") +if(USE_SUBMODULES AND EXISTS + "${OTELCPP_SOURCE_DIR}/third_party/prometheus-cpp/.git") message(STATUS "Using submodule for prometheus-cpp") - ExternalProject_Add( - prometheus-cpp - SOURCE_DIR "${OPENTELEMETRY_CPP_SOURCE_DIR}/third_party/prometheus-cpp" - ${prometheus-cpp_ARGS}) + list(APPEND prometheus-cpp_ARGS SOURCE_DIR + "${OTELCPP_SOURCE_DIR}/third_party/prometheus-cpp") else() - ExternalProject_Add( - prometheus-cpp - GIT_REPOSITORY "https://github.com/jupp0r/prometheus-cpp.git" - GIT_TAG ${prometheus-cpp_GIT_TAG} - GIT_SHALLOW ON - GIT_SUBMODULES "3rdparty/civetweb" ${prometheus-cpp_ARGS}) + + list( + APPEND + prometheus-cpp_ARGS + GIT_REPOSITORY + "https://github.com/jupp0r/prometheus-cpp.git" + GIT_TAG + "${prometheus-cpp_GIT_TAG}" + GIT_SHALLOW + ON + GIT_SUBMODULES + "3rdparty/civetweb") endif() +ExternalProject_Add( + prometheus-cpp + ${prometheus-cpp_ARGS} + PREFIX ${CMAKE_BINARY_DIR}/external/prometheus-cpp + INSTALL_DIR ${CMAKE_INSTALL_PREFIX} + STEP_TARGETS build + DEPENDS zlib curl + CMAKE_ARGS "${CMAKE_OPTIONS}" "-DENABLE_TESTING=OFF" "-DENABLE_PUSH=ON" + "-DENABLE_PULL=ON") + add_dependencies(prometheus-cpp-build zlib-install curl-install) diff --git a/third_party_release b/third_party_release index f07fcecfdb..7ca70de723 100644 --- a/third_party_release +++ b/third_party_release @@ -1,14 +1,18 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 - -# Git tags of third-party dependencies - -# This file is used to: -# - Install third-party dependencies with the opentelemetry-cpp-thirdparty-install project (./install/cmake/CMakeLists.txt) -# - Fetch third-party dependencies with FetchContent when using CMake to build opentelemetry-cpp - -# To update a dependency version, manually edit the release git tag below. -# If the dependency is also a submodule, please manually update it to the new tag. +# +# MAINTAINER +# +# This file is used for the CMake build. +# Format: = +# +# When changing (add, upgrade, remove) dependencies +# please update: +# - manually edit the release git tag below. +# - update the matching git submodule to the new tag. +# - update the Bazel build files +# - opentelemetry-cpp/MODULE.bazel +# - opentelemetry-cpp/bazel/repository.bzl abseil=20220623.2 zlib=v1.3.1 From 94875f17a59996185835b8f09aed5073b23646fb Mon Sep 17 00:00:00 2001 From: Douglas Barker Date: Mon, 9 Jun 2025 12:48:32 -0600 Subject: [PATCH 7/7] add test for WITH_API_ONLY and fix the main cmake file so that option overrides third party package finds/fetches as required --- .github/workflows/ci.yml | 5 +- CMakeLists.txt | 133 ++++++++++-------- ci/do_ci.sh | 11 ++ cmake/otel-install-functions.cmake | 1 - .../test/cmake/api_only_test/CMakeLists.txt | 95 +++++++++++++ 5 files changed, 182 insertions(+), 63 deletions(-) create mode 100644 install/test/cmake/api_only_test/CMakeLists.txt diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d950365f5a..cb8932a76a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -68,9 +68,12 @@ jobs: run: | sudo -E ./ci/setup_ci_environment.sh sudo -E ./ci/setup_cmake.sh - - name: run fetch content cmake test + - name: run fetch content test run: | ./ci/do_ci.sh cmake.fetch_content.test + - name: run api only test + run: | + ./ci/do_ci.sh cmake.api_only.test cmake_gcc_maintainer_sync_test: name: CMake gcc 14 (maintainer mode, sync) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6eb62a8dc6..6fd6b3954e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -260,84 +260,94 @@ if(MSVC) endif() endif() -if(NOT WITH_API_ONLY) - include("${opentelemetry-cpp_SOURCE_DIR}/cmake/threads.cmake") -endif() +# +# API ONLY Dependencies +# if(WITH_GSL) include("${opentelemetry-cpp_SOURCE_DIR}/cmake/ms-gsl.cmake") endif() # -# Do we need HTTP CLIENT CURL ? +# SDK and Exporter Dependencies # -if(WITH_OTLP_HTTP - OR WITH_ELASTICSEARCH - OR WITH_ZIPKIN - OR BUILD_W3CTRACECONTEXT_TEST - OR WITH_EXAMPLES_HTTP) - set(WITH_HTTP_CLIENT_CURL ON) -else() - set(WITH_HTTP_CLIENT_CURL OFF) -endif() +if(NOT WITH_API_ONLY) -# -# Do we need ZLIB ? -# + if(WITH_OPENTRACING) + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/opentracing-cpp.cmake") + endif() -if((NOT WITH_API_ONLY) - AND WITH_HTTP_CLIENT_CURL - AND WITH_OTLP_HTTP_COMPRESSION) - include("${opentelemetry-cpp_SOURCE_DIR}/cmake/zlib.cmake") -endif() + # Always include Threads for the SDK -# -# Do we need CURL ? -# + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/threads.cmake") -if((NOT WITH_API_ONLY) AND WITH_HTTP_CLIENT_CURL) - include("${opentelemetry-cpp_SOURCE_DIR}/cmake/curl.cmake") -endif() + # + # Do we need HTTP CLIENT CURL ? + # -if(WITH_OTLP_GRPC - OR WITH_OTLP_HTTP - OR WITH_OTLP_FILE) + set(WITH_HTTP_CLIENT_CURL OFF) + if(WITH_OTLP_HTTP + OR WITH_ELASTICSEARCH + OR WITH_ZIPKIN + OR BUILD_W3CTRACECONTEXT_TEST + OR WITH_EXAMPLES_HTTP) + set(WITH_HTTP_CLIENT_CURL ON) + endif() - if(WITH_OTLP_GRPC) - include("${opentelemetry-cpp_SOURCE_DIR}/cmake/grpc.cmake") + # + # Do we need ZLIB ? + # + + if(WITH_HTTP_CLIENT_CURL AND WITH_OTLP_HTTP_COMPRESSION) + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/zlib.cmake") endif() - include("${opentelemetry-cpp_SOURCE_DIR}/cmake/protobuf.cmake") - include("${opentelemetry-cpp_SOURCE_DIR}/cmake/opentelemetry-proto.cmake") -endif() + # + # Do we need CURL ? + # -# -# Do we need NLOHMANN_JSON ? -# + if(WITH_HTTP_CLIENT_CURL) + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/curl.cmake") + endif() -if(WITH_ELASTICSEARCH - OR WITH_ZIPKIN - OR WITH_OTLP_HTTP - OR WITH_OTLP_FILE - OR BUILD_W3CTRACECONTEXT_TEST - OR WITH_ETW) - set(USE_NLOHMANN_JSON ON) -else() - set(USE_NLOHMANN_JSON OFF) -endif() + # + # Do we need gRPC, Protobuf, and opentelemetry-proto ? + # -if((NOT WITH_API_ONLY) AND USE_NLOHMANN_JSON) - include("${opentelemetry-cpp_SOURCE_DIR}/cmake/nlohmann-json.cmake") -endif() + if(WITH_OTLP_GRPC + OR WITH_OTLP_HTTP + OR WITH_OTLP_FILE) -if(WITH_PROMETHEUS) - include("${opentelemetry-cpp_SOURCE_DIR}/cmake/prometheus-cpp.cmake") -endif() + # Include gRPC before Protobuf We'll use the gRPC submodules for Protobuf + # and Abseil with FetchContent -if(WITH_OPENTRACING) - include("${opentelemetry-cpp_SOURCE_DIR}/cmake/opentracing-cpp.cmake") -endif() + if(WITH_OTLP_GRPC) + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/grpc.cmake") + endif() + + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/protobuf.cmake") + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/opentelemetry-proto.cmake") + endif() + + # + # Do we need NLOHMANN_JSON ? + # + + if(WITH_ELASTICSEARCH + OR WITH_ZIPKIN + OR WITH_OTLP_HTTP + OR WITH_OTLP_FILE + OR BUILD_W3CTRACECONTEXT_TEST + OR WITH_ETW) + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/nlohmann-json.cmake") + endif() + + if(WITH_PROMETHEUS) + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/prometheus-cpp.cmake") + endif() + +endif(NOT WITH_API_ONLY) if(OTELCPP_MAINTAINER_MODE) if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") @@ -461,11 +471,12 @@ otel_print_build_config() add_subdirectory(api) -if(WITH_OPENTRACING) - add_subdirectory(opentracing-shim) -endif() - if(NOT WITH_API_ONLY) + + if(WITH_OPENTRACING) + add_subdirectory(opentracing-shim) + endif() + add_subdirectory(sdk) add_subdirectory(ext) add_subdirectory(exporters) diff --git a/ci/do_ci.sh b/ci/do_ci.sh index 177c667fea..ea9b6ba9e4 100755 --- a/ci/do_ci.sh +++ b/ci/do_ci.sh @@ -543,6 +543,17 @@ elif [[ "$1" == "cmake.fetch_content.test" ]]; then make test exit 0 +elif [[ "$1" == "cmake.api_only.test" ]]; then + cd "${BUILD_DIR}" + rm -rf * + cmake "${CMAKE_OPTIONS[@]}" \ + -DOPENTELEMETRY_INSTALL=OFF \ + -DOPENTELEMETRY_CPP_SRC_DIR="${SRC_DIR}" \ + "${SRC_DIR}/install/test/cmake/api_only_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/otel-install-functions.cmake b/cmake/otel-install-functions.cmake index 80b604cb8c..8139ee42b4 100644 --- a/cmake/otel-install-functions.cmake +++ b/cmake/otel-install-functions.cmake @@ -868,7 +868,6 @@ function(otel_print_build_config) message(STATUS "---------------------------------------------") message(STATUS "third-party options") message(STATUS "---------------------------------------------") - message(STATUS "WITH_NLOHMANN_JSON: ${USE_NLOHMANN_JSON}") message(STATUS "WITH_CURL_LOGGING: ${WITH_CURL_LOGGING}") message(STATUS "WITH_OTLP_HTTP_COMPRESSION: ${WITH_OTLP_HTTP_COMPRESSION}") message(STATUS "---------------------------------------------") diff --git a/install/test/cmake/api_only_test/CMakeLists.txt b/install/test/cmake/api_only_test/CMakeLists.txt new file mode 100644 index 0000000000..79eb205caf --- /dev/null +++ b/install/test/cmake/api_only_test/CMakeLists.txt @@ -0,0 +1,95 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +# This test covers the WITH_API_ONLY build option of opentelemetry-cpp. It +# ensures that no third-party libraries are included in the build and that only +# the opentelemetry-cpp::api target is created. + +# CMake 3.24+ is required to test all targets imported globally + +cmake_minimum_required(VERSION 3.24) + +project(opentelemetry-cpp-api-only-test LANGUAGES CXX) + +if(NOT OPENTELEMETRY_CPP_SRC_DIR) + message( + FATAL_ERROR + "OPENTELEMETRY_CPP_SRC_DIR must be defined when running cmake on this test project" + ) +endif() + +# This setting requires CMake 3.24 or later +set(CMAKE_FIND_PACKAGE_TARGETS_GLOBAL ON) + +# Turn on the WITH_API_ONLY build option and disable GSL. This must override any +# other options and not import third party targets. +set(WITH_API_ONLY ON) +set(WITH_GSL OFF) + +# Turn on all components that should be overridden by WITH_API_ONLY +set(WITH_OTLP_FILE ON) +set(WITH_OTLP_HTTP ON) +set(WITH_OTLP_GRPC ON) +set(WITH_OTLP_HTTP_COMPRESSION ON) +set(WITH_PROMETHEUS ON) +set(WITH_ZIPKIN ON) +set(WITH_ELASTICSEARCH ON) +set(WITH_OPENTRACING ON) + +# Build testing off should disable importing Gtest and Benchmark targets +set(BUILD_TESTING OFF) + +include(FetchContent) +FetchContent_Declare(opentelemetry-cpp SOURCE_DIR ${OPENTELEMETRY_CPP_SRC_DIR}) +FetchContent_MakeAvailable(opentelemetry-cpp) + +set(UNEXPECTED_TARGETS + opentelemetry-cpp::sdk + Microsoft.GSL::GSL + Threads::Threads + ZLIB::ZLIB + CURL::libcurl + protobuf::libprotobuf + gRPC::grpc++ + nlohmann_json::nlohmann_json + OpenTracing::opentracing + OpenTracing::opentracing_static + GTest::gtest + benchmark::benchmark + prometheus-cpp::core) + +foreach(target IN LISTS UNEXPECTED_TARGETS) + if(TARGET ${target}) + message( + FATAL_ERROR + "Unexpected target ${target} was created in an WITH_API_ONLY build.") + endif() +endforeach() + +if(NOT TARGET opentelemetry-cpp::api) + message( + FATAL_ERROR + "opentelemetry-cpp::api target was not created in an WITH_API_ONLY build." + ) +endif() + +FetchContent_Declare( + googletest SOURCE_DIR ${OPENTELEMETRY_CPP_SRC_DIR}/third_party/googletest) + +FetchContent_MakeAvailable(googletest) + +add_executable(api_only_test + ${OPENTELEMETRY_CPP_SRC_DIR}/install/test/src/test_api.cc) + +target_link_libraries(api_only_test PRIVATE opentelemetry-cpp::api GTest::gtest + GTest::gtest_main) + +set(BUILD_TESTING ON) + +include(CTest) +include(GoogleTest) + +gtest_add_tests( + TARGET api_only_test + TEST_PREFIX api_only. + TEST_LIST api_only_test)