Skip to content

Commit 23768e9

Browse files
committed
chore(cmake): overall improvements
1 parent ae0d9a3 commit 23768e9

File tree

19 files changed

+586
-121
lines changed

19 files changed

+586
-121
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
/bazel-*
22
/.build/
3+
/build/
4+
/build-*/
35
/.coverage/
46
build/
57

CMakeLists.txt

Lines changed: 165 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
11
# Note: Make sure that this version is the same as that in
22
# "./CheckRequiredCMakeVersion.cmake".
3-
cmake_minimum_required(VERSION 3.24)
3+
cmake_minimum_required(VERSION 3.28...4.0)
44
cmake_policy(SET CMP0077 NEW)
55

6-
project(dd-trace-cpp)
6+
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
77

8-
set(CMAKE_CXX_STANDARD 17)
9-
set(CMAKE_CXX_STANDARD_REQUIRED ON)
10-
set(CMAKE_CXX_EXTENSIONS OFF)
11-
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
12-
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
8+
# Get the version of the lib
9+
file(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/src/datadog/version.cpp DD_TRACE_VERSION_CPP_CONTENTS REGEX "#define DD_TRACE_VERSION( |_NUM )")
10+
string(REGEX MATCH "#define DD_TRACE_VERSION \"[^\"]*" DD_TRACE_VERSION ${DD_TRACE_VERSION_CPP_CONTENTS})
11+
string(REGEX REPLACE "[^\"]+\"v" "" DD_TRACE_VERSION ${DD_TRACE_VERSION})
12+
13+
project(
14+
dd-trace-cpp
15+
VERSION ${DD_TRACE_VERSION}
16+
LANGUAGES CXX
17+
)
1318

