diff --git a/CHANGELOG.md b/CHANGELOG.md index 7782139e25..8825e9db39 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,11 @@ Increment the: ## [Unreleased] +* [CMAKE] Add pkg-config install consumer tests + [#4503](https://github.com/open-telemetry/opentelemetry-cpp/issues/4503) + +* [DOC] Fix and clarify the `StartSpanOptions` documentation + [#4526](https://github.com/open-telemetry/opentelemetry-cpp/pull/4526) ## [1.29.0] 2026-09-13 * [RELEASE] Bump main branch to 1.29.0-dev (#4259) diff --git a/cmake/pkgconfig.cmake b/cmake/pkgconfig.cmake index 63c1a2affd..581676c55a 100644 --- a/cmake/pkgconfig.cmake +++ b/cmake/pkgconfig.cmake @@ -45,6 +45,7 @@ function (opentelemetry_add_pkgconfig library name description) get_target_property(target_defs ${target} INTERFACE_COMPILE_DEFINITIONS) if (target_defs) foreach (def ${target_defs}) + string(REPLACE "\"" "\\\"" def "${def}") string(APPEND OPENTELEMETRY_PC_CFLAGS " -D${def}") endforeach () endif () diff --git a/install/cmake/CMakeLists.txt b/install/cmake/CMakeLists.txt index c8cc6335f4..b97782c8d3 100644 --- a/install/cmake/CMakeLists.txt +++ b/install/cmake/CMakeLists.txt @@ -210,14 +210,38 @@ if(protobuf IN_LIST _THIRDPARTY_PACKAGE_LIST) add_dependencies(protobuf-build zlib-install abseil-install) endif() # ------------------------------------------------------------------------ +# ---- re2 ---- +if(re2 IN_LIST _THIRDPARTY_PACKAGE_LIST) + if(NOT re2_GIT_TAG) + message(FATAL_ERROR "re2_GIT_TAG is not set") + endif() + ExternalProject_Add( + re2 + STEP_TARGETS install + GIT_REPOSITORY "https://github.com/google/re2.git" + GIT_TAG ${re2_GIT_TAG} + GIT_SHALLOW ON + PREFIX ${CMAKE_BINARY_DIR}/external/re2 + INSTALL_DIR ${CMAKE_INSTALL_PREFIX} + CMAKE_ARGS "${CMAKE_OPTIONS}" "-DRE2_BUILD_TESTING=OFF") +endif() +# ------------------------------------------------------------------------ # ---- grpc ---- if(grpc IN_LIST _THIRDPARTY_PACKAGE_LIST) if(NOT grpc_GIT_TAG) message(FATAL_ERROR "grpc_GIT_TAG is not set") endif() + set(_grpc_depends zlib abseil protobuf) + set(_grpc_build_depends zlib-install abseil-install protobuf-install) + set(_grpc_extra_cmake_args "") + if(re2 IN_LIST _THIRDPARTY_PACKAGE_LIST) + list(APPEND _grpc_depends re2) + list(APPEND _grpc_build_depends re2-install) + list(APPEND _grpc_extra_cmake_args "-DgRPC_RE2_PROVIDER=package") + endif() ExternalProject_Add( grpc - DEPENDS zlib abseil protobuf + DEPENDS ${_grpc_depends} STEP_TARGETS build GIT_REPOSITORY "https://github.com/grpc/grpc.git" GIT_TAG ${grpc_GIT_TAG} @@ -241,9 +265,10 @@ if(grpc IN_LIST _THIRDPARTY_PACKAGE_LIST) "-DgRPC_ZLIB_PROVIDER=package" "-DgRPC_PROTOBUF_PROVIDER=package" "-DgRPC_PROTOBUF_PACKAGE_TYPE=CONFIG" - "-DgRPC_ABSL_PROVIDER=package") + "-DgRPC_ABSL_PROVIDER=package" + ${_grpc_extra_cmake_args}) - add_dependencies(grpc-build zlib-install abseil-install protobuf-install) + add_dependencies(grpc-build ${_grpc_build_depends}) endif() # ------------------------------------------------------------------------ # ---- benchmark ---- diff --git a/install/cmake/third_party_latest b/install/cmake/third_party_latest index 013f1e07c9..8679b1427b 100644 --- a/install/cmake/third_party_latest +++ b/install/cmake/third_party_latest @@ -8,6 +8,7 @@ abseil=20250512.1 zlib=v1.3.2 curl=curl-8_21_0 protobuf=v35.1 +re2=2023-03-01 grpc=v1.83.1 benchmark=v1.9.5 googletest=v1.18.0 diff --git a/install/cmake/third_party_stable b/install/cmake/third_party_stable index 63abcf85bf..dac5398f4d 100644 --- a/install/cmake/third_party_stable +++ b/install/cmake/third_party_stable @@ -8,6 +8,7 @@ abseil=20230125.3 zlib=v1.3.1 curl=curl-8_12_0 protobuf=v4.23.1 +re2=2023-03-01 grpc=v1.55.0 benchmark=v1.8.3 googletest=v1.14.0 diff --git a/install/test/cmake/CMakeLists.txt b/install/test/cmake/CMakeLists.txt index 9e8db3f229..379dc23306 100644 --- a/install/test/cmake/CMakeLists.txt +++ b/install/test/cmake/CMakeLists.txt @@ -90,6 +90,33 @@ add_test(NAME full-package-run-test COMMAND ${CMAKE_BINARY_DIR}/build-full-package-test/full_test) # ----------------------------------------------------------- +# ----------------------------------------------------------- +# Pkg-config consumer test (compile/link/run against installed .pc files) +find_package(PkgConfig QUIET) +if(PKG_CONFIG_FOUND) + add_test( + NAME pkgconfig-test-config-test + COMMAND + ${CMAKE_COMMAND} --log-level=DEBUG -S ${CMAKE_SOURCE_DIR}/pkgconfig_test + -B build-pkgconfig-test "-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}" + ${INSTALL_TEST_CMAKE_OPTIONS} + "-DINSTALL_TEST_COMPONENTS=${INSTALL_TEST_COMPONENTS}" + "-DINSTALL_TEST_SRC_DIR=${INSTALL_TEST_SRC_DIR}") + + set_tests_properties( + pkgconfig-test-config-test + PROPERTIES ENVIRONMENT "PKG_CONFIG_PATH=${CMAKE_PREFIX_PATH}/lib/pkgconfig") + + add_test(NAME pkgconfig-test-build-test + COMMAND ${CMAKE_COMMAND} --build + ${CMAKE_BINARY_DIR}/build-pkgconfig-test --parallel) + + add_test(NAME pkgconfig-test-run-test + COMMAND ${CMAKE_BINARY_DIR}/build-pkgconfig-test/full_pkgconfig_test) +else() + message(STATUS "PkgConfig not found; skipping pkg-config install tests") +endif() + # ----------------------------------------------------------- # Loop over all the components to test foreach(component ${INSTALL_TEST_COMPONENTS}) diff --git a/install/test/cmake/pkgconfig_test/CMakeLists.txt b/install/test/cmake/pkgconfig_test/CMakeLists.txt new file mode 100644 index 0000000000..aae57e89a9 --- /dev/null +++ b/install/test/cmake/pkgconfig_test/CMakeLists.txt @@ -0,0 +1,64 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.16) + +project(opentelemetry-cpp-pkgconfig-install-test LANGUAGES CXX) + +if(NOT DEFINED INSTALL_TEST_SRC_DIR) + message( + FATAL_ERROR + "INSTALL_TEST_SRC_DIR must be defined when running cmake on this test project" + ) +endif() + +if(NOT INSTALL_TEST_COMPONENTS) + message(FATAL_ERROR "INSTALL_TEST_COMPONENTS is empty") +endif() + +find_package(PkgConfig REQUIRED) +find_package(GTest CONFIG REQUIRED) + +set(_pkgconfig_pc_files "") +foreach(_prefix IN LISTS CMAKE_PREFIX_PATH) + file(GLOB _prefix_pkgconfig_pc_files + "${_prefix}/lib/pkgconfig/opentelemetry_*.pc") + list(APPEND _pkgconfig_pc_files ${_prefix_pkgconfig_pc_files}) +endforeach() +if(NOT _pkgconfig_pc_files) + message( + FATAL_ERROR + "No installed opentelemetry pkg-config files found under ${CMAKE_PREFIX_PATH}/lib/pkgconfig" + ) +endif() + +set(_pkgconfig_modules "") +foreach(_pc_file IN LISTS _pkgconfig_pc_files) + get_filename_component(_module "${_pc_file}" NAME_WE) + list(APPEND _pkgconfig_modules "${_module}") +endforeach() +list(SORT _pkgconfig_modules) + +message(STATUS "Testing pkg-config install on modules = ${_pkgconfig_modules}") +message( + STATUS "Testing pkg-config install on components = ${INSTALL_TEST_COMPONENTS}" +) + +pkg_check_modules(OTEL_PKGCONFIG REQUIRED ${_pkgconfig_modules}) + +add_executable(full_pkgconfig_test) + +foreach(component IN LISTS INSTALL_TEST_COMPONENTS) + message(STATUS "Adding test source for component ${component}") + target_sources(full_pkgconfig_test + PRIVATE "${INSTALL_TEST_SRC_DIR}/test_${component}.cc") +endforeach() + +target_include_directories(full_pkgconfig_test + PRIVATE ${OTEL_PKGCONFIG_INCLUDE_DIRS}) +target_compile_options(full_pkgconfig_test + PRIVATE ${OTEL_PKGCONFIG_CFLAGS_OTHER}) +target_link_libraries( + full_pkgconfig_test + PRIVATE ${OTEL_PKGCONFIG_LIBRARIES} ${OTEL_PKGCONFIG_LDFLAGS} GTest::gtest + GTest::gtest_main)