Skip to content

Commit 467353c

Browse files
committed
add options to control how dependencies are found. Add support for fetching zlib and building in tree
1 parent c4f00c9 commit 467353c

File tree

9 files changed

+148
-43
lines changed

9 files changed

+148
-43
lines changed

.github/workflows/cmake_install.yml

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jobs:
1919
CMAKE_VERSION: '3.31.6'
2020
# cxx17 is the default for windows-2022
2121
CXX_STANDARD: '17'
22-
CMAKE_ARGS: "-DWITH_STL=CXX17"
22+
CMAKE_ARGS: "-DWITH_STL=CXX17 -DOPENTELEMETRY_REQUIRE_LOCAL_DEPENDENCIES=ON"
2323
steps:
2424
- name: Harden the runner (Audit all outbound calls)
2525
uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
@@ -46,7 +46,7 @@ jobs:
4646
CMAKE_VERSION: '3.15.0'
4747
# cxx14 is the default for windows-2019
4848
CXX_STANDARD: '14'
49-
CMAKE_ARGS: "-DWITH_GSL=ON"
49+
CMAKE_ARGS: "-DWITH_GSL=ON -DOPENTELEMETRY_REQUIRE_LOCAL_DEPENDENCIES=ON"
5050
steps:
5151
- name: Harden the runner (Audit all outbound calls)
5252
uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0
@@ -72,6 +72,7 @@ jobs:
7272
CMAKE_VERSION: '3.28.3'
7373
# cxx17 is the default for Ubuntu 24.04
7474
CXX_STANDARD: '17'
75+
CMAKE_ARGS: "-DOPENTELEMETRY_REQUIRE_LOCAL_DEPENDENCIES=ON"
7576
BUILD_TYPE: 'Debug'
7677
steps:
7778
- name: Harden the runner (Audit all outbound calls)
@@ -108,6 +109,7 @@ jobs:
108109
CMAKE_VERSION: '3.28.3'
109110
# The default cxx standard for Ubuntu 24.04
110111
CXX_STANDARD: '17'
112+
CMAKE_ARGS: "-DOPENTELEMETRY_FORCE_FETCH_DEPENDENCIES=ON"
111113
BUILD_TYPE: 'Debug'
112114
steps:
113115
- name: Harden the runner (Audit all outbound calls)
@@ -273,6 +275,7 @@ jobs:
273275
# CMake 3.28 is apt package version for Ubuntu 24.04
274276
CMAKE_VERSION: '3.28.3'
275277
CXX_STANDARD: '17'
278+
CMAKE_ARGS: "-DOPENTELEMETRY_REQUIRE_LOCAL_DEPENDENCIES=ON"
276279
CMAKE_TOOLCHAIN_FILE: /home/runner/conan/build/Debug/generators/conan_toolchain.cmake
277280
BUILD_TYPE: 'Debug'
278281
steps:
@@ -284,6 +287,9 @@ jobs:
284287
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
285288
with:
286289
submodules: false
290+
- name: Get required submodules
291+
run: |
292+
git submodule update --init --depth 1 third_party/opentelemetry-proto
287293
- name: Install Conan
288294
run: |
289295
python3 -m pip install pip==25.0.1
@@ -316,6 +322,7 @@ jobs:
316322
# Set to the latest version of cmake 3.x
317323
CMAKE_VERSION: '3.31.6'
318324
CXX_STANDARD: '17'
325+
CMAKE_ARGS: "-DOPENTELEMETRY_REQUIRE_LOCAL_DEPENDENCIES=ON"
319326
CMAKE_TOOLCHAIN_FILE: /home/runner/conan/build/Debug/generators/conan_toolchain.cmake
320327
BUILD_TYPE: 'Debug'
321328
steps:
@@ -327,6 +334,9 @@ jobs:
327334
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
328335
with:
329336
submodules: false
337+
- name: Get required submodules
338+
run: |
339+
git submodule update --init --depth 1 third_party/opentelemetry-proto
330340
- name: Install Conan
331341
run: |
332342
python3 -m pip install pip==25.0.1
@@ -354,6 +364,7 @@ jobs:
354364
INSTALL_TEST_DIR: '/Users/runner/install_test'
355365
CMAKE_VERSION: '3.28.3'
356366
CXX_STANDARD: '17'
367+
CMAKE_ARGS: "-DOPENTELEMETRY_REQUIRE_LOCAL_DEPENDENCIES=ON"
357368
CMAKE_TOOLCHAIN_FILE: '/Users/runner/conan/build/Debug/generators/conan_toolchain.cmake'
358369
BUILD_TYPE: 'Debug'
359370
steps:
@@ -365,6 +376,9 @@ jobs:
365376
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
366377
with:
367378
submodules: false
379+
- name: Get required submodules
380+
run: |
381+
git submodule update --init --depth 1 third_party/opentelemetry-proto
368382
- name: Install Conan and tools
369383
run: |
370384
brew install conan autoconf automake libtool coreutils
@@ -385,6 +399,7 @@ jobs:
385399
# Set to the latest version of cmake 3.x
386400
CMAKE_VERSION: '3.31.6'
387401
CXX_STANDARD: '17'
402+
CMAKE_ARGS: "-DOPENTELEMETRY_REQUIRE_LOCAL_DEPENDENCIES=ON"
388403
BUILD_TYPE: 'Debug'
389404
steps:
390405
- name: Harden the runner (Audit all outbound calls)
@@ -395,6 +410,9 @@ jobs:
395410
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
396411
with:
397412
submodules: false
413+
- name: Get required submodules
414+
run: |
415+
git submodule update --init --depth 1 third_party/opentelemetry-proto
398416
- name: Install Dependencies with Homebrew
399417
run: |
400418
./ci/setup_cmake_macos.sh

