diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4134a5539f..2ee56c0f25 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -48,7 +48,7 @@ jobs: - name: setup run: | sudo -E ./ci/setup_ci_environment.sh - sudo -E ./ci/setup_googletest.sh + sudo -E apt-get install -y zlib1g-dev libcurl4-openssl-dev nlohmann-json3-dev - name: run cmake tests run: | ./ci/do_ci.sh cmake.test @@ -70,11 +70,10 @@ jobs: - name: setup run: | sudo -E ./ci/setup_ci_environment.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 zlib1g-dev libcurl4-openssl-dev 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 @@ -325,7 +324,7 @@ jobs: CXX: /usr/bin/g++-12 run: | sudo -E ./ci/setup_ci_environment.sh - sudo -E ./ci/setup_googletest.sh + sudo -E apt-get install -y zlib1g-dev libcurl4-openssl-dev - name: run cmake tests (without otlp-exporter) env: CC: /usr/bin/gcc-12 @@ -348,7 +347,6 @@ jobs: - name: setup run: | sudo -E ./ci/setup_ci_environment.sh - sudo -E ./ci/setup_googletest.sh - name: run cmake tests (enable opentracing-shim) run: ./ci/do_ci.sh cmake.opentracing_shim.test @@ -367,7 +365,6 @@ jobs: - name: setup run: | sudo -E ./ci/setup_ci_environment.sh - sudo -E ./ci/setup_googletest.sh - name: run tests (enable stl) env: CXX_STANDARD: '14' @@ -388,7 +385,6 @@ jobs: - name: setup run: | sudo -E ./ci/setup_ci_environment.sh - sudo -E ./ci/setup_googletest.sh - name: run tests (enable stl) env: CXX_STANDARD: '17' @@ -409,7 +405,6 @@ jobs: - name: setup run: | sudo -E ./ci/setup_ci_environment.sh - sudo -E ./ci/setup_googletest.sh - name: run tests env: CXX_STANDARD: '20' @@ -438,7 +433,6 @@ jobs: CXXFLAGS: "-stdlib=libc++" run: | sudo -E ./ci/setup_ci_environment.sh - sudo -E ./ci/setup_googletest.sh - name: run tests env: CC: /usr/bin/clang @@ -469,7 +463,6 @@ jobs: - name: setup run: | sudo -E ./ci/setup_ci_environment.sh - sudo -E ./ci/setup_googletest.sh - name: run tests env: CXX_STANDARD: '23' @@ -498,7 +491,6 @@ jobs: CXXFLAGS: "-stdlib=libc++" run: | sudo -E ./ci/setup_ci_environment.sh - sudo -E ./ci/setup_googletest.sh - name: run tests env: CC: /usr/bin/clang @@ -630,7 +622,6 @@ jobs: CXX: /usr/bin/g++-12 run: | sudo -E ./ci/setup_ci_environment.sh - sudo -E ./ci/setup_googletest.sh - name: run tests env: CC: /usr/bin/gcc-12 @@ -1047,7 +1038,6 @@ jobs: CXX: /usr/bin/g++-10 run: | sudo -E ./ci/setup_ci_environment.sh - sudo -E ./ci/setup_googletest.sh - name: run tests and generate report env: CC: /usr/bin/gcc-10 @@ -1143,7 +1133,7 @@ jobs: CXX: /usr/bin/g++-12 run: | sudo -E ./ci/setup_ci_environment.sh - sudo -E ./ci/setup_googletest.sh + sudo -E apt-get install -y zlib1g-dev libcurl4-openssl-dev - name: run w3c trace-context test server (background) env: CXX_STANDARD: '14' diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index ab4aee7d33..6442f9ca4b 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@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2 diff --git a/CHANGELOG.md b/CHANGELOG.md index d5f020d4d3..f7f10042b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,9 @@ Increment the: * [CodeHealth] Fix clang-tidy warnings part 4 [#3501](https://github.com/open-telemetry/opentelemetry-cpp/pull/3501) +* [CMAKE] Clean up googletest and benchmark dependency management + [#3485](https://github.com/open-telemetry/opentelemetry-cpp/pull/3485) + Important changes: * [REMOVAL] Removed deprecated semantic convention header files diff --git a/CMakeLists.txt b/CMakeLists.txt index 86346c68e6..cbbe2798e3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,69 +46,31 @@ 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) +# Set the third-party release git tags. +if(EXISTS "${opentelemetry-cpp_SOURCE_DIR}/third_party_release") + file(STRINGS "${opentelemetry-cpp_SOURCE_DIR}/third_party_release" + third_party_tags) + foreach(_raw_line IN LISTS third_party_tags) + # Strip leading/trailing whitespace + string(STRIP "${_raw_line}" _line) + # Skip empty lines and comments + if(_line STREQUAL "" OR _line MATCHES "^#") + continue() 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) + + # 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}") else() - set(ARCH ppc32) + message( + FATAL_ERROR + "Could not parse third-party tag. Invalid line in ${opentelemetry-cpp_SOURCE_DIR}/third_party_release. Line:\n ${_raw_line}" + ) 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() + endforeach() endif() -message(STATUS "Building for architecture ARCH=${ARCH}") # Autodetect vcpkg toolchain if(DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE) @@ -197,7 +159,7 @@ 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") if(NOT WITH_STL STREQUAL "OFF") # These definitions are needed for test projects that do not link against @@ -316,33 +278,14 @@ option(OPENTELEMETRY_SKIP_DYNAMIC_LOADING_TESTS # Verify options dependencies # +include(FetchContent) + 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( @@ -442,9 +385,6 @@ 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!") @@ -490,7 +430,7 @@ if(WITH_OTLP_GRPC 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) + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/opentelemetry-proto.cmake") set(CMAKE_CXX_CLANG_TIDY ${SAVED_CMAKE_CXX_CLANG_TIDY}) endif() @@ -554,7 +494,7 @@ 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(OTELCPP_MAINTAINER_MODE) @@ -652,85 +592,10 @@ 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("${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() @@ -740,7 +605,7 @@ 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 "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}") @@ -810,8 +675,8 @@ message(STATUS "---------------------------------------------") message(STATUS "versions") message(STATUS "---------------------------------------------") message(STATUS "CMake: ${CMAKE_VERSION}") -message(STATUS "GTest: ${GTest_VERSION}") -message(STATUS "benchmark: ${benchmark_VERSION}") +message(STATUS "GTest: ${GTest_VERSION} (${GTest_PROVIDER})") +message(STATUS "benchmark: ${benchmark_VERSION} (${benchmark_PROVIDER})") if(WITH_GSL) message(STATUS "GSL: ${GSL_VERSION}") endif() @@ -838,7 +703,7 @@ if(prometheus-cpp_FOUND) endif() message(STATUS "---------------------------------------------") -include("${PROJECT_SOURCE_DIR}/cmake/otel-install-functions.cmake") +include("${opentelemetry-cpp_SOURCE_DIR}/cmake/otel-install-functions.cmake") include(CMakePackageConfigHelpers) @@ -904,8 +769,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 @@ -918,7 +785,7 @@ 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() diff --git a/ci/do_ci.sh b/ci/do_ci.sh index a7ed4945eb..e9cea09648 100755 --- a/ci/do_ci.sh +++ b/ci/do_ci.sh @@ -238,6 +238,7 @@ elif [[ "$1" == "cmake.opentracing_shim.test" ]]; then cmake "${CMAKE_OPTIONS[@]}" \ -DCMAKE_CXX_FLAGS="-Werror -Wno-error=redundant-move $CXXFLAGS" \ -DWITH_OPENTRACING=ON \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ "${SRC_DIR}" make -j $(nproc) make test @@ -249,6 +250,7 @@ elif [[ "$1" == "cmake.opentracing_shim.install.test" ]]; then cmake "${CMAKE_OPTIONS[@]}" \ -DCMAKE_CXX_FLAGS="-Werror -Wno-error=redundant-move $CXXFLAGS" \ -DWITH_OPENTRACING=ON \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ -DCMAKE_INSTALL_PREFIX=${INSTALL_TEST_DIR} \ "${SRC_DIR}" make -j $(nproc) diff --git a/cmake/benchmark.cmake b/cmake/benchmark.cmake new file mode 100644 index 0000000000..51e78487d3 --- /dev/null +++ b/cmake/benchmark.cmake @@ -0,0 +1,40 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +# Import the benchmark target (benchmark::benchmark). +# 1. Find an installed benchmark package +# 2. Use FetchContent to build benchmark from a git submodule +# 3. Use FetchContent to fetch and build benchmark from GitHub + +find_package(benchmark CONFIG QUIET) +set(benchmark_PROVIDER "find_package") + +if(NOT benchmark_FOUND) + set(_BENCHMARK_SUBMODULE_DIR "${opentelemetry-cpp_SOURCE_DIR}/third_party/benchmark") + if(EXISTS "${_BENCHMARK_SUBMODULE_DIR}/.git") + FetchContent_Declare( + "benchmark" + SOURCE_DIR "${_BENCHMARK_SUBMODULE_DIR}" + ) + set(benchmark_PROVIDER "fetch_source") + else() + FetchContent_Declare( + "benchmark" + GIT_REPOSITORY "https://github.com/google/benchmark.git" + GIT_TAG "${benchmark_GIT_TAG}" + ) + set(benchmark_PROVIDER "fetch_repository") + endif() + + set(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "" FORCE) + set(BENCHMARK_ENABLE_INSTALL OFF CACHE BOOL "" FORCE) + + FetchContent_MakeAvailable(benchmark) + + # Set the benchmark_VERSION variable from the git tag. + string(REGEX REPLACE "^v([0-9]+\\.[0-9]+\\.[0-9]+)$" "\\1" benchmark_VERSION "${benchmark_GIT_TAG}") +endif() + +if(NOT TARGET benchmark::benchmark) + message(FATAL_ERROR "The required benchmark::benchmark target was not imported") +endif() diff --git a/cmake/googletest.cmake b/cmake/googletest.cmake new file mode 100644 index 0000000000..7dfd81ea6d --- /dev/null +++ b/cmake/googletest.cmake @@ -0,0 +1,50 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +# Import GTest targets (GTest::gtest, GTest::gtest_main, and GTest::gmock) and set required variables GTEST_BOTH_LIBRARIES and GMOCK_LIB. +# 1. Find an installed GTest package +# 2. Use FetchContent to build googletest from a git submodule +# 3. Use FetchContent to fetch and build googletest from GitHub + +find_package(GTest CONFIG QUIET) +set(GTest_PROVIDER "find_package") + +if(NOT GTest_FOUND) + set(_GOOGLETEST_SUBMODULE_DIR "${opentelemetry-cpp_SOURCE_DIR}/third_party/googletest") + if(EXISTS "${_GOOGLETEST_SUBMODULE_DIR}/.git") + FetchContent_Declare( + "googletest" + SOURCE_DIR "${_GOOGLETEST_SUBMODULE_DIR}" + ) + set(GTest_PROVIDER "fetch_source") + else() + FetchContent_Declare( + "googletest" + GIT_REPOSITORY "https://github.com/google/googletest.git" + GIT_TAG "${googletest_GIT_TAG}" + ) + set(GTest_PROVIDER "fetch_repository") + endif() + + set(BUILD_GMOCK ON CACHE BOOL "" FORCE) + set(INSTALL_GTEST OFF CACHE BOOL "" FORCE) + + FetchContent_MakeAvailable(googletest) + + # Set the GTest_VERSION variable from the git tag. + string(REGEX REPLACE "^v([0-9]+\\.[0-9]+\\.[0-9]+)$" "\\1" GTest_VERSION "${googletest_GIT_TAG}") +endif() + +if(NOT TARGET GTest::gtest OR + NOT TARGET GTest::gtest_main OR + NOT TARGET GTest::gmock) + message(FATAL_ERROR "A required GTest target (GTest::gtest, GTest::gtest_main, or GTest::gmock) was not imported") +endif() + +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/nlohmann-json.cmake b/cmake/nlohmann-json.cmake index eb952cb81b..21da387aa1 100644 --- a/cmake/nlohmann-json.cmake +++ b/cmake/nlohmann-json.cmake @@ -61,7 +61,7 @@ else() nlohmann_json_download PREFIX third_party GIT_REPOSITORY https://github.com/nlohmann/json.git - GIT_TAG "${nlohmann-json}" + GIT_TAG "${nlohmann-json_GIT_TAG}" UPDATE_COMMAND "" CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DJSON_BuildTests=OFF -DJSON_Install=ON diff --git a/cmake/opentelemetry-proto.cmake b/cmake/opentelemetry-proto.cmake index e42e1a7965..c80cd74e30 100644 --- a/cmake/opentelemetry-proto.cmake +++ b/cmake/opentelemetry-proto.cmake @@ -57,7 +57,7 @@ else() ExternalProject_Add( opentelemetry-proto GIT_REPOSITORY https://github.com/open-telemetry/opentelemetry-proto.git - GIT_TAG "${opentelemetry-proto}" + GIT_TAG "${opentelemetry-proto_GIT_TAG}" UPDATE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND "" diff --git a/exporters/otlp/src/otlp_file_client.cc b/exporters/otlp/src/otlp_file_client.cc index 09e97accdc..021035eb55 100644 --- a/exporters/otlp/src/otlp_file_client.cc +++ b/exporters/otlp/src/otlp_file_client.cc @@ -1,6 +1,8 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#include + #include #include #include @@ -12,7 +14,6 @@ #include #include #include -#include #include #include #include @@ -1028,13 +1029,13 @@ class OPENTELEMETRY_LOCAL_SYMBOL OtlpFileSystemBackend : public OtlpFileAppender MaybeRotateLog(data.size()); - std::shared_ptr out = OpenLogFile(true); + std::shared_ptr out = OpenLogFile(true); if (!out) { return; } - fwrite(data.data(), 1, data.size(), out.get()); + std::fwrite(data.data(), 1, data.size(), out.get()); { std::lock_guard lock_guard{file_->file_lock}; @@ -1042,7 +1043,7 @@ class OPENTELEMETRY_LOCAL_SYMBOL OtlpFileSystemBackend : public OtlpFileAppender file_->record_count += record_count; // Pipe file size always returns 0, we ignore the size limit of it. - auto written_size = ftell(out.get()); + auto written_size = std::ftell(out.get()); if (written_size >= 0) { file_->written_size = static_cast(written_size); @@ -1054,7 +1055,7 @@ class OPENTELEMETRY_LOCAL_SYMBOL OtlpFileSystemBackend : public OtlpFileAppender { file_->left_flush_record_count = options_.flush_count; - fflush(out.get()); + std::fflush(out.get()); file_->flushed_record_count.store(file_->record_count.load(std::memory_order_acquire), std::memory_order_release); @@ -1216,7 +1217,7 @@ class OPENTELEMETRY_LOCAL_SYMBOL OtlpFileSystemBackend : public OtlpFileAppender OpenLogFile(false); } - std::shared_ptr OpenLogFile(bool destroy_content) + std::shared_ptr OpenLogFile(bool destroy_content) { std::lock_guard lock_guard{file_->file_lock}; @@ -1238,8 +1239,6 @@ class OPENTELEMETRY_LOCAL_SYMBOL OtlpFileSystemBackend : public OtlpFileAppender } file_path[file_path_size] = 0; - std::shared_ptr of = std::make_shared(); - std::string directory_name = FileSystemUtil::DirName(file_path); if (!directory_name.empty()) { @@ -1294,10 +1293,10 @@ class OPENTELEMETRY_LOCAL_SYMBOL OtlpFileSystemBackend : public OtlpFileAppender << " failed with pattern: " << options_.file_pattern << hint); return nullptr; } - of = std::shared_ptr(new_file, fclose); + std::shared_ptr of = std::shared_ptr(new_file, fclose); - fseek(of.get(), 0, SEEK_END); - file_->written_size = static_cast(ftell(of.get())); + std::fseek(of.get(), 0, SEEK_END); + file_->written_size = static_cast(std::ftell(of.get())); file_->current_file = of; file_->last_checkpoint = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); @@ -1513,7 +1512,7 @@ class OPENTELEMETRY_LOCAL_SYMBOL OtlpFileSystemBackend : public OtlpFileAppender if (concurrency_file->current_file) { - fflush(concurrency_file->current_file.get()); + std::fflush(concurrency_file->current_file.get()); } concurrency_file->flushed_record_count.store(current_record_count, @@ -1568,7 +1567,7 @@ class OPENTELEMETRY_LOCAL_SYMBOL OtlpFileSystemBackend : public OtlpFileAppender std::size_t rotate_index; std::size_t written_size; std::size_t left_flush_record_count; - std::shared_ptr current_file; + std::shared_ptr current_file; std::mutex file_lock; std::time_t last_checkpoint; std::string file_path; diff --git a/install/test/cmake/fetch_content_test/CMakeLists.txt b/install/test/cmake/fetch_content_test/CMakeLists.txt index 79df956248..6b5fd0e94b 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,10 @@ 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) add_executable( fetch_content_src_test 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(