diff --git a/.devcontainer/Dockerfile.dev b/.devcontainer/Dockerfile.dev index e94e293acd..5c3c0f521d 100644 --- a/.devcontainer/Dockerfile.dev +++ b/.devcontainer/Dockerfile.dev @@ -8,14 +8,8 @@ ARG USER_GID=1000 ARG INSTALL_PACKAGES= ARG CXX_STANDARD=17 -ARG ABSEIL_CPP_VERSION=20230125.3 -ARG PROTOBUF_VERSION=23.3 -ARG GRPC_VERSION=v1.55.0 ENV CXX_STANDARD=${CXX_STANDARD} -ENV ABSEIL_CPP_VERSION=${ABSEIL_CPP_VERSION} -ENV PROTOBUF_VERSION=${PROTOBUF_VERSION} -ENV GRPC_VERSION=${GRPC_VERSION} COPY ci /opt/ci @@ -23,17 +17,12 @@ RUN apt update && apt install -y wget \ ninja-build \ llvm-dev \ libclang-dev \ - libcurl4-openssl-dev \ clang-tidy \ shellcheck \ cmake 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 @@ -46,6 +35,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 @@ -53,7 +43,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 2844f58341..c1cb3e1c92 100644 --- a/.devcontainer/README.md +++ b/.devcontainer/README.md @@ -10,26 +10,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 98a0eec74c..954c1eaf7e 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -11,10 +11,7 @@ "USER_UID": "${localEnv:OTEL_CPP_DEVCONTAINER_USER_UID:1000}", "USER_GID": "${localEnv:OTEL_CPP_DEVCONTAINER_USER_GID:1000}", "INSTALL_PACKAGES": "${localEnv:OTEL_CPP_DEVCONTAINER_INSTALL_PACKAGES:}", - "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": { diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7042b43ade..82be2fe76b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,17 +21,12 @@ 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 # run: | # sudo -E ./ci/setup_gcc10.sh # sudo -E ./ci/setup_ci_environment.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) @@ -50,7 +45,6 @@ jobs: - name: setup run: | sudo -E ./ci/setup_ci_environment.sh - sudo -E ./ci/setup_googletest.sh - name: run cmake tests run: | ./ci/do_ci.sh cmake.test @@ -60,7 +54,6 @@ jobs: runs-on: ubuntu-24.04 env: CXX_STANDARD: '17' - BUILD_TYPE: 'Debug' steps: - name: Harden the runner (Audit all outbound calls) uses: step-security/harden-runner@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1 @@ -72,44 +65,35 @@ 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 - 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 + - 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) 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@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1 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_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 @@ -125,32 +109,25 @@ 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@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1 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_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 @@ -166,32 +143,25 @@ 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@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1 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_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 @@ -207,32 +177,25 @@ 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@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1 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_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 @@ -248,32 +211,25 @@ 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@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1 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_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 @@ -362,7 +318,6 @@ jobs: CXX: /usr/bin/g++-12 run: | sudo -E ./ci/setup_ci_environment.sh - sudo -E ./ci/setup_googletest.sh - name: run cmake tests (without otlp-exporter) env: CC: /usr/bin/gcc-12 @@ -385,7 +340,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 @@ -404,7 +358,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' @@ -425,7 +378,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' @@ -446,7 +398,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' @@ -475,7 +426,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 @@ -506,7 +456,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' @@ -535,7 +484,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 @@ -566,10 +514,8 @@ jobs: - name: setup run: | sudo -E ./ci/setup_ci_environment.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: @@ -584,30 +530,24 @@ 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@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1 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_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: @@ -625,10 +565,8 @@ jobs: - name: setup run: | sudo -E ./ci/setup_ci_environment.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: @@ -646,10 +584,8 @@ jobs: - name: setup run: | sudo -E ./ci/setup_ci_environment.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: @@ -670,7 +606,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 @@ -948,10 +883,9 @@ jobs: uses: step-security/harden-runner@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1 with: 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 + run: sudo ./ci/install_format_tools.sh - name: run tests run: ./ci/do_ci.sh format @@ -1087,7 +1021,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 @@ -1183,7 +1116,6 @@ jobs: CXX: /usr/bin/g++-12 run: | sudo -E ./ci/setup_ci_environment.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 d93d0a5bbb..fa9be381e7 100644 --- a/.github/workflows/cmake_install.yml +++ b/.github/workflows/cmake_install.yml @@ -17,6 +17,7 @@ jobs: env: # 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@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1 @@ -39,6 +40,7 @@ jobs: runs-on: windows-2025 env: 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@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1 @@ -67,18 +69,16 @@ jobs: uses: step-security/harden-runner@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1 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_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' @@ -88,39 +88,65 @@ jobs: 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' + # 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@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1 + 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 + - 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 + - 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@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1 + 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_googletest.sh - - name: Build abseil, protobuf, and grpc with ci scripts + sudo -E ./ci/setup_cmake.sh + - 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' @@ -131,32 +157,24 @@ jobs: runs-on: ubuntu-22.04 env: INSTALL_TEST_DIR: '/home/runner/install_test' + OTELCPP_PROTO_PATH: '/home/runner/third-party/opentelemetry-proto' 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@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1 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_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' @@ -171,36 +189,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@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1 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' @@ -216,6 +226,7 @@ jobs: env: INSTALL_TEST_DIR: '/home/runner/install_test' 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: @@ -226,7 +237,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 @@ -252,11 +266,12 @@ 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' 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: @@ -267,7 +282,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 @@ -285,6 +303,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) @@ -292,6 +312,7 @@ jobs: env: INSTALL_TEST_DIR: '/Users/runner/install_test' 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: @@ -302,7 +323,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 @@ -322,6 +346,7 @@ jobs: env: INSTALL_TEST_DIR: '/Users/runner/install_test' CXX_STANDARD: '17' + CMAKE_EXTRA_ARGS: "-DOTELCPP_THIRDPARTY_FIND_PACKAGE_ONLY=ON" BUILD_TYPE: 'Debug' steps: - name: Harden the runner (Audit all outbound calls) @@ -331,7 +356,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: | brew install coreutils diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 59226d840d..15497a461c 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@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858 # v3.29.0 diff --git a/.github/workflows/iwyu.yml b/.github/workflows/iwyu.yml index 823813ea65..239a578b72 100644 --- a/.github/workflows/iwyu.yml +++ b/.github/workflows/iwyu.yml @@ -41,6 +41,7 @@ jobs: build-essential \ ninja-build \ libssl-dev \ + zlib1g-dev \ libcurl4-openssl-dev \ libabsl-dev \ libprotobuf-dev \ @@ -56,6 +57,7 @@ jobs: - name: Install include-what-you-use run: | sudo ./ci/install_iwyu.sh + - name: Prepare CMake env: CC: clang diff --git a/CMakeLists.txt b/CMakeLists.txt index 86346c68e6..be7ff1f3b9 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 @@ -312,45 +217,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 @@ -361,201 +252,94 @@ 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() +# +# API ONLY Dependencies +# - 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(WITH_GSL) + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/ms-gsl.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() +# +# SDK and Exporter Dependencies +# + +if(NOT WITH_API_ONLY) + + if(WITH_OPENTRACING) + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/opentracing-cpp.cmake") endif() - if(WITH_OTLP_GRPC) - find_package(gRPC CONFIG) + # Always include Threads for the SDK + + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/threads.cmake") + + # + # Do we need HTTP CLIENT CURL ? + # + + 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((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() + # + # Do we need ZLIB ? + # - 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() + if(WITH_HTTP_CLIENT_CURL AND WITH_OTLP_HTTP_COMPRESSION) + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/zlib.cmake") 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}) + + # + # Do we need CURL ? + # + + if(WITH_HTTP_CLIENT_CURL) + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/curl.cmake") 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}) -endif() + # + # Do we need gRPC, Protobuf, and opentelemetry-proto ? + # -# -# Do we need HTTP CLIENT CURL ? -# + if(WITH_OTLP_GRPC + OR WITH_OTLP_HTTP + OR WITH_OTLP_FILE) -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() + # Include gRPC before Protobuf We'll use the gRPC submodules for Protobuf + # and Abseil with FetchContent -# -# Do we need CURL ? -# + if(WITH_OTLP_GRPC) + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/grpc.cmake") + endif() -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}) + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/protobuf.cmake") + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/opentelemetry-proto.cmake") endif() -endif() -# -# Do we need ZLIB ? -# + # + # Do we need NLOHMANN_JSON ? + # -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(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() -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) - set(USE_NLOHMANN_JSON ON) -else() - set(USE_NLOHMANN_JSON OFF) -endif() + if(WITH_PROMETHEUS) + include("${opentelemetry-cpp_SOURCE_DIR}/cmake/prometheus-cpp.cmake") + endif() -if((NOT WITH_API_ONLY) AND USE_NLOHMANN_JSON) - include(cmake/nlohmann-json.cmake) -endif() +endif(NOT WITH_API_ONLY) if(OTELCPP_MAINTAINER_MODE) if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") @@ -650,198 +434,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_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!") @@ -856,38 +459,15 @@ if(DEFINED OPENTELEMETRY_BUILD_DLL) add_definitions(-DOPENTELEMETRY_BUILD_EXPORT_DLL) endif() -add_subdirectory(api) +otel_print_build_config() -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() +add_subdirectory(api) if(NOT WITH_API_ONLY) - set(BUILD_TESTING ${BUILD_TESTING}) + + if(WITH_OPENTRACING) + add_subdirectory(opentracing-shim) + endif() add_subdirectory(sdk) add_subdirectory(ext) @@ -904,8 +484,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 +500,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/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..ea9b6ba9e4 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) @@ -556,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}" @@ -680,11 +678,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/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 8a04fedee4..4b5caedda5 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.7.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") @@ -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..8139ee42b4 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,100 @@ 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_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/install/cmake/CMakeLists.txt b/install/cmake/CMakeLists.txt new file mode 100644 index 0000000000..cefb935f1d --- /dev/null +++ b/install/cmake/CMakeLists.txt @@ -0,0 +1,380 @@ +# 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 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 "${OTELCPP_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 "") +if(USE_SUBMODULES AND EXISTS "${OTELCPP_SOURCE_DIR}/third_party/benchmark/.git") + message(STATUS "Using submodule for benchmark") + list(APPEND benchmark_ARGS SOURCE_DIR + "${OTELCPP_SOURCE_DIR}/third_party/benchmark") +else() + 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 "") +if(USE_SUBMODULES AND EXISTS + "${OTELCPP_SOURCE_DIR}/third_party/googletest/.git") + message(STATUS "Using submodule for googletest") + list(APPEND googletest_ARGS SOURCE_DIR + "${OTELCPP_SOURCE_DIR}/third_party/googletest") +else() + 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 "") +if(USE_SUBMODULES AND EXISTS "${OTELCPP_SOURCE_DIR}/third_party/ms-gsl/.git") + message(STATUS "Using submodule for ms-gsl") + list(APPEND ms-gsl_ARGS SOURCE_DIR "${OTELCPP_SOURCE_DIR}/third_party/ms-gsl") +else() + 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 "") +if(USE_SUBMODULES AND EXISTS + "${OTELCPP_SOURCE_DIR}/third_party/nlohmann-json/.git") + message(STATUS "Using submodule for nlohmann-json") + list(APPEND nhlohmann-json_ARGS SOURCE_DIR + "${OTELCPP_SOURCE_DIR}/third_party/nlohmann-json") +else() + 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) + 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 "") +if(USE_SUBMODULES AND EXISTS + "${OTELCPP_SOURCE_DIR}/third_party/opentracing-cpp/.git") + message(STATUS "Using submodule for opentracing-cpp") + list(APPEND opentracing-cpp_ARGS SOURCE_DIR + "${OTELCPP_SOURCE_DIR}/third_party/opentracing-cpp" + ${opentracing-cpp_ARGS}) +else() + 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 "") +if(USE_SUBMODULES AND EXISTS + "${OTELCPP_SOURCE_DIR}/third_party/prometheus-cpp/.git") + message(STATUS "Using submodule for prometheus-cpp") + list(APPEND prometheus-cpp_ARGS SOURCE_DIR + "${OTELCPP_SOURCE_DIR}/third_party/prometheus-cpp") +else() + + 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/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/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) 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/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( diff --git a/third_party_release b/third_party_release index ace5c74cd2..93b6ce47a5 100644 --- a/third_party_release +++ b/third_party_release @@ -4,20 +4,24 @@ # MAINTAINER # # This file is used for the CMake build. +# Format: = # # When changing (add, upgrade, remove) dependencies # please update: -# - the Bazel build, see file -# /bazel/repository.bzl -# - git submodule, see command -# git submodule status -# +# - 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 -gRPC=v1.49.2 -abseil=20240116.1 +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.7.0 opentracing-cpp=v1.6.0