CMakeLists.txt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,10 +246,22 @@ option(OPENTELEMETRY_SKIP_DYNAMIC_LOADING_TESTS
246246
"Whether to build test libraries that are always linked as shared libs"
247247
OFF)
248248

249+
option(OPENTELEMETRY_FORCE_FETCH_DEPENDENCIES
250+
"Whether to force fetching dependencies from submodules or git repositories"
251+
OFF)
252+
253+
option(OPENTELEMETRY_REQUIRE_LOCAL_DEPENDENCIES
254+
"Whether to require finding dependencies as a locally installed package or submodules"
255+
OFF)
256+
249257
#
250258
# Verify options dependencies
251259
#
252-
260+
if(OPENTELEMETRY_FORCE_FETCH_DEPENDENCIES AND OPENTELEMETRY_REQUIRE_LOCAL_DEPENDENCIES)
261+
message(FATAL_ERROR "OPENTELEMETRY_FORCE_FETCH_DEPENDENCIES and "
262+
"OPENTELEMETRY_REQUIRE_LOCAL_DEPENDENCIES are mutually "
263+
"exclusive options. Both can be OFF but only one can be ON.")
264+
endif()
253265
if(WITH_EXAMPLES_HTTP AND NOT WITH_EXAMPLES)
254266
message(FATAL_ERROR "WITH_EXAMPLES_HTTP=ON requires WITH_EXAMPLES=ON")
255267
endif()

ci/do_ci.ps1

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,13 @@ switch ($action) {
359359
$CXX_STANDARD = 14
360360
}
361361
Write-Host "Using CXX_STANDARD: $CXX_STANDARD"
362+
363+
if (Test-Path Env:\CMAKE_ARGS) {
364+
$CMAKE_ARGS = (Get-Item Env:\CMAKE_ARGS).Value
365+
} else {
366+
$CMAKE_ARGS = ""
367+
}
368+
Write-Host "Using CMAKE_ARGS: $CMAKE_ARGS"
362369