1419
option(BUILD_SHARED_LIBS "Build shared libraries" ON)
1520
option(BUILD_STATIC_LIBS "Build static libraries" ON)
@@ -26,7 +31,6 @@ set(DD_TRACE_TRANSPORT "curl" CACHE STRING "HTTP transport that dd-trace-cpp use
2631

2732
if(DD_TRACE_TRANSPORT STREQUAL "curl")
2833
include(cmake/deps/curl.cmake)
29-
message(STATUS "DD_TRACE_TRANSPORT is set to 'curl', including curl")
3034
elseif(DD_TRACE_TRANSPORT STREQUAL "none")
3135
message(STATUS "DD_TRACE_TRANSPORT is set to 'none', no default transport will be included")
3236
else()
@@ -44,18 +48,16 @@ if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
4448
option(DD_TRACE_ENABLE_SANITIZE "Build with address sanitizer and undefined behavior sanitizer" OFF)
4549
endif()
4650

47-
if (NOT CMAKE_BUILD_TYPE)
48-
set(CMAKE_BUILD_TYPE "RelWithDebInfo")
49-
endif ()
51+
# Include mandatory files
52+
include(FetchContent)
53+
include(GNUInstallDirs)
54+
include(CMakePackageConfigHelpers)
5055

5156
# Linking this library requires threads.
5257
find_package(Threads REQUIRED)
5358
include(cmake/deps/json.cmake)
5459
include(cmake/utils.cmake)
5560

56-
file(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/src/datadog/version.cpp DD_TRACE_VERSION_CPP_CONTENTS REGEX "#define DD_TRACE_VERSION( |_NUM )")
57-
string(REGEX MATCH "#define DD_TRACE_VERSION \"[^\"]*" DD_TRACE_VERSION ${DD_TRACE_VERSION_CPP_CONTENTS})
58-
string(REGEX REPLACE "[^\"]+\"" "" DD_TRACE_VERSION ${DD_TRACE_VERSION})
5961
message(STATUS "dd-trace-cpp version=[${DD_TRACE_VERSION}]")
6062
unset(DD_TRACE_VERSION_CPP_CONTENTS)
6163

@@ -83,7 +85,10 @@ if (DD_TRACE_BUILD_FUZZERS)
8385
endif ()
8486

8587
if (DD_TRACE_BUILD_TESTING)
88+
include(Catch)
89+
enable_testing()
8690
add_subdirectory(test)
91+
add_subdirectory(test/system-tests)
8792
endif()
8893

8994
if (DD_TRACE_BUILD_EXAMPLES)
@@ -94,17 +99,68 @@ if (DD_TRACE_BUILD_BENCHMARK)
9499
add_subdirectory(benchmark)
95100
endif ()
96101

97-
add_library(dd_trace_cpp-objects OBJECT)
98-
add_library(dd_trace::obj ALIAS dd_trace_cpp-objects)
102+
add_library(dd-trace-cpp-objects OBJECT)
103+
add_library(dd-trace-cpp::obj ALIAS dd-trace-cpp-objects)
99104

100-
file(GLOB_RECURSE public_header_files ${CMAKE_SOURCE_DIR}/include/*.h)
105+
target_compile_features(dd-trace-cpp-objects
106+
PUBLIC
107+
cxx_std_17
108+
)
101109

102-
target_sources(dd_trace_cpp-objects
110+
# NOTE: Don't use glob:
111+
# - <https://stackoverflow.com/questions/32411963/why-is-cmake-file-glob-evil>
112+
# - <https://discourse.cmake.org/t/is-glob-still-considered-harmful-with-configure-depends/808>
113+
target_sources(dd-trace-cpp-objects
103114
PUBLIC
104115
FILE_SET public_headers
105116
TYPE HEADERS
106117
BASE_DIRS include
107-
FILES ${public_header_files}
118+
FILES
119+
include/datadog/remote_config/capability.h
120+
include/datadog/remote_config/listener.h
121+
include/datadog/remote_config/product.h
122+
include/datadog/telemetry/configuration.h
123+
include/datadog/telemetry/metrics.h
124+
include/datadog/telemetry/product.h
125+
include/datadog/telemetry/telemetry.h
126+
include/datadog/baggage.h
127+
include/datadog/cerr_logger.h
128+
include/datadog/clock.h
129+
include/datadog/collector.h
130+
include/datadog/config.h
131+
include/datadog/datadog_agent_config.h
132+
include/datadog/dict_reader.h
133+
include/datadog/dict_writer.h
134+
include/datadog/environment.h
135+
include/datadog/error.h
136+
include/datadog/event_scheduler.h
137+
include/datadog/expected.h
138+
include/datadog/http_client.h
139+
include/datadog/id_generator.h
140+
include/datadog/injection_options.h
141+
include/datadog/logger.h
142+
include/datadog/null_collector.h
143+
include/datadog/optional.h
144+
include/datadog/propagation_style.h
145+
include/datadog/rate.h
146+
include/datadog/runtime_id.h
147+
include/datadog/sampling_decision.h
148+
include/datadog/sampling_mechanism.h
149+
include/datadog/sampling_priority.h
150+
include/datadog/span.h
151+
include/datadog/span_config.h
152+
include/datadog/span_defaults.h
153+
include/datadog/span_matcher.h
154+
include/datadog/span_sampler_config.h
155+
include/datadog/string_view.h
156+
include/datadog/trace_id.h
157+
include/datadog/trace_sampler_config.h
158+
include/datadog/trace_segment.h
159+
include/datadog/trace_source.h
160+
include/datadog/tracer.h
161+
include/datadog/tracer_config.h
162+
include/datadog/tracer_signature.h
163+
include/datadog/version.h
108164
PRIVATE
109165
src/datadog/common/hash.cpp
110166
src/datadog/telemetry/configuration.cpp
@@ -156,102 +212,157 @@ target_sources(dd_trace_cpp-objects
156212
src/datadog/w3c_propagation.cpp
157213
)
158214

159-
# Headers location are different depending of whether we are building
160-
# or installing the library.
161-
target_include_directories(dd_trace_cpp-objects
162-
PUBLIC
163-
$<INSTALL_INTERFACE:include>
164-
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
215+
target_include_directories(dd-trace-cpp-objects
165216
PRIVATE
166217
${CMAKE_CURRENT_SOURCE_DIR}/src/datadog
167218
)
168219

169-
target_link_libraries(dd_trace_cpp-objects
220+
target_link_libraries(dd-trace-cpp-objects
170221
PUBLIC
171222
Threads::Threads
172223
PRIVATE
173-
dd_trace::specs
224+
dd-trace-cpp::specs
225+
)
226+
227+
set_target_properties(dd-trace-cpp-objects
228+
PROPERTIES
229+
VERIFY_INTERFACE_HEADER_SETS ON
230+
)
231+
232+
install(
233+
TARGETS dd-trace-cpp-objects dd-trace-cpp-specs
234+
EXPORT dd-trace-cpp-targets
235+
FILE_SET public_headers DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
174236
)
175237

176238
# Produce both shared and static versions of the library.
177239
if (BUILD_SHARED_LIBS)
178-
add_library(dd_trace_cpp-shared SHARED $<TARGET_OBJECTS:dd_trace_cpp-objects>)
179-
add_library(dd_trace::shared ALIAS dd_trace_cpp-shared)
240+
add_library(dd-trace-cpp-shared SHARED $<TARGET_OBJECTS:dd-trace-cpp-objects>)
241+
add_library(dd-trace-cpp::shared ALIAS dd-trace-cpp-shared)
180242

181-
if (DD_TRACE_TRANSPORT STREQUAL "curl")
182-
add_dependencies(dd_trace_cpp-shared CURL::libcurl_shared)
243+
if(DD_TRACE_TRANSPORT STREQUAL "curl")
244+
add_dependencies(dd-trace-cpp-shared CURL::libcurl_shared)
183245

184-
target_sources(dd_trace_cpp-shared
246+
target_sources(dd-trace-cpp-shared
185247
PRIVATE
186248
src/datadog/curl.cpp
187249
src/datadog/default_http_client_curl.cpp
188250
)
189251

190-
target_link_libraries(dd_trace_cpp-shared
252+
target_link_libraries(dd-trace-cpp-shared
191253
PRIVATE
192254
CURL::libcurl_shared
193255
)
256+
257+
install(
258+
TARGETS libcurl_shared
259+
EXPORT dd-trace-cpp-targets
260+
)
194261
else()
195-
target_sources(dd_trace_cpp-shared
262+
target_sources(dd-trace-cpp-shared
196263
PRIVATE
197264
src/datadog/default_http_client_null.cpp
198265
)
199-
endif ()
266+
endif()
200267

201-
target_link_libraries(dd_trace_cpp-shared
268+
target_link_libraries(dd-trace-cpp-shared
202269
PUBLIC
203-
dd_trace::obj
270+
dd-trace-cpp::obj
204271
PRIVATE
205-
dd_trace::specs
272+
dd-trace-cpp::specs
273+
)
274+
275+
set_target_properties(dd-trace-cpp-shared
276+
PROPERTIES
277+
OUTPUT_NAME "dd-trace-cpp"
206278
)
207279

208-
install(TARGETS dd_trace_cpp-objects dd_trace_cpp-shared
209-
EXPORT dd_trace_cpp-export
210-
FILE_SET public_headers DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
280+
install(
281+
TARGETS dd-trace-cpp-shared libcurl_shared
282+
EXPORT dd-trace-cpp-targets
211283
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
212284
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
213285
RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR}
214286
)
215287
endif ()
216288

217289
if (BUILD_STATIC_LIBS)
218-
add_library(dd_trace_cpp-static STATIC $<TARGET_OBJECTS:dd_trace_cpp-objects>)
219-
add_library(dd_trace::static ALIAS dd_trace_cpp-static)
290+
add_library(dd-trace-cpp-static STATIC $<TARGET_OBJECTS:dd-trace-cpp-objects>)
291+
add_library(dd-trace-cpp::static ALIAS dd-trace-cpp-static)
220292

221-
add_dependencies(dd_trace_cpp-static dd_trace_cpp-objects)
293+
add_dependencies(dd-trace-cpp-static dd-trace-cpp-objects)
222294

223295
if (DD_TRACE_TRANSPORT STREQUAL "curl")
224-
add_dependencies(dd_trace_cpp-static CURL::libcurl_static)
296+
add_dependencies(dd-trace-cpp-static CURL::libcurl_static)
225297

226-
target_sources(dd_trace_cpp-static
298+
target_sources(dd-trace-cpp-static
227299
PRIVATE
228300
src/datadog/curl.cpp
229301
src/datadog/default_http_client_curl.cpp
230302
)
231303

232-
target_link_libraries(dd_trace_cpp-static
304+
target_link_libraries(dd-trace-cpp-static
233305
PRIVATE
234306
CURL::libcurl_static
235307
)
308+
309+
install(
310+
TARGETS libcurl_static
311+
EXPORT dd-trace-cpp-targets
312+
)
236313
else()
237-
target_sources(dd_trace_cpp-static
314+
target_sources(dd-trace-cpp-static
238315
PRIVATE
239316
src/datadog/default_http_client_null.cpp
240317
)
241318
endif ()
242319

243-
target_link_libraries(dd_trace_cpp-static
320+
target_link_libraries(dd-trace-cpp-static
244321
PUBLIC
245-
dd_trace::obj
322+
dd-trace-cpp::obj
246323
PRIVATE
247-
dd_trace::specs
324+
dd-trace-cpp::specs
325+
)
326+
327+
set_target_properties(dd-trace-cpp-static
328+
PROPERTIES
329+
OUTPUT_NAME "dd-trace-cpp"
248330
)
249331

250-
install(TARGETS dd_trace_cpp-objects dd_trace_cpp-static
251-
EXPORT dd_trace_cpp-export
252-
FILE_SET public_headers DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
332+
install(
333+
TARGETS dd-trace-cpp-static
334+
EXPORT dd-trace-cpp-targets
253335
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
254336
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
255337
RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR}
256338
)
257339
endif ()
340+
341+
# install target
342+
write_basic_package_version_file(
343+
"${PROJECT_NAME}-config-version.cmake"
344+
VERSION ${PROJECT_VERSION}
345+
COMPATIBILITY SameMajorVersion
346+
)
347+
348+
configure_package_config_file(
349+
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/${PROJECT_NAME}-config.cmake.in"
350+
${PROJECT_NAME}-config.cmake
351+
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
352+
NO_CHECK_REQUIRED_COMPONENTS_MACRO
353+
PATH_VARS CMAKE_INSTALL_INCLUDEDIR
354+
)
355+
356+
install(
357+
EXPORT dd-trace-cpp-targets
358+
NAMESPACE dd-trace-cpp::
359+
FILE ${PROJECT_NAME}-targets.cmake
360+
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
361+
)
362+
363+
install(
364+
FILES
365+
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake"
366+
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake"
367+
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
368+
)

CMakePresets.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
"displayName": "Development",
2626
"cacheVariables": {
2727
"CMAKE_BUILD_TYPE": "Debug",
28+
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON",
2829
"DD_TRACE_ENABLE_SANITIZE": "OFF",
2930
"DD_TRACE_BUILD_TESTING": "ON",
3031
"DD_TRACE_BUILD_EXAMPLES": "ON",

CheckRequiredCMakeVersion.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@
88
# incompatible or something else went wrong.
99
#
1010
# Note: Make sure that this version is the same as that in "./CMakeLists.txt".
11-
cmake_minimum_required(VERSION 3.24)
11+
cmake_minimum_required(VERSION 3.28)

0 commit comments

Comments
 (0)