Skip to content

Commit 4b91ec0

Browse files
committed
Add cmake script to find or fetch curl. Add cmake script to find zlib. Test fetching curl in ci workflow
1 parent 1ad6674 commit 4b91ec0

File tree

9 files changed

+150
-119
lines changed

9 files changed

+150
-119
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: 38 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,42 @@ endif()
300300
# GNUInstallDirs.
301301
include(GNUInstallDirs)
302302

303+
#
304+
# Do we need HTTP CLIENT CURL ?
305+
#
306+
307+
if(WITH_OTLP_HTTP
308+
OR WITH_ELASTICSEARCH
309+
OR WITH_ZIPKIN
310+
OR BUILD_W3CTRACECONTEXT_TEST
311+
OR WITH_EXAMPLES_HTTP)
312+
set(WITH_HTTP_CLIENT_CURL ON)
313+
else()
314+
set(WITH_HTTP_CLIENT_CURL OFF)
315+
endif()
316+
317+
#
318+
# Do we need ZLIB ?
319+
#
320+
321+
if((NOT WITH_API_ONLY)
322+
AND WITH_HTTP_CLIENT_CURL
323+
AND WITH_OTLP_HTTP_COMPRESSION)
324+
include("${opentelemetry-cpp_SOURCE_DIR}/cmake/zlib.cmake")
325+
endif()
326+
327+
#
328+
# Do we need CURL ?
329+
#
330+
331+
if((NOT WITH_API_ONLY) AND WITH_HTTP_CLIENT_CURL)
332+
include("${opentelemetry-cpp_SOURCE_DIR}/cmake/curl.cmake")
333+
endif()
334+
335+
#
336+
# Do we need prometheus-cpp ?
337+
#
338+
303339
if(WITH_PROMETHEUS)
304340
include("${opentelemetry-cpp_SOURCE_DIR}/cmake/prometheus-cpp.cmake")
305341
endif()
@@ -383,50 +419,6 @@ if(WITH_OTLP_GRPC
383419
set(CMAKE_CXX_CLANG_TIDY ${SAVED_CMAKE_CXX_CLANG_TIDY})
384420
endif()
385421

386-
#
387-
# Do we need HTTP CLIENT CURL ?
388-
#
389-
390-
if(WITH_OTLP_HTTP
391-
OR WITH_ELASTICSEARCH
392-
OR WITH_ZIPKIN
393-
OR BUILD_W3CTRACECONTEXT_TEST
394-
OR WITH_EXAMPLES_HTTP)
395-
set(WITH_HTTP_CLIENT_CURL ON)
396-
else()
397-
set(WITH_HTTP_CLIENT_CURL OFF)
398-
endif()
399-
400-
#
401-
# Do we need CURL ?
402-
#
403-
404-
if((NOT WITH_API_ONLY) AND WITH_HTTP_CLIENT_CURL)
405-
# No specific version required.
406-
find_package(CURL REQUIRED)
407-
# Set the CURL_VERSION from the legacy CURL_VERSION_STRING Required for CMake
408-
# versions below 4.0
409-
if(NOT DEFINED CURL_VERSION AND DEFINED CURL_VERSION_STRING)
410-
set(CURL_VERSION ${CURL_VERSION_STRING})
411-
endif()
412-
endif()
413-
414-
#
415-
# Do we need ZLIB ?
416-
#
417-
418-
if((NOT WITH_API_ONLY)
419-
AND WITH_HTTP_CLIENT_CURL
420-
AND WITH_OTLP_HTTP_COMPRESSION)
421-
# No specific version required.
422-
find_package(ZLIB REQUIRED)
423-
# Set the ZLIB_VERSION from the legacy ZLIB_VERSION_STRING Required for CMake
424-
# versions below 3.26
425-
if(NOT DEFINED ZLIB_VERSION AND DEFINED ZLIB_VERSION_STRING)
426-
set(ZLIB_VERSION ${ZLIB_VERSION_STRING})
427-
endif()
428-
endif()
429-
430422
#
431423
# Do we need NLOHMANN_JSON ?
432424
#
@@ -647,10 +639,10 @@ if(gRPC_FOUND)
647639
message(STATUS "gRPC: ${gRPC_VERSION}")
648640
endif()
649641
if(CURL_FOUND)
650-
message(STATUS "CURL: ${CURL_VERSION}")
642+
message(STATUS "CURL: ${CURL_VERSION} (${CURL_PROVIDER})")
651643
endif()
652644
if(ZLIB_FOUND)
653-
message(STATUS "ZLIB: ${ZLIB_VERSION}")
645+
message(STATUS "ZLIB: ${ZLIB_VERSION} (${ZLIB_PROVIDER})")
654646
endif()
655647
if(USE_NLOHMANN_JSON)
656648
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 "^v([0-9]+\\.[0-9]+\\.[0-9]+)$" "\\1" 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)