Skip to content

Commit 6012dff

Browse files
committed
Add an otel-version-functions script. Use the version functions to parse the third party release file, set the opentelemetry-cpp project version, and abi version number. Update the config.cmake.in file to use CONFIG_MODE so the otel-cpp version prints on calls to find_package
1 parent 6fbc78a commit 6012dff

File tree

4 files changed

+160
-75
lines changed

4 files changed

+160
-75
lines changed

CMakeLists.txt

Lines changed: 11 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -31,22 +31,20 @@ if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.20.0")
3131
cmake_policy(SET CMP0117 NEW)
3232
endif()
3333

34-
project(opentelemetry-cpp)
34+
# Read the opentelemetry-cpp project version from the api version header file
35+
include("${CMAKE_CURRENT_LIST_DIR}/cmake/otel-version-functions.cmake")
36+
otel_get_project_version("${CMAKE_CURRENT_LIST_DIR}" OPENTELEMETRY_VERSION)
37+
38+
project(
39+
opentelemetry-cpp
40+
VERSION ${OPENTELEMETRY_VERSION}
41+
LANGUAGES CXX)
3542

3643
# Mark variables as used so cmake doesn't complain about them
3744
mark_as_advanced(CMAKE_TOOLCHAIN_FILE)
3845

3946
# Set the third-party dependency versions expected
40-
if(EXISTS "${opentelemetry-cpp_SOURCE_DIR}/third_party_release")
41-
file(STRINGS "${opentelemetry-cpp_SOURCE_DIR}/third_party_release"
42-
third_party_tags)
43-
foreach(third_party ${third_party_tags})
44-
string(REGEX REPLACE "^[ ]+" "" third_party ${third_party})
45-
string(REGEX MATCH "^[^=]+" third_party_name ${third_party})
46-
string(REPLACE "${third_party_name}=" "" third_party_tag ${third_party})
47-
set(${third_party_name}_GIT_TAG "${third_party_tag}")
48-
endforeach()
49-
endif()
47+
otel_get_thirdparty_version_tags("${opentelemetry-cpp_SOURCE_DIR}")
5048