363370
$CMAKE_OPTIONS = @(
364371
"-DCMAKE_CXX_STANDARD=$CXX_STANDARD",
@@ -370,6 +377,7 @@ switch ($action) {
370377

371378
cmake $SRC_DIR `
372379
$CMAKE_OPTIONS `
380+
$CMAKE_ARGS `
373381
"-DCMAKE_INSTALL_PREFIX=$INSTALL_TEST_DIR" `
374382
-DWITH_ABI_VERSION_1=OFF `
375383
-DWITH_ABI_VERSION_2=ON `

cmake/curl.cmake

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22
# SPDX-License-Identifier: Apache-2.0
33

44
if(OPENTELEMETRY_INSTALL)
5-
set(CURL_DISABLE_INSTALL OFF CACHE BOOL "" FORCE)
5+
set(_CURL_DISABLE_INSTALL OFF)
66
else()
7-
set(CURL_DISABLE_INSTALL ON CACHE BOOL "" FORCE)
7+
set(_CURL_DISABLE_INSTALL ON)
88
endif()
99

10+
set(_OTEL_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
11+
1012
add_thirdparty_package(
1113
PACKAGE_NAME CURL
1214
FETCH_NAME curl
@@ -16,22 +18,26 @@ add_thirdparty_package(
1618
VERSION_REGEX "#define[ \t]+LIBCURL_VERSION[ \t]+\"([0-9]+\\.[0-9]+\\.[0-9]+(-[A-Za-z0-9]+)?)\""
1719
VERSION_FILE "\${curl_SOURCE_DIR}/include/curl/curlver.h"
1820
CMAKE_ARGS
21+
CURL_DISABLE_INSTALL=${_CURL_DISABLE_INSTALL}
1922
CURL_USE_LIBPSL=OFF
2023
BUILD_CURL_EXE=OFF
2124
BUILD_LIBCURL_DOCS=OFF
2225
BUILD_MISC_DOCS=OFF
2326
ENABLE_CURL_MANUAL=OFF
27+
BUILD_SHARED_LIBS=ON
2428
)
2529

26-
unset(CURL_DISABLE_INSTALL)
30+
set(BUILD_SHARED_LIBS ${_OTEL_BUILD_SHARED_LIBS} CACHE BOOL "" FORCE)
31+
unset(_OTEL_BUILD_SHARED_LIBS)
32+
unset(_CURL_DISABLE_INSTALL)
2733

28-
foreach(FIND_CURL_IMPORTED_TARGET CURL::libcurl CURL::libcurl_shared
29-
CURL::libcurl_static)
30-
if(TARGET ${FIND_CURL_IMPORTED_TARGET})
31-
set(CURL_IMPORTED_TARGET_NAME ${FIND_CURL_IMPORTED_TARGET})
32-
break()
33-
endif()
34-
endforeach()
34+
if(TARGET CURL::libcurl)
35+
set(CURL_IMPORTED_TARGET_NAME CURL::libcurl)
36+
elseif(TARGET CURL::libcurl_shared)
37+
set(CURL_IMPORTED_TARGET_NAME CURL::libcurl_shared)
38+
elseif(TARGET CURL::libcurl_static)
39+
set(CURL_IMPORTED_TARGET_NAME CURL::libcurl_static)
40+
endif()
3541

3642
if(NOT TARGET ${CURL_IMPORTED_TARGET_NAME})
3743
message(FATAL_ERROR "CURL imported target not found.")

cmake/grpc.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ add_thirdparty_package(
2424
gRPC_BUILD_GRPC_RUBY_PLUGIN=OFF
2525
gRPC_BUILD_GRPCPP_OTEL_PLUGIN=OFF
2626
RE2_BUILD_TESTING=OFF
27+
gRPC_ZLIB_PROVIDER=module
28+
gRPC_PROTOBUF_PROVIDER=module
2729
)
2830

2931
if(TARGET grpc++)

cmake/opentracing-cpp.cmake

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Copyright The OpenTelemetry Authors
22
# SPDX-License-Identifier: Apache-2.0
33

4-
set(OTEL_BUILD_TESTING ${BUILD_TESTING})
4+
set(_OTEL_BUILD_TESTING ${BUILD_TESTING})
55

66
add_thirdparty_package(
77
PACKAGE_NAME OpenTracing
@@ -16,7 +16,8 @@ add_thirdparty_package(
1616
BUILD_TESTING=OFF
1717
)
1818

19-
set(BUILD_TESTING ${OTEL_BUILD_TESTING} CACHE BOOL "" FORCE)
19+
set(BUILD_TESTING ${_OTEL_BUILD_TESTING} CACHE BOOL "" FORCE)
20+
unset(_OTEL_BUILD_TESTING)
2021

2122
if(NOT ${OpenTracing_PROVIDER} STREQUAL "package")
2223
if(TARGET opentracing AND NOT TARGET OpenTracing::opentracing)

cmake/protobuf.cmake

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,12 @@
33

44
if(DEFINED gRPC_PROVIDER AND NOT gRPC_PROVIDER STREQUAL "package" AND TARGET libprotobuf)
55
# gRPC was fetched and built protobuf as a submodule
6+
set(Protobuf_PROVIDER "grpc_submodule")
67
add_thirdparty_package(
78
PACKAGE_NAME Protobuf
89
VERSION_REGEX "\"cpp\"[ \t]*:[ \t]*\"([0-9]+\\.[0-9]+(\\.[0-9]+)?)\""
910
VERSION_FILE "\${grpc_SOURCE_DIR}/third_party/protobuf/version.json"
1011
)
11-
message(STATUS "Using Protobuf from gRPC submodule. version file is ${grpc_SOURCE_DIR}/third_party/protobuf/version.json")
12-
set(Protobuf_PROVIDER "grpc_submodule")
1312
else()
1413
# Protobuf 3.22+ depends on abseil-cpp and must be found using the cmake
1514
# find_package CONFIG search mode. The following attempts to find Protobuf
@@ -29,6 +28,7 @@ else()
2928
protobuf_INSTALL=${OPENTELEMETRY_INSTALL}
3029
protobuf_BUILD_TESTS=OFF
3130
protobuf_BUILD_EXAMPLES=OFF
31+
protobuf_WITH_ZLIB=OFF
3232
)
3333
endif()
3434

cmake/tools.cmake

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -286,32 +286,35 @@ function(add_thirdparty_package)
286286
message(DEBUG " Version file: ${_THIRDPARTY_VERSION_FILE}")
287287
message(DEBUG " CMake args: ${_THIRDPARTY_CMAKE_ARGS}")
288288

289-
foreach(_search_mode IN LISTS _THIRDPARTY_SEARCH_MODES)
290-
message(STATUS " Searching for ${_THIRDPARTY_PACKAGE_NAME} with search mode ${_search_mode}")
291-
find_package(${_THIRDPARTY_PACKAGE_NAME} ${_search_mode} QUIET)
292-
if(${_THIRDPARTY_PACKAGE_NAME}_FOUND)
293-
if(DEFINED ${_THIRDPARTY_PACKAGE_NAME}_VERSION_STRING AND NOT DEFINED ${_THIRDPARTY_PACKAGE_NAME}_VERSION)
294-
set(${_THIRDPARTY_PACKAGE_NAME}_VERSION ${${_THIRDPARTY_PACKAGE_NAME}_VERSION_STRING})
289+
if(NOT OPENTELEMETRY_FORCE_FETCH_DEPENDENCIES)
290+
foreach(_search_mode IN LISTS _THIRDPARTY_SEARCH_MODES)
291+
message(STATUS " Searching for ${_THIRDPARTY_PACKAGE_NAME} with search mode ${_search_mode}")
292+
find_package(${_THIRDPARTY_PACKAGE_NAME} ${_search_mode} QUIET)
293+
if(${_THIRDPARTY_PACKAGE_NAME}_FOUND)
294+
if(DEFINED ${_THIRDPARTY_PACKAGE_NAME}_VERSION_STRING AND NOT DEFINED ${_THIRDPARTY_PACKAGE_NAME}_VERSION)
295+
set(${_THIRDPARTY_PACKAGE_NAME}_VERSION ${${_THIRDPARTY_PACKAGE_NAME}_VERSION_STRING})
296+
endif()
297+
message(STATUS " Found ${_THIRDPARTY_PACKAGE_NAME} with search mode ${_search_mode}")
298+
break()
295299
endif()
296-
message(STATUS " Found ${_THIRDPARTY_PACKAGE_NAME} with search mode ${_search_mode}")
297-
break()
298-
endif()
299-
endforeach()
300+
endforeach()
301+
endif()
300302

301303
if(${_THIRDPARTY_PACKAGE_NAME}_FOUND)
302304
set("${_THIRDPARTY_PACKAGE_NAME}_PROVIDER" "package")
303305
elseif(DEFINED _THIRDPARTY_SOURCE_DIR OR DEFINED _THIRDPARTY_GIT_REPOSITORY)
304-
message(STATUS " Fetching ${_THIRDPARTY_PACKAGE_NAME}")
305306
# Use FetchContent to fetch the package if not found
306307
include(FetchContent)
307308

308309
if(DEFINED _THIRDPARTY_SOURCE_DIR AND EXISTS "${_THIRDPARTY_SOURCE_DIR}/.git")
310+
message(STATUS " Fetching ${_THIRDPARTY_PACKAGE_NAME} from local source at ${_THIRDPARTY_SOURCE_DIR}")
309311
FetchContent_Declare(
310312
${_THIRDPARTY_FETCH_NAME}
311313
SOURCE_DIR ${_THIRDPARTY_SOURCE_DIR}
312314
)
313315
set("${_THIRDPARTY_PACKAGE_NAME}_PROVIDER" "fetch_source")
314-
elseif(DEFINED _THIRDPARTY_GIT_REPOSITORY AND DEFINED _THIRDPARTY_GIT_TAG)
316+
elseif( NOT OPENTELEMETRY_REQUIRE_LOCAL_DEPENDENCIES AND DEFINED _THIRDPARTY_GIT_REPOSITORY AND DEFINED _THIRDPARTY_GIT_TAG)
317+
message(STATUS " Fetching ${_THIRDPARTY_PACKAGE_NAME} from ${_THIRDPARTY_GIT_REPOSITORY} at tag ${_THIRDPARTY_GIT_TAG}")
315318
FetchContent_Declare(
316319
${_THIRDPARTY_FETCH_NAME}
317320
GIT_REPOSITORY

cmake/zlib.cmake

Lines changed: 69 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,76 @@
11
# Copyright The OpenTelemetry Authors
22
# SPDX-License-Identifier: Apache-2.0
33

4-
if(NOT OPENTELEMETRY_INSTALL)
5-
set(SKIP_INSTALL_ALL ON)
4+
if(TARGET zlib)
5+
if(DEFINED gRPC_PROVIDER AND NOT gRPC_PROVIDER STREQUAL "package")
6+
set(ZLIB_PROVIDER "grpc")
7+
elseif(DEFIND Protobuf_PROVIDER AND NOT Protobuf_PROVIDER STREQUAL "package")
8+
set(ZLIB_PROVIDER "protobuf")
9+
endif()
610
endif()
711

8-
add_thirdparty_package(
9-
PACKAGE_NAME ZLIB
10-
FETCH_NAME zlib
11-
SEARCH_MODES "MODULE" "CONFIG"
12-
GIT_REPOSITORY "https://github.com/madler/zlib.git"
13-
GIT_TAG ${ZLIB_GIT_TAG}
14-
REQUIRED_TARGETS "ZLIB::ZLIB"
15-
VERSION_REGEX "set\\([ \t]*VERSION[ \t]+\"([0-9]+\\.[0-9]+\\.[0-9]+)\"\\)"
16-
VERSION_FILE "\${zlib_SOURCE_DIR}/CMakeLists.txt"
17-
CMAKE_ARGS
18-
ZLIB_BUILD_EXAMPLES=OFF
12+
if( DEFINED ZLIB_PROVIDER)
13+
# zlib was built as a submodule of gRPC or Protobuf
14+
add_thirdparty_package(
15+
PACKAGE_NAME ZLIB
16+
VERSION_REGEX "set\\([ \t]*VERSION[ \t]+\"([0-9]+\\.[0-9]+\\.[0-9]+)\"\\)"
17+
VERSION_FILE "\${${ZLIB_PROVIDER}_SOURCE_DIR}/third_party/zlib/CMakeLists.txt"
18+
)
19+
else()
20+
if(${OPENTELEMETRY_INSTALL})
21+
set(_SKIP_ZLIB_INSTALL OFF)
22+
else()
23+
set(_SKIP_ZLIB_INSTALL ON)
24+
endif()
25+
26+
add_thirdparty_package(
27+
PACKAGE_NAME ZLIB
28+
FETCH_NAME zlib
29+
SEARCH_MODES "MODULE" "CONFIG"
30+
GIT_REPOSITORY "https://github.com/madler/zlib.git"
31+
GIT_TAG ${ZLIB_GIT_TAG}
32+
VERSION_REGEX "set\\([ \t]*VERSION[ \t]+\"([0-9]+\\.[0-9]+\\.[0-9]+)\"\\)"
33+
VERSION_FILE "\${zlib_SOURCE_DIR}/CMakeLists.txt"
34+
CMAKE_ARGS
35+
ZLIB_BUILD_EXAMPLES=OFF
36+
ZLIB_INSTALL=${OPENTELEMETRY_INSTALL}
37+
SKIP_INSTALL_ALL=${_SKIP_ZLIB_INSTALL}
38+
SKIP_INSTALL_LIBRARIES=${_SKIP_ZLIB_INSTALL}
39+
)
40+
unset(_SKIP_ZLIB_INSTALL)
41+
endif()
42+
43+
if(TARGET zlib AND NOT TARGET ZLIB::ZLIB)
44+
set_target_properties(zlib
45+
PROPERTIES
46+
INTERFACE_INCLUDE_DIRECTORIES ""
1947
)
48+
set_target_properties(zlib PROPERTIES EXPORT_NAME ZLIB)
49+
target_include_directories(zlib
50+
INTERFACE
51+
$<BUILD_INTERFACE:${zlib_SOURCE_DIR}>
52+
$<BUILD_INTERFACE:${zlib_BINARY_DIR}>
53+
$<INSTALL_INTERFACE:include>
54+
)
55+
add_library(ZLIB::ZLIB ALIAS zlib)
56+
endif()
2057

21-
unset(SKIP_INSTALL_ALL)
58+
if(NOT TARGET ZLIB::ZLIB)
59+
message(FATAL_ERROR "A required zlib target (ZLIB::ZLIB) was not found")
60+
endif()
61+
62+
if(OPENTELEMETRY_INSTALL)
63+
install(
64+
TARGETS zlib
65+
EXPORT "zlib-target"
66+
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
67+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
68+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT "zlib")
69+
70+
install(
71+
EXPORT "zlib-target"
72+
FILE "zlib-target.cmake"
73+
NAMESPACE "ZLIB::"
74+
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/ZLIB"
75+
COMPONENT "zlib")
76+
endif()

0 commit comments

Comments
 (0)