]> git.proxmox.com Git - ceph.git/blame - ceph/src/jaegertracing/opentelemetry-cpp/CMakeLists.txt
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / jaegertracing / opentelemetry-cpp / CMakeLists.txt
CommitLineData
1e59de90
TL
1cmake_minimum_required(VERSION 3.1)
2
3# See https://cmake.org/cmake/help/v3.3/policy/CMP0057.html required by certain
4# versions of gtest
5cmake_policy(SET CMP0057 NEW)
6
7# See https://cmake.org/cmake/help/v3.12/policy/CMP0074.html required by certain
8# version of zlib which is dependeded by cURL.
9if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.12")
10 cmake_policy(SET CMP0074 NEW)
11endif()
12
13project(opentelemetry-cpp)
14
15# Mark variables as used so cmake doesn't complain about them
16mark_as_advanced(CMAKE_TOOLCHAIN_FILE)
17
18# Don't use customized cmake modules if vcpkg is used to resolve dependence.
19if(NOT DEFINED CMAKE_TOOLCHAIN_FILE)
20 list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules/")
21endif()
22
23if(EXISTS "${CMAKE_SOURCE_DIR}/third_party_release")
24 file(STRINGS "${CMAKE_SOURCE_DIR}/third_party_release" third_party_tags)
25 foreach(third_party ${third_party_tags})
26 string(REGEX REPLACE "^[ ]+" "" third_party ${third_party})
27 string(REGEX MATCH "^[^=]+" third_party_name ${third_party})
28 string(REPLACE "${third_party_name}=" "" third_party_tag ${third_party})
29 set(${third_party_name} "${third_party_tag}")
30 endforeach()
31endif()
32
33if(DEFINED ENV{ARCH})
34 # Architecture may be specified via ARCH environment variable
35 set(ARCH $ENV{ARCH})
36else()
37 # Autodetection logic that populates ARCH variable
38 if(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*")
39 # Windows may report AMD64 even if target is 32-bit
40 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
41 set(ARCH x64)
42 elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
43 set(ARCH x86)
44 endif()
45 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "i686.*|i386.*|x86.*")
46 # Windows may report x86 even if target is 64-bit
47 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
48 set(ARCH x64)
49 elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
50 set(ARCH x86)
51 endif()
52 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES
53 "^(aarch64.*|AARCH64.*|arm64.*|ARM64.*)")
54 set(ARCH arm64)
55 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm.*|ARM.*)")
56 set(ARCH arm)
57 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64le")
58 set(ARCH ppc64le)
59 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64")
60 set(ARCH ppc64)
61 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(mips.*|MIPS.*)")
62 set(ARCH mips)
63 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(riscv.*|RISCV.*)")
64 set(ARCH riscv)
65 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(s390x.*|S390X.*)")
66 set(ARCH s390x)
67 else()
68 message(
69 FATAL_ERROR
70 "opentelemetry-cpp: unrecognized target processor configuration!")
71 endif()
72endif()
73message(STATUS "Building for architecture ARCH=${ARCH}")
74
75# Autodetect vcpkg toolchain
76if(DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
77 set(CMAKE_TOOLCHAIN_FILE
78 "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
79 CACHE STRING "")
80endif()
81
82if(VCPKG_CHAINLOAD_TOOLCHAIN_FILE)
83 include("${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}")
84endif()
85
86file(READ "${CMAKE_CURRENT_LIST_DIR}/api/include/opentelemetry/version.h"
87 OPENTELEMETRY_CPP_HEADER_VERSION_H)
88if(OPENTELEMETRY_CPP_HEADER_VERSION_H MATCHES
89 "OPENTELEMETRY_ABI_VERSION_NO[ \t\r\n]+\"?([0-9]+)\"?")
90 math(EXPR OPENTELEMETRY_ABI_VERSION_NO ${CMAKE_MATCH_1})
91else()
92 message(
93 FATAL_ERROR
94 "OPENTELEMETRY_ABI_VERSION_NO not found on ${CMAKE_CURRENT_LIST_DIR}/api/include/opentelemetry/version.h"
95 )
96endif()
97if(OPENTELEMETRY_CPP_HEADER_VERSION_H MATCHES
98 "OPENTELEMETRY_VERSION[ \t\r\n]+\"?([^\"]+)\"?")
99 set(OPENTELEMETRY_VERSION ${CMAKE_MATCH_1})
100else()
101 message(
102 FATAL_ERROR
103 "OPENTELEMETRY_VERSION not found on ${CMAKE_CURRENT_LIST_DIR}/api/include/opentelemetry/version.h"
104 )
105endif()
106
107option(WITH_STL "Whether to use Standard Library for C++ latest features" OFF)
108option(WITH_GSL
109 "Whether to use Guidelines Support Library for C++ latest features" OFF)
110
111option(WITH_ABSEIL "Whether to use Abseil for C++latest features" OFF)
112
113if(NOT DEFINED CMAKE_CXX_STANDARD)
114 if(WITH_STL)
115 # Require at least C++17. C++20 is needed to avoid gsl::span
116 if(CMAKE_VERSION VERSION_GREATER 3.11.999)
117 # Ask for 20, may get anything below
118 set(CMAKE_CXX_STANDARD 20)
119 else()
120 # Ask for 17, may get anything below
121 set(CMAKE_CXX_STANDARD 17)
122 endif()
123 else()
124 set(CMAKE_CXX_STANDARD 11)
125 endif()
126endif()
127
128if(WITH_STL)
129 # These definitions are needed for test projects that do not link against
130 # opentelemetry-api library directly. We ensure that variant implementation
131 # (absl::variant or std::variant) in variant unit test code is consistent with
132 # the global project build definitions. Optimize for speed to reduce the hops
133 if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
134 if(CMAKE_BUILD_TYPE MATCHES Debug)
135 # Turn off optimizations for DEBUG
136 set(MSVC_CXX_OPT_FLAG "/Od")
137 else()
138 string(REGEX MATCH "\/O" result ${CMAKE_CXX_FLAGS})
139 if(NOT ${result} MATCHES "\/O")
140 set(MSVC_CXX_OPT_FLAG "/O2")
141 endif()
142 endif()
143 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MSVC_CXX_OPT_FLAG}")
144 endif()
145endif()
146
147option(WITH_OTLP "Whether to include the OpenTelemetry Protocol in the SDK" OFF)
148option(WITH_ZIPKIN "Whether to include the Zipkin exporter in the SDK" OFF)
149
150option(WITH_PROMETHEUS "Whether to include the Prometheus Client in the SDK"
151 OFF)
152
153option(WITH_ELASTICSEARCH
154 "Whether to include the Elasticsearch Client in the SDK" OFF)
155
156option(WITH_ZPAGES "Whether to include the Zpages Server in the SDK" OFF)
157
158option(WITH_JAEGER "Whether to include the Jaeger exporter" OFF)
159
160option(WITH_NO_GETENV "Whether the platform supports environment variables" OFF)
161
162option(BUILD_TESTING "Whether to enable tests" ON)
163
164option(BUILD_W3CTRACECONTEXT_TEST "Whether to build w3c trace context" OFF)
165
166if(WIN32)
167 if(BUILD_TESTING)
168 if(MSVC)
169 # GTest bug: https://github.com/google/googletest/issues/860
170 add_compile_options(/wd4275)
171 endif()
172 endif()
173 option(WITH_ETW "Whether to include the ETW Exporter in the SDK" ON)
174endif(WIN32)
175
176# Do not convert deprecated message to error
177if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang")
178 add_compile_options(-Wno-error=deprecated-declarations)
179endif()
180
181option(
182 WITH_API_ONLY
183 "Only build the API (use as a header-only library). Overrides WITH_EXAMPLES and all options to enable exporters"
184 OFF)
185option(WITH_EXAMPLES "Whether to build examples" ON)
186
187option(WITH_METRICS_PREVIEW "Whether to build metrics preview" OFF)
188option(WITH_LOGS_PREVIEW "Whether to build logs preview" OFF)
189
190find_package(Threads)
191
192function(install_windows_deps)
193 # Bootstrap vcpkg from CMake and auto-install deps in case if we are missing
194 # deps on Windows. Respect the target architecture variable.
195 set(VCPKG_TARGET_ARCHITECTURE
196 ${ARCH}
197 PARENT_SCOPE)
198 message("Installing build tools and dependencies...")
199 set(ENV{ARCH} ${ARCH})
200 execute_process(
201 COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/tools/setup-buildtools.cmd)
202 set(CMAKE_TOOLCHAIN_FILE
203 ${CMAKE_CURRENT_SOURCE_DIR}/tools/vcpkg/scripts/buildsystems/vcpkg.cmake
204 PARENT_SCOPE)
205endfunction()
206
207if(WITH_JAEGER)
208 find_package(Thrift QUIET)
209 if(Thrift_FOUND)
210 find_package(Boost REQUIRED)
211 include_directories(${Boost_INCLUDE_DIR})
212 else()
213 # Install Thrift and propagate via vcpkg toolchain file
214 if(WIN32 AND (NOT DEFINED CMAKE_TOOLCHAIN_FILE))
215 install_windows_deps()
216 endif()
217 endif()
218endif()
219
220if(MSVC)
221 # Options for Visual C++ compiler: /Zc:__cplusplus - report an updated value
222 # for recent C++ language standards. Without this option MSVC returns the
223 # value of __cplusplus="199711L"
224 if(MSVC_VERSION GREATER 1900)
225 # __cplusplus flag is not supported by Visual Studio 2015
226 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zc:__cplusplus")
227 endif()
228 # When using vcpkg, all targets build with the same runtime
229 if(VCPKG_TOOLCHAIN)
230 set(CMAKE_MSVC_RUNTIME_LIBRARY
231 "MultiThreaded$<$<CONFIG:Debug>:Debug>$<$<STREQUAL:${VCPKG_CRT_LINKAGE},dynamic>:DLL>"
232 CACHE STRING "")
233 endif()
234endif()
235
236# include GNUInstallDirs before include cmake/opentelemetry-proto.cmake because
237# opentelemetry-proto installs targets to the location variables defined in
238# GNUInstallDirs.
239include(GNUInstallDirs)
240
241if((NOT WITH_API_ONLY)
242 AND (WITH_ELASTICSEARCH
243 OR WITH_ZIPKIN
244 OR WITH_OTLP
245 OR WITH_OTLP_HTTP
246 OR WITH_ZPAGES
247 OR BUILD_W3CTRACECONTEXT_TEST
248 OR WITH_ETW
249 ))
250 # nlohmann_json package is required for most SDK build configurations
251 find_package(nlohmann_json QUIET)
252 set(nlohmann_json_clone FALSE)
253 if(nlohmann_json_FOUND)
254 message("Using external nlohmann::json")
255 elseif(EXISTS ${PROJECT_SOURCE_DIR}/.git
256 AND EXISTS
257 ${PROJECT_SOURCE_DIR}/third_party/nlohmann-json/CMakeLists.txt)
258 message("Trying to use local nlohmann::json from submodule")
259 set(JSON_BuildTests
260 OFF
261 CACHE INTERNAL "")
262 set(JSON_Install
263 ON
264 CACHE INTERNAL "")
265 # This option allows to link nlohmann_json::nlohmann_json target
266 add_subdirectory(${PROJECT_SOURCE_DIR}/third_party/nlohmann-json)
267 # This option allows to add header to include directories
268 include_directories(
269 ${PROJECT_SOURCE_DIR}/third_party/nlohmann-json/single_include)
270 else()
271 set(nlohmann_json_clone TRUE)
272 include(cmake/nlohmann-json.cmake)
273 message("\nnlohmann_json package was not found. Cloning from github")
274 endif()
275endif()
276
277if(WITH_PROMETHEUS)
278 find_package(prometheus-cpp CONFIG QUIET)
279 if(NOT prometheus-cpp_FOUND)
280 message("Trying to use local prometheus-cpp from submodule")
281 if(EXISTS ${PROJECT_SOURCE_DIR}/third_party/prometheus-cpp/.git)
282 set(SAVED_ENABLE_TESTING ${ENABLE_TESTING})
283 set(ENABLE_TESTING OFF)
284 add_subdirectory(third_party/prometheus-cpp)
285 set(ENABLE_TESTING ${SAVED_ENABLE_TESTING})
286 else()
287 message(
288 FATAL_ERROR
289 "\nprometheus-cpp package was not found. Please either provide it manually or clone with submodules. "
290 "To initialize, fetch and checkout any nested submodules, you can use the following command:\n"
291 "git submodule update --init --recursive")
292 endif()
293 else()
294 message("Using external prometheus-cpp")
295 endif()
296endif()
297
298if(WITH_OTLP)
299 set(protobuf_MODULE_COMPATIBLE ON)
300 find_package(Protobuf)
301 if(WITH_OTLP_GRPC OR (NOT DEFINED WITH_OTLP_GRPC AND NOT DEFINED
302 CACHE{WITH_OTLP_GRPC}))
303 find_package(gRPC)
304 endif()
305 if((NOT Protobuf_FOUND AND NOT PROTOBUF_FOUND) OR (NOT gRPC_FOUND))
306 if(WIN32 AND (NOT DEFINED CMAKE_TOOLCHAIN_FILE))
307 install_windows_deps()
308 endif()
309
310 if(WIN32 AND (NOT DEFINED CMAKE_TOOLCHAIN_FILE))
311 message(STATUS_FATAL "Windows dependency installation failed!")
312 endif()
313 if(WIN32)
314 include(${CMAKE_TOOLCHAIN_FILE})
315 endif()
316
317 if(NOT Protobuf_FOUND AND NOT PROTOBUF_FOUND)
318 find_package(Protobuf REQUIRED)
319 endif()
320 if(NOT gRPC_FOUND
321 AND (WITH_OTLP_GRPC OR (NOT DEFINED WITH_OTLP_GRPC
322 AND NOT DEFINED CACHE{WITH_OTLP_GRPC})))
323 find_package(gRPC)
324 endif()
325 if(WIN32)
326 # Always use x64 protoc.exe
327 if(NOT EXISTS "${Protobuf_PROTOC_EXECUTABLE}")
328 set(Protobuf_PROTOC_EXECUTABLE
329 ${CMAKE_CURRENT_SOURCE_DIR}/tools/vcpkg/packages/protobuf_x64-windows/tools/protobuf/protoc.exe
330 )
331 endif()
332 endif()
333 # Latest Protobuf uses mixed case instead of uppercase
334 if(Protobuf_PROTOC_EXECUTABLE)
335 set(PROTOBUF_PROTOC_EXECUTABLE ${Protobuf_PROTOC_EXECUTABLE})
336 endif()
337 endif()
338 include(CMakeDependentOption)
339 if(WITH_OTLP_HTTP OR (NOT DEFINED WITH_OTLP_HTTP AND NOT DEFINED
340 CACHE{WITH_OTLP_HTTP}))
341 find_package(CURL)
342 endif()
343
344 cmake_dependent_option(
345 WITH_OTLP_GRPC "Whether to include the OTLP gRPC exporter in the SDK" ON
346 "gRPC_FOUND" OFF)
347 cmake_dependent_option(
348 WITH_OTLP_HTTP "Whether to include the OTLP http exporter in the SDK" ON
349 "CURL_FOUND" OFF)
350
351 message(STATUS "PROTOBUF_PROTOC_EXECUTABLE=${PROTOBUF_PROTOC_EXECUTABLE}")
352 include(cmake/opentelemetry-proto.cmake)
353endif()
354
355list(APPEND CMAKE_PREFIX_PATH "${CMAKE_BINARY_DIR}")
356
357include(CTest)
358if(BUILD_TESTING)
359 add_definitions(-DENABLE_TEST)
360 if(EXISTS ${CMAKE_BINARY_DIR}/lib/libgtest.a)
361 # Prefer GTest from build tree. GTest is not always working with
362 # CMAKE_PREFIX_PATH
363 set(GTEST_INCLUDE_DIRS
364 ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googletest/include
365 ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googlemock/include)
366 set(GTEST_BOTH_LIBRARIES
367 ${CMAKE_BINARY_DIR}/lib/libgtest.a
368 ${CMAKE_BINARY_DIR}/lib/libgtest_main.a
369 ${CMAKE_BINARY_DIR}/lib/libgmock.a)
370 elseif(WIN32)
371 # Make sure we are always bootsrapped with vcpkg on Windows
372 find_package(GTest REQUIRED)
373 if(NOT (GTEST_FOUND OR GTest_FOUND))
374 install_windows_deps()
375 find_package(GTest REQUIRED)
376 endif()
377 else()
378 # Prefer GTest installed by OS distro, brew or vcpkg package manager
379 find_package(GTest REQUIRED)
380 endif()
381 include_directories(SYSTEM ${GTEST_INCLUDE_DIRS})
382 message("GTEST_INCLUDE_DIRS = ${GTEST_INCLUDE_DIRS}")
383 message("GTEST_BOTH_LIBRARIES = ${GTEST_BOTH_LIBRARIES}")
384 enable_testing()
385 # Benchmark respects the CMAKE_PREFIX_PATH
386 find_package(benchmark CONFIG REQUIRED)
387endif()
388
389include(CMakePackageConfigHelpers)
390
391include_directories(api/include)
392
393add_subdirectory(api)
394
395if(NOT WITH_API_ONLY)
396 set(BUILD_TESTING ${BUILD_TESTING})
397 include_directories(sdk/include)
398 include_directories(sdk)
399 include_directories(ext/include)
400
401 add_subdirectory(sdk)
402 add_subdirectory(ext)
403 add_subdirectory(exporters)
404 if(WITH_EXAMPLES)
405 add_subdirectory(examples)
406 endif()
407endif()
408
409# Export cmake config and support find_packages(opentelemetry-cpp CONFIG) Write
410# config file for find_packages(opentelemetry-cpp CONFIG)
411set(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}")
412configure_package_config_file(
413 "${CMAKE_CURRENT_LIST_DIR}/cmake/opentelemetry-cpp-config.cmake.in"
414 "${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}/${PROJECT_NAME}-config.cmake"
415 INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
416 PATH_VARS OPENTELEMETRY_ABI_VERSION_NO OPENTELEMETRY_VERSION PROJECT_NAME
417 INCLUDE_INSTALL_DIR CMAKE_INSTALL_LIBDIR
418 NO_CHECK_REQUIRED_COMPONENTS_MACRO)
419
420# Write version file for find_packages(opentelemetry-cpp CONFIG)
421write_basic_package_version_file(
422 "${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}/${PROJECT_NAME}-config-version.cmake"
423 VERSION ${OPENTELEMETRY_VERSION}
424 COMPATIBILITY ExactVersion)
425
426install(
427 FILES
428 "${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}/${PROJECT_NAME}-config.cmake"
429 "${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}/${PROJECT_NAME}-config-version.cmake"
430 DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
431
432# Export all components
433export(
434 EXPORT "${PROJECT_NAME}-target"
435 NAMESPACE "${PROJECT_NAME}::"
436 FILE "${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}/${PROJECT_NAME}-target.cmake"
437)
438install(
439 EXPORT "${PROJECT_NAME}-target"
440 NAMESPACE "${PROJECT_NAME}::"
441 DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")