Skip to content

Commit 4da9b67

Browse files
authored
[CMAKE] Add CMake scripts to find or fetch curl and find zlib (#3526)
1 parent 62ba4de commit 4da9b67

File tree

9 files changed

+152
-121
lines changed

9 files changed

+152
-121
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ jobs:
7373
- name: install dependencies
7474
run: |
7575
sudo -E apt-get update
76-
sudo -E apt-get install -y zlib1g-dev libcurl4-openssl-dev libabsl-dev libprotobuf-dev libgrpc++-dev protobuf-compiler protobuf-compiler-grpc
76+
sudo -E apt-get install -y zlib1g-dev libabsl-dev libprotobuf-dev libgrpc++-dev protobuf-compiler protobuf-compiler-grpc
7777
- name: run fetch content cmake test
7878
run: |
7979
./ci/do_ci.sh cmake.fetch_content.test

CMakeLists.txt

Lines changed: 40 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,42 @@ endif()
304304
# GNUInstallDirs.
305305
include(GNUInstallDirs)
306306

307+
#
308+
# Do we need HTTP CLIENT CURL ?
309+
#
310+
311+
if(WITH_OTLP_HTTP
312+
OR WITH_ELASTICSEARCH
313+
OR WITH_ZIPKIN
314+
OR BUILD_W3CTRACECONTEXT_TEST
315+
OR WITH_EXAMPLES_HTTP)
316+
set(WITH_HTTP_CLIENT_CURL ON)
317+
else()
318+
set(WITH_HTTP_CLIENT_CURL OFF)
319+
endif()
320+
321+
#
322+
# Do we need ZLIB ?
323+
#
324+
325+
if((NOT WITH_API_ONLY)
326+
AND WITH_HTTP_CLIENT_CURL
327+
AND WITH_OTLP_HTTP_COMPRESSION)
328+
include("${opentelemetry-cpp_SOURCE_DIR}/cmake/zlib.cmake")
329+
endif()
330+
331+
#
332+
# Do we need CURL ?
333+
#
334+
335+
if((NOT WITH_API_ONLY) AND WITH_HTTP_CLIENT_CURL)
336+
include("${opentelemetry-cpp_SOURCE_DIR}/cmake/curl.cmake")
337+
endif()
338+
339+
#
340+
# Do we need prometheus-cpp ?
341+
#
342+
307343
if(WITH_PROMETHEUS)
308344
include("${opentelemetry-cpp_SOURCE_DIR}/cmake/prometheus-cpp.cmake")
309345
endif()
@@ -387,50 +423,6 @@ if(WITH_OTLP_GRPC
387423
set(CMAKE_CXX_CLANG_TIDY ${SAVED_CMAKE_CXX_CLANG_TIDY})
388424
endif()
389425

390-
#
391-
# Do we need HTTP CLIENT CURL ?
392-
#
393-
394-
if(WITH_OTLP_HTTP
395-
OR WITH_ELASTICSEARCH
396-
OR WITH_ZIPKIN
397-
OR BUILD_W3CTRACECONTEXT_TEST
398-
OR WITH_EXAMPLES_HTTP)
399-
set(WITH_HTTP_CLIENT_CURL ON)
400-
else()
401-
set(WITH_HTTP_CLIENT_CURL OFF)
402-
endif()
403-
404-
#
405-
# Do we need CURL ?
406-
#
407-
408-
if((NOT WITH_API_ONLY) AND WITH_HTTP_CLIENT_CURL)
409-
# No specific version required.
410-
find_package(CURL REQUIRED)
411-
# Set the CURL_VERSION from the legacy CURL_VERSION_STRING Required for CMake
412-
# versions below 4.0
413-
if(NOT DEFINED CURL_VERSION AND DEFINED CURL_VERSION_STRING)
414-
set(CURL_VERSION ${CURL_VERSION_STRING})
415-
endif()
416-
endif()
417-
418-
#
419-
# Do we need ZLIB ?
420-
#
421-
422-
if((NOT WITH_API_ONLY)
423-
AND WITH_HTTP_CLIENT_CURL
424-
AND WITH_OTLP_HTTP_COMPRESSION)
425-
# No specific version required.
426-
find_package(ZLIB REQUIRED)
427-
# Set the ZLIB_VERSION from the legacy ZLIB_VERSION_STRING Required for CMake
428-
# versions below 3.26
429-
if(NOT DEFINED ZLIB_VERSION AND DEFINED ZLIB_VERSION_STRING)
430-
set(ZLIB_VERSION ${ZLIB_VERSION_STRING})
431-
endif()
432-
endif()
433-
434426
#
435427
# Do we need NLOHMANN_JSON ?
436428
#
@@ -658,11 +650,11 @@ endif()
658650
if(gRPC_FOUND)
659651
message(STATUS "gRPC: ${gRPC_VERSION}")
660652
endif()
661-
if(CURL_FOUND)
662-
message(STATUS "CURL: ${CURL_VERSION}")
653+
if(CURL_VERSION)
654+
message(STATUS "CURL: ${CURL_VERSION} (${CURL_PROVIDER})")
663655
endif()
664-
if(ZLIB_FOUND)
665-
message(STATUS "ZLIB: ${ZLIB_VERSION}")
656+
if(ZLIB_VERSION)
657+
message(STATUS "ZLIB: ${ZLIB_VERSION} (${ZLIB_PROVIDER})")
666658
endif()
667659
if(USE_NLOHMANN_JSON)
668660
message(

cmake/curl.cmake

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# Copyright The OpenTelemetry Authors
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
# Import the curl target (CURL::libcurl).
5+
# 1. Find an installed curl package
6+
# 2. Use FetchContent to fetch and build curl from GitHub
7+
8+
# Find the curl package with the default search mode
9+
find_package(CURL QUIET)
10+
set(CURL_PROVIDER "find_package")
11+
12+
if(NOT CURL_FOUND)
13+
FetchContent_Declare(
14+
"curl"
15+
GIT_REPOSITORY "https://github.com/curl/curl.git"
16+
GIT_TAG "${curl_GIT_TAG}"
17+
)
18+
set(CURL_PROVIDER "fetch_repository")
19+
20+
if(OPENTELEMETRY_INSTALL)
21+
set(_CURL_DISABLE_INSTALL OFF)
22+
else()
23+
set(_CURL_DISABLE_INSTALL ON)
24+
endif()
25+
26+
if(DEFINED BUILD_SHARED_LIBS)
27+
set(_SAVED_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
28+
endif()
29+
30+
set(CURL_DISABLE_INSTALL ${_CURL_DISABLE_INSTALL} CACHE BOOL "" FORCE)
31+
set(CURL_USE_LIBPSL OFF CACHE BOOL "" FORCE)
32+
set(BUILD_CURL_EXE OFF CACHE BOOL "" FORCE)
33+
set(BUILD_LIBCURL_DOCS OFF CACHE BOOL "" FORCE)
34+
set(BUILD_MISC_DOCS OFF CACHE BOOL "" FORCE)
35+
set(ENABLE_CURL_MANUAL OFF CACHE BOOL "" FORCE)
36+
set(BUILD_SHARED_LIBS ON CACHE BOOL "" FORCE)
37+
38+
FetchContent_MakeAvailable(curl)
39+
40+
# Restore BUILD_SHARED_LIBS
41+
if(DEFINED _SAVED_BUILD_SHARED_LIBS)
42+
set(BUILD_SHARED_LIBS ${_SAVED_BUILD_SHARED_LIBS} CACHE BOOL "" FORCE)
43+
else()
44+
unset(BUILD_SHARED_LIBS CACHE)
45+
endif()
46+
47+
# Set the CURL_VERSION variable from the git tag.
48+
string(REGEX REPLACE "^curl-([0-9]+)_([0-9]+)_([0-9]+)$" "\\1.\\2.\\3" CURL_VERSION "${curl_GIT_TAG}")
49+
50+
# disable iwyu and clang-tidy
51+
foreach(_curl_target libcurl_shared libcurl_static)
52+
if(TARGET ${_curl_target})
53+
set_target_properties(${_curl_target} PROPERTIES CXX_INCLUDE_WHAT_YOU_USE ""
54+
CXX_CLANG_TIDY "")
55+
endif()
56+
endforeach()
57+
endif()
58+
59+
# Set the CURL_VERSION from the legacy CURL_VERSION_STRING Required for CMake
60+
# versions below 4.0
61+
if(NOT CURL_VERSION AND CURL_VERSION_STRING)
62+
set(CURL_VERSION ${CURL_VERSION_STRING})
63+
endif()
64+
65+
# Add the main CURL::libcurl alias target if missing. Prefer the shared target followed by the static target
66+
if(NOT TARGET CURL::libcurl)
67+
if(TARGET libcurl_shared)
68+
add_library(CURL::libcurl ALIAS libcurl_shared)
69+
elseif(TARGET libcurl_static)
70+
add_library(CURL::libcurl ALIAS libcurl_static)
71+
endif()
72+
endif()
73+
74+
if(NOT TARGET CURL::libcurl)
75+
message(FATAL_ERROR "The required curl target (CURL::libcurl) was not imported.")
76+
endif()

cmake/zlib.cmake

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Copyright The OpenTelemetry Authors
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
# ZLIB must be found as an installed package for now.
5+
# Fetching ZLIB and building in-tree is not supported.
6+
# Protobuf, gRPC, prometheus-cpp, civetweb, CURL, and other dependencies require ZLIB and import its target.
7+
# When ZLIB::ZLIB is an alias of the shared library then inconsistent linking may occur.
8+
9+
find_package(ZLIB REQUIRED)
10+
set(ZLIB_PROVIDER "find_package")
11+
12+
# Set the ZLIB_VERSION from the legacy ZLIB_VERSION_STRING Required for CMake
13+
# versions below 3.26
14+
if(NOT ZLIB_VERSION AND ZLIB_VERSION_STRING)
15+
set(ZLIB_VERSION ${ZLIB_VERSION_STRING})
16+
endif()
17+
18+
if(NOT TARGET ZLIB::ZLIB)
19+
message(FATAL_ERROR "The required zlib target (ZLIB::ZLIB) was not imported.")
20+
endif()

examples/http/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ add_executable(http_server server.cc)
77
target_link_libraries(
88
http_client
99
PRIVATE opentelemetry-cpp::trace opentelemetry-cpp::http_client_curl
10-
opentelemetry-cpp::ostream_span_exporter ${CURL_LIBRARIES})
10+
opentelemetry-cpp::ostream_span_exporter CURL::libcurl)
1111

1212
target_link_libraries(
1313
http_server

exporters/zipkin/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ if(BUILD_TESTING)
5959
${GMOCK_LIB}
6060
opentelemetry_exporter_zipkin_trace
6161
opentelemetry_resources
62-
${CURL_LIBRARIES})
62+
CURL::libcurl)
6363

6464
gtest_add_tests(
6565
TARGET zipkin_exporter_test

ext/src/http/client/curl/CMakeLists.txt

Lines changed: 8 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -11,60 +11,21 @@ set_target_version(opentelemetry_http_client_curl)
1111
target_link_libraries(opentelemetry_http_client_curl
1212
PUBLIC opentelemetry_common)
1313

14-
unset(CURL_IMPORTED_TARGET_NAME)
15-
16-
foreach(FIND_CURL_IMPORTED_TARGET CURL::libcurl CURL::libcurl_shared
17-
CURL::libcurl_static)
18-
if(TARGET ${FIND_CURL_IMPORTED_TARGET})
19-
set(CURL_IMPORTED_TARGET_NAME ${FIND_CURL_IMPORTED_TARGET})
20-
break()
21-
endif()
22-
endforeach()
23-
24-
if(TARGET ${CURL_IMPORTED_TARGET_NAME})
25-
target_link_libraries(
26-
opentelemetry_http_client_curl
27-
PUBLIC opentelemetry_ext
28-
PRIVATE ${CURL_IMPORTED_TARGET_NAME})
29-
30-
# Some versions of libcurl do not export the link directories, which may cause
31-
# link errors
32-
project_build_tools_get_imported_location(CURL_LIB_FILE_PATH
33-
${CURL_IMPORTED_TARGET_NAME})
34-
get_filename_component(CURL_LIB_DIR_PATH "${CURL_LIB_FILE_PATH}" DIRECTORY)
35-
36-
if(CURL_LIB_DIR_PATH)
37-
target_link_directories(opentelemetry_http_client_curl PUBLIC
38-
"$<BUILD_INTERFACE:${CURL_LIB_DIR_PATH}>")
39-
endif()
40-
else()
41-
target_include_directories(opentelemetry_http_client_curl
42-
INTERFACE "${CURL_INCLUDE_DIRS}")
43-
target_link_libraries(
44-
opentelemetry_http_client_curl
45-
PUBLIC opentelemetry_ext
46-
PRIVATE ${CURL_LIBRARIES})
47-
endif()
14+
target_link_libraries(
15+
opentelemetry_http_client_curl
16+
PUBLIC opentelemetry_ext
17+
PRIVATE CURL::libcurl)
4818

4919
if(WITH_CURL_LOGGING)
5020
target_compile_definitions(opentelemetry_http_client_curl
5121
PRIVATE ENABLE_CURL_LOGGING)
5222
endif()
5323

5424
if(WITH_OTLP_HTTP_COMPRESSION)
55-
if(TARGET ZLIB::ZLIB)
56-
target_link_libraries(
57-
opentelemetry_http_client_curl
58-
PUBLIC opentelemetry_ext
59-
PRIVATE ZLIB::ZLIB)
60-
else()
61-
target_include_directories(opentelemetry_http_client_curl
62-
INTERFACE "${ZLIB_INCLUDE_DIRS}")
63-
target_link_libraries(
64-
opentelemetry_http_client_curl
65-
PUBLIC opentelemetry_ext
66-
PRIVATE ${ZLIB_LIBRARIES})
67-
endif()
25+
target_link_libraries(
26+
opentelemetry_http_client_curl
27+
PUBLIC opentelemetry_ext
28+
PRIVATE ZLIB::ZLIB)
6829
endif()
6930

7031
otel_add_component(COMPONENT ext_http_curl TARGETS

ext/test/http/CMakeLists.txt

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,10 @@
44
if(WITH_HTTP_CLIENT_CURL)
55
set(FILENAME curl_http_test)
66
add_executable(${FILENAME} ${FILENAME}.cc)
7-
target_link_libraries(${FILENAME} ${GMOCK_LIB} ${GTEST_BOTH_LIBRARIES}
8-
${CMAKE_THREAD_LIBS_INIT})
9-
10-
unset(CURL_IMPORTED_TARGET_NAME)
11-
12-
foreach(FIND_CURL_IMPORTED_TARGET CURL::libcurl CURL::libcurl_shared
13-
CURL::libcurl_static)
14-
if(TARGET ${FIND_CURL_IMPORTED_TARGET})
15-
set(CURL_IMPORTED_TARGET_NAME ${FIND_CURL_IMPORTED_TARGET})
16-
break()
17-
endif()
18-
endforeach()
19-
20-
if(TARGET ${CURL_IMPORTED_TARGET_NAME})
21-
target_link_libraries(${FILENAME} opentelemetry_http_client_curl
22-
opentelemetry_common ${CURL_IMPORTED_TARGET_NAME})
23-
else()
24-
target_include_directories(${FILENAME} PRIVATE ${CURL_INCLUDE_DIRS})
25-
target_link_libraries(${FILENAME} ${CURL_LIBRARIES}
26-
opentelemetry_http_client_curl opentelemetry_common)
27-
endif()
28-
7+
target_link_libraries(
8+
${FILENAME}
9+
PRIVATE ${GMOCK_LIB} ${GTEST_BOTH_LIBRARIES} opentelemetry_http_client_curl
10+
opentelemetry_common CURL::libcurl)
2911
gtest_add_tests(
3012
TARGET ${FILENAME}
3113
TEST_PREFIX ext.http.curl.

ext/test/w3c_tracecontext_http_test_server/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ target_link_libraries(
66
w3c_tracecontext_http_test_server
77
PRIVATE ${CMAKE_THREAD_LIBS_INIT} opentelemetry_trace
88
opentelemetry_http_client_curl opentelemetry_exporter_ostream_span
9-
${CURL_LIBRARIES} nlohmann_json::nlohmann_json)
9+
CURL::libcurl nlohmann_json::nlohmann_json)

0 commit comments

Comments
 (0)