From 54a274c3219e5a95014621c3b72d6144eb1dc3f0 Mon Sep 17 00:00:00 2001 From: Douglas Barker Date: Fri, 22 Aug 2025 16:15:16 -0600 Subject: [PATCH 1/3] Set the otel-cpp version through the cmake project macro. Use the standard config mode to find the project in the config.cmake file. Set cached variables for the version and abi number for in-tree builds with fetch content. Test the cached varaibles are set properly in ci --- CMakeLists.txt | 46 ++++++++----------- cmake/otel-install-functions.cmake | 4 +- .../opentelemetry-cpp-config.cmake.in | 9 ++-- cmake/version.cmake | 35 ++++++++++++++ .../cmake/fetch_content_test/CMakeLists.txt | 21 +++++++++ 5 files changed, 82 insertions(+), 33 deletions(-) create mode 100644 cmake/version.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 1a6f9cf99a..e10467d352 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,7 +31,14 @@ 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) @@ -77,9 +84,6 @@ 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. @@ -109,31 +113,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() -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" - ) + set(OPENTELEMETRY_ABI_VERSION_NO ${OPENTELEMETRY_ABI_VERSION_DEFAULT}) endif() -message(STATUS "OPENTELEMETRY_VERSION=${OPENTELEMETRY_VERSION}") - option(WITH_NO_DEPRECATED_CODE "Do not include deprecated code" OFF) set(WITH_STL @@ -683,3 +665,13 @@ if(OPENTELEMETRY_INSTALL) 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/cmake/otel-install-functions.cmake b/cmake/otel-install-functions.cmake index 8d72c12ce5..109a0ed548 100644 --- a/cmake/otel-install-functions.cmake +++ b/cmake/otel-install-functions.cmake @@ -487,13 +487,11 @@ function(otel_install_cmake_config) "${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( diff --git a/cmake/templates/opentelemetry-cpp-config.cmake.in b/cmake/templates/opentelemetry-cpp-config.cmake.in index 46655f8ff6..0503b180fb 100644 --- a/cmake/templates/opentelemetry-cpp-config.cmake.in +++ b/cmake/templates/opentelemetry-cpp-config.cmake.in @@ -211,10 +211,13 @@ 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 - REQUIRED_VARS OPENTELEMETRY_CPP_INCLUDE_DIRS OPENTELEMETRY_CPP_LIBRARIES) + ${CMAKE_FIND_PACKAGE_NAME} + CONFIG_MODE + REQUIRED_VARS OPENTELEMETRY_CPP_INCLUDE_DIRS OPENTELEMETRY_CPP_LIBRARIES) if(${CMAKE_FIND_PACKAGE_NAME}_FOUND) set(OPENTELEMETRY_CPP_FOUND diff --git a/cmake/version.cmake b/cmake/version.cmake new file mode 100644 index 0000000000..b7bc7d395d --- /dev/null +++ b/cmake/version.cmake @@ -0,0 +1,35 @@ +# 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() diff --git a/install/test/cmake/fetch_content_test/CMakeLists.txt b/install/test/cmake/fetch_content_test/CMakeLists.txt index 6b5fd0e94b..871889c93d 100644 --- a/install/test/cmake/fetch_content_test/CMakeLists.txt +++ b/install/test/cmake/fetch_content_test/CMakeLists.txt @@ -30,6 +30,27 @@ FetchContent_Declare( FetchContent_Declare(opentelemetry-cpp SOURCE_DIR ${OPENTELEMETRY_CPP_SRC_DIR}) 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 ${OPENTELEMETRY_CPP_SRC_DIR}/install/test/src/test_api.cc From d212811abfc96fa0b49e9216abadc330fb914c36 Mon Sep 17 00:00:00 2001 From: Douglas Barker Date: Wed, 27 Aug 2025 10:46:28 -0600 Subject: [PATCH 2/3] address review feedback. Set version number and abi number variables explicitly. Add support to set a version suffix string --- CMakeLists.txt | 15 +++++++++------ cmake/version.cmake | 35 ----------------------------------- 2 files changed, 9 insertions(+), 41 deletions(-) delete mode 100644 cmake/version.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 548647b23f..4e54c072d7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,13 +15,16 @@ if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.20.0") cmake_policy(SET CMP0117 NEW) endif() -# 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") +set(OPENTELEMETRY_VERSION_NUMBER "1.22.0") +set(OPENTELEMETRY_VERSION_SUFFIX "") +set(OPENTELEMETRY_VERSION + "${OPENTELEMETRY_VERSION_NUMBER}${OPENTELEMETRY_VERSION_SUFFIX}") + +set(OPENTELEMETRY_ABI_VERSION_NO_DEFAULT "1") project( opentelemetry-cpp - VERSION ${OPENTELEMETRY_VERSION} + VERSION "${OPENTELEMETRY_VERSION_NUMBER}" LANGUAGES CXX) # Mark variables as used so cmake doesn't complain about them @@ -92,7 +95,7 @@ if(WITH_ABI_VERSION_2) elseif(WITH_ABI_VERSION_1) set(OPENTELEMETRY_ABI_VERSION_NO "1") else() - set(OPENTELEMETRY_ABI_VERSION_NO ${OPENTELEMETRY_ABI_VERSION_DEFAULT}) + set(OPENTELEMETRY_ABI_VERSION_NO "${OPENTELEMETRY_ABI_VERSION_NO_DEFAULT}") endif() option(WITH_NO_DEPRECATED_CODE "Do not include deprecated code" OFF) @@ -460,7 +463,7 @@ endif() message(STATUS "---------------------------------------------") message(STATUS "build settings") message(STATUS "---------------------------------------------") -message(STATUS "OpenTelemetry: ${OPENTELEMETRY_VERSION}") +message(STATUS "OpenTelemetry VERSION: ${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}") diff --git a/cmake/version.cmake b/cmake/version.cmake deleted file mode 100644 index b7bc7d395d..0000000000 --- a/cmake/version.cmake +++ /dev/null @@ -1,35 +0,0 @@ -# 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() From e249482135bb99533d6f0efdcecc77ffb467e045 Mon Sep 17 00:00:00 2001 From: Douglas Barker Date: Wed, 27 Aug 2025 11:21:21 -0600 Subject: [PATCH 3/3] address review feedback. Rename the abi version number default variable --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4e54c072d7..e8ea2001af 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,7 +20,7 @@ set(OPENTELEMETRY_VERSION_SUFFIX "") set(OPENTELEMETRY_VERSION "${OPENTELEMETRY_VERSION_NUMBER}${OPENTELEMETRY_VERSION_SUFFIX}") -set(OPENTELEMETRY_ABI_VERSION_NO_DEFAULT "1") +set(OPENTELEMETRY_ABI_VERSION_DEFAULT "1") project( opentelemetry-cpp @@ -95,7 +95,7 @@ if(WITH_ABI_VERSION_2) elseif(WITH_ABI_VERSION_1) set(OPENTELEMETRY_ABI_VERSION_NO "1") else() - set(OPENTELEMETRY_ABI_VERSION_NO "${OPENTELEMETRY_ABI_VERSION_NO_DEFAULT}") + set(OPENTELEMETRY_ABI_VERSION_NO "${OPENTELEMETRY_ABI_VERSION_DEFAULT}") endif() option(WITH_NO_DEPRECATED_CODE "Do not include deprecated code" OFF)