5149
# Autodetect vcpkg toolchain
5250
if(DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
@@ -58,9 +56,6 @@ endif()
5856
option(WITH_ABI_VERSION_1 "ABI version 1" ON)
5957
option(WITH_ABI_VERSION_2 "EXPERIMENTAL: ABI version 2 preview" OFF)
6058

61-
file(READ "${CMAKE_CURRENT_LIST_DIR}/api/include/opentelemetry/version.h"
62-
OPENTELEMETRY_CPP_HEADER_VERSION_H)
63-
6459
#
6560
# We do not want to have WITH_ABI_VERSION = "1" or "2", and instead prefer two
6661
# distinct flags, WITH_ABI_VERSION_1 and WITH_ABI_VERSION_2.
@@ -90,25 +85,8 @@ if(WITH_ABI_VERSION_2)
9085
elseif(WITH_ABI_VERSION_1)
9186
set(OPENTELEMETRY_ABI_VERSION_NO "1")
9287
else()
93-
if(OPENTELEMETRY_CPP_HEADER_VERSION_H MATCHES
94-
"OPENTELEMETRY_ABI_VERSION_NO[ \t\r\n]+\"?([0-9]+)\"?")
95-
math(EXPR OPENTELEMETRY_ABI_VERSION_NO ${CMAKE_MATCH_1})
96-
else()
97-
message(
98-
FATAL_ERROR
99-
"OPENTELEMETRY_ABI_VERSION_NO not found on ${CMAKE_CURRENT_LIST_DIR}/api/include/opentelemetry/version.h"
100-
)
101-
endif()
102-
endif()
103-
104-
if(OPENTELEMETRY_CPP_HEADER_VERSION_H MATCHES
105-
"OPENTELEMETRY_VERSION[ \t\r\n]+\"?([^\"]+)\"?")
106-
set(OPENTELEMETRY_VERSION ${CMAKE_MATCH_1})
107-
else()
108-
message(
109-
FATAL_ERROR
110-
"OPENTELEMETRY_VERSION not found on ${CMAKE_CURRENT_LIST_DIR}/api/include/opentelemetry/version.h"
111-
)
88+
otel_get_abi_version_number("${opentelemetry-cpp_SOURCE_DIR}"
89+
OPENTELEMETRY_ABI_VERSION_NO)
11290
endif()
11391

11492
option(WITH_NO_DEPRECATED_CODE "Do not include deprecated code" OFF)

cmake/otel-install-functions.cmake

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -455,47 +455,6 @@ function(_otel_fetch_package)
455455
set("${_THIRDPARTY_FETCH_NAME}_BINARY_DIR" ${${_THIRDPARTY_FETCH_NAME}_BINARY_DIR} PARENT_SCOPE)
456456
endfunction()
457457

458-
#-----------------------------------------------------------------------
459-
# otel_parse_version_from_file
460-
# Parses the version from a file using a regex.
461-
function(otel_parse_version_from_file)
462-
set(optionArgs )
463-
set(oneValueArgs REGEX FILE OUT_VERSION)
464-
set(multiValueArgs)
465-
cmake_parse_arguments(_OTEL_PARSE "${optionArgs}" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}")
466-
467-
# error if udefined args are detected
468-
if(DEFINED _OTEL_PARSE_UNPARSED_ARGUMENTS)
469-
message(FATAL_ERROR "Unparsed arguments detected: ${_OTEL_PARSE_UNPARSED_ARGUMENTS}")
470-
endif()
471-
472-
if(NOT DEFINED _OTEL_PARSE_OUT_VERSION)
473-
message(FATAL_ERROR "OUT_VERSION is required")
474-
endif()
475-
if(NOT DEFINED _OTEL_PARSE_REGEX)
476-
message(FATAL_ERROR "REGEX is required")
477-
endif()
478-
if(NOT DEFINED _OTEL_PARSE_FILE)
479-
message(FATAL_ERROR "FILE is required")
480-
endif()
481-
482-
string(CONFIGURE "${_OTEL_PARSE_FILE}" _CONFIGURED_VERSION_FILEPATH)
483-
if(NOT EXISTS "${_CONFIGURED_VERSION_FILEPATH}")
484-
message(WARNING "Version file ${_CONFIGURED_VERSION_FILEPATH} does not exist")
485-
else()
486-
file(READ "${_CONFIGURED_VERSION_FILEPATH}" _VERSION_FILE_CONTENTS)
487-
string(REGEX MATCH
488-
"${_OTEL_PARSE_REGEX}"
489-
_VERSION_MATCH
490-
"${_VERSION_FILE_CONTENTS}")
491-
if(_VERSION_MATCH)
492-
set("${_OTEL_PARSE_OUT_VERSION}" "${CMAKE_MATCH_1}" PARENT_SCOPE)
493-
else()
494-
message(WARNING "Failed to parse version from ${_OTEL_PARSE_FILE} using regex ${_OTEL_PARSE_REGEX}")
495-
endif()
496-
endif()
497-
endfunction()
498-
499458
########################################################################
500459
# Main functions to support installing components
501460
# and the opentlemetry-cpp cmake package config files

cmake/otel-version-functions.cmake

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
# Copyright The OpenTelemetry Authors
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
#-----------------------------------------------------------------------
5+
# otel_parse_version_from_file
6+
# Parses the version from a file using a regex.
7+
# Arguments:
8+
# REGEX: The regex pattern to match the version.
9+
# FILE: The file to read the version from.
10+
# OUT_VERSION: The variable to store the parsed version.
11+
# Returns:
12+
# OUT_VERSION: The parsed version string.
13+
#-----------------------------------------------------------------------
14+
function(otel_parse_version_from_file)
15+
set(optionArgs )
16+
set(oneValueArgs REGEX FILE OUT_VERSION)
17+
set(multiValueArgs)
18+
cmake_parse_arguments(_OTEL_PARSE "${optionArgs}" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}")
19+
20+
if(DEFINED _OTEL_PARSE_UNPARSED_ARGUMENTS)
21+
message(FATAL_ERROR "Unparsed arguments detected: ${_OTEL_PARSE_UNPARSED_ARGUMENTS}")
22+
endif()
23+
24+
if(NOT DEFINED _OTEL_PARSE_OUT_VERSION)
25+
message(FATAL_ERROR "OUT_VERSION is required")
26+
endif()
27+
if(NOT DEFINED _OTEL_PARSE_REGEX)
28+
message(FATAL_ERROR "REGEX is required")
29+
endif()
30+
if(NOT DEFINED _OTEL_PARSE_FILE)
31+
message(FATAL_ERROR "FILE is required")
32+
endif()
33+
34+
string(CONFIGURE "${_OTEL_PARSE_FILE}" _CONFIGURED_VERSION_FILEPATH)
35+
if(NOT EXISTS "${_CONFIGURED_VERSION_FILEPATH}")
36+
message(WARNING "Version file ${_CONFIGURED_VERSION_FILEPATH} does not exist")
37+
else()
38+
file(READ "${_CONFIGURED_VERSION_FILEPATH}" _VERSION_FILE_CONTENTS)
39+
string(REGEX MATCH
40+
"${_OTEL_PARSE_REGEX}"
41+
_VERSION_MATCH
42+
"${_VERSION_FILE_CONTENTS}")
43+
if(_VERSION_MATCH)
44+
set("${_OTEL_PARSE_OUT_VERSION}" "${CMAKE_MATCH_1}" PARENT_SCOPE)
45+
else()
46+
message(WARNING "Failed to parse version from ${_OTEL_PARSE_FILE} using regex ${_OTEL_PARSE_REGEX}")
47+
endif()
48+
endif()
49+
endfunction()
50+
51+
#-------------------------------------------------------------------------------
52+
# otel_get_project_version
53+
# Retrieves the OpenTelemetry C++ version from the version header file.
54+
# Arguments:
55+
# OTEL_SRC_DIR: The source directory of OpenTelemetry C++.
56+
# OUT_VERSION: The variable to store the parsed version.
57+
# Returns:
58+
# OUT_VERSION: The parsed OpenTelemetry C++ version.
59+
#-------------------------------------------------------------------------------
60+
function(otel_get_project_version OTEL_SRC_DIR OUT_VERSION)
61+
set(_OTEL_VERSION_FILE "${OTEL_SRC_DIR}/api/include/opentelemetry/version.h")
62+
set(_OTELCPP_VERSION_REGEX
63+
"OPENTELEMETRY_VERSION[ \t\r\n]+\"?([^\"]+)\"?")
64+
65+
otel_parse_version_from_file(
66+
REGEX "${_OTELCPP_VERSION_REGEX}"
67+
FILE "${_OTEL_VERSION_FILE}"
68+
OUT_VERSION _otelcpp_version_parsed
69+
)
70+
71+
if(NOT DEFINED _otelcpp_version_parsed)
72+
message(
73+
FATAL_ERROR
74+
"OPENTELEMETRY_VERSION not found on ${_OTEL_VERSION_FILE}"
75+
)
76+
endif()
77+
set(${OUT_VERSION} "${_otelcpp_version_parsed}" PARENT_SCOPE)
78+
message(STATUS "OpenTelemetry C++ version: ${_otelcpp_version_parsed}")
79+
endfunction()
80+
81+
#-------------------------------------------------------------------------------
82+
# otel_get_abi_version_number
83+
# Retrieves the OpenTelemetry C++ ABI version number from the api version header file.
84+
# Arguments:
85+
# OTEL_SRC_DIR: The source directory of OpenTelemetry C++.
86+
# OUT_ABI_NUMBER: The variable to store the parsed ABI number.
87+
# Returns:
88+
# OUT_ABI_NUMBER: The parsed OpenTelemetry C++ ABI number.
89+
#-------------------------------------------------------------------------------
90+
function(otel_get_abi_version_number OTEL_SRC_DIR OUT_ABI_NUMBER)
91+
set(_OTEL_VERSION_FILE "${OTEL_SRC_DIR}/api/include/opentelemetry/version.h")
92+
otel_parse_version_from_file(
93+
REGEX "OPENTELEMETRY_ABI_VERSION_NO[ \t\r\n]+\"?([0-9]+)\"?"
94+
FILE "${_OTEL_VERSION_FILE"
95+
OUT_VERSION _otel_abi_number_parsed)
96+
97+
math(EXPR _otel_abi_number ${_otel_abi_number_parsed})
98+
if(NOT _otel_abi_number)
99+
message(
100+
FATAL_ERROR
101+
"OPENTELEMETRY_ABI_VERSION_NO not found on ${_OTEL_VERSION_FILE}"
102+
)
103+
endif()
104+
set(${OUT_ABI_NUMBER} "${_otel_abi_number}" PARENT_SCOPE)
105+
message(STATUS "OpenTelemetry C++ ABI version number: ${_otel_abi_number}")
106+
endfunction()
107+
108+
#-------------------------------------------------------------------------------
109+
# otel_get_thirdparty_version_tags
110+
# Retrieves the version tags for third-party dependencies from the version file.
111+
# Arguments:
112+
# OTEL_SRC_DIR: The source directory of OpenTelemetry C++.
113+
# Returns:
114+
# <package>_GIT_TAG: Sets the git tag variables for each third-party package that the parent scope
115+
#-------------------------------------------------------------------------------
116+
function(otel_get_thirdparty_version_tags OTEL_SRC_DIR)
117+
set(_OTEL_THIRDPARTY_TAG_FILE "${OTEL_SRC_DIR}/third_party_release")
118+
if(NOT EXISTS "${_OTEL_THIRDPARTY_TAG_FILE}")
119+
message(FATAL_ERROR "Third-party version file ${_OTEL_THIRDPARTY_TAG_FILE} was not found")
120+
endif()
121+
122+
file(STRINGS "${_OTEL_THIRDPARTY_TAG_FILE}" _file_lines)
123+
124+
foreach(_raw_line IN LISTS _file_lines)
125+
# Strip leading/trailing whitespace
126+
string(STRIP "${_raw_line}" _line)
127+
128+
# Skip empty lines and comments
129+
if(_line STREQUAL "")
130+
continue()
131+
endif()
132+
if(_line MATCHES "^#")
133+
continue()
134+
endif()
135+
136+
# Match "package_name=git_tag"
137+
if(_line MATCHES "^([^=]+)=(.+)$")
138+
set(_third_party_name "${CMAKE_MATCH_1}")
139+
set(_git_tag "${CMAKE_MATCH_2}")
140+
set(_third_party_tag_var "${_third_party_name}_GIT_TAG")
141+
set("${_third_party_tag_var}" "${_git_tag}" PARENT_SCOPE)
142+
message(STATUS "Set third-party tag: ${_third_party_tag_var}=${_git_tag}")
143+
else()
144+
message(WARNING "Skipping invalid line in ${_OTEL_THIRDPARTY_TAG_FILE}. Line:\n ${_line}")
145+
endif()
146+
endforeach()
147+
endfunction()

cmake/templates/opentelemetry-cpp-config.cmake.in

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,9 +211,10 @@ endforeach()
211211
# handle the QUIETLY and REQUIRED arguments and set opentelemetry-cpp_FOUND to
212212
# TRUE if all variables listed contain valid results, e.g. valid file paths.
213213
include("FindPackageHandleStandardArgs")
214+
set(${CMAKE_FIND_PACKAGE_NAME}_CONFIG ${CMAKE_CURRENT_LIST_FILE})
214215
find_package_handle_standard_args(
215216
${CMAKE_FIND_PACKAGE_NAME}
216-
FOUND_VAR ${CMAKE_FIND_PACKAGE_NAME}_FOUND
217+
CONFIG_MODE
217218
REQUIRED_VARS OPENTELEMETRY_CPP_INCLUDE_DIRS OPENTELEMETRY_CPP_LIBRARIES)
218219

219220
if(${CMAKE_FIND_PACKAGE_NAME}_FOUND)

0 commit comments

Comments
 (0)