1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504
|
# Copyright The OpenTelemetry Authors
# SPDX-License-Identifier: Apache-2.0
include("${PROJECT_SOURCE_DIR}/cmake/thirdparty-dependency-config.cmake")
########################################################################
# INTERNAL FUNCTIONS - do not call directly. Use the otel_* "Main" functions
########################################################################
#-----------------------------------------------------------------------
# _otel_set_component_properties:
# Sets the component properties used for install.
# Properties set on PROJECT_SOURCE_DIR directory include:
# OTEL_COMPONENTS_LIST: List of components added using otel_add_component
# OTEL_COMPONENT_TARGETS_<component>: List of targets associated with the component
# OTEL_COMPONENT_TARGETS_ALIAS_<component>: List of targets aliases associated with the component
# OTEL_COMPONENT_FILES_DIRECTORY_<component>: Directory containing files to be installed with the component
# OTEL_COMPONENT_FILES_DESTINATION_<component>: Destination directory for the files
# OTEL_COMPONENT_FILES_MATCHING_<component>: Matching pattern for the files to be installed
# OTEL_COMPONENT_DEPENDS_<component>: List of components that this component depends on
# OTEL_COMPONENT_THIRDPARTY_DEPENDS_<component>: List of thirdparty dependencies that this component depends on
#-----------------------------------------------------------------------
function(_otel_set_component_properties)
set(optionArgs )
set(oneValueArgs COMPONENT FILES_DIRECTORY FILES_DESTINATION)
set(multiValueArgs TARGETS TARGETS_ALIAS FILES_MATCHING COMPONENT_DEPENDS THIRDPARTY_DEPENDS)
cmake_parse_arguments(_PROPERTIES "${optionArgs}" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}")
# Add the component to the current components list
get_property(existing_components DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENTS_LIST)
if(_PROPERTIES_COMPONENT IN_LIST existing_components)
message(FATAL_ERROR " component ${_PROPERTIES_COMPONENT} has already been created.")
endif()
list(APPEND existing_components "${_PROPERTIES_COMPONENT}")
set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENTS_LIST "${existing_components}")
# Set the component targets property
if(_PROPERTIES_TARGETS)
set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_TARGETS_${_PROPERTIES_COMPONENT} "${_PROPERTIES_TARGETS}")
else()
message(FATAL_ERROR " component ${_PROPERTIES_COMPONENT} does not have any targets.")
endif()
# Set the component targets alias property
if(_PROPERTIES_TARGETS_ALIAS)
set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_TARGETS_ALIAS_${_PROPERTIES_COMPONENT} "${_PROPERTIES_TARGETS_ALIAS}")
endif()
# Set the component files property
if(_PROPERTIES_FILES_DIRECTORY)
if(NOT _PROPERTIES_FILES_DESTINATION)
message(FATAL_ERROR " component ${_PROPERTIES_COMPONENT} has FILES_DIRECTORY set and must have FILES_DESINATION set.")
endif()
if(NOT _PROPERTIES_FILES_MATCHING)
message(FATAL_ERROR " component ${_PROPERTIES_COMPONENT} has FILES_DIRECTORY set and must have FILES_MATCHING set.")
endif()
set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_FILES_DIRECTORY_${_PROPERTIES_COMPONENT} "${_PROPERTIES_FILES_DIRECTORY}")
set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_FILES_DESTINATION_${_PROPERTIES_COMPONENT} "${_PROPERTIES_FILES_DESTINATION}")
set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_FILES_MATCHING_${_PROPERTIES_COMPONENT} "${_PROPERTIES_FILES_MATCHING}")
endif()
if(_PROPERTIES_COMPONENT_DEPENDS)
set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_DEPENDS_${_PROPERTIES_COMPONENT} "${_PROPERTIES_COMPONENT_DEPENDS}")
endif()
if(_PROPERTIES_THIRDPARTY_DEPENDS)
set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_THIRDPARTY_DEPENDS_${_PROPERTIES_COMPONENT} "${_PROPERTIES_THIRDPARTY_DEPENDS}")
endif()
endfunction()
#-----------------------------------------------------------------------
# _otel_set_target_component_property:
# Sets the target's INTERFACE_OTEL_COMPONENT_NAME property to the component.
# A target can only be assigned to one component.
# Note: The INTERFACE_* prefix can be dropped with CMake 3.19+ when custom
# properties without the prefix are supported on INTERFACE targets.
#-----------------------------------------------------------------------
function(_otel_set_target_component_property _TARGET _COMPONENT)
get_target_property(_TARGET_COMPONENT ${_TARGET} INTERFACE_OTEL_COMPONENT_NAME)
if(_TARGET_COMPONENT)
message(FATAL_ERROR " Target ${_TARGET} is already assigned to an opentelemetry-cpp COMPONENT ${_TARGET_COMPONENT}.")
endif()
set_target_properties(${_TARGET} PROPERTIES INTERFACE_OTEL_COMPONENT_NAME ${_OTEL_ADD_COMP_COMPONENT})
endfunction()
#-----------------------------------------------------------------------
# _otel_append_dependent_components:
# Appends the dependent component to the OUT_COMPONENTS variable.
# The dependent component is defined in the OTEL_COMPONENT_DEPENDS_<component> property
# on the PROJECT_SOURCE_DIR directory.
#-----------------------------------------------------------------------
function(_otel_append_dependent_components _COMPONENT OUT_COMPONENTS)
get_property(_COMPONENT_DEPENDS DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_DEPENDS_${_COMPONENT})
if(_COMPONENT_DEPENDS)
set(_output_components "${${OUT_COMPONENTS}}")
message(DEBUG " - adding dependent component ${_COMPONENT_DEPENDS} from component ${_COMPONENT}")
list(APPEND _output_components ${_COMPONENT_DEPENDS})
set(${OUT_COMPONENTS} "${_output_components}" PARENT_SCOPE)
endif()
endfunction()
#-----------------------------------------------------------------------
# _otel_append_component_found:
# Checks if the target is associated with an otel component using the INTERFACE_OTEL_COMPONENT_NAME target property.
# If so then the component is appended to the OUT_COMPONENTS varaiable.
#-----------------------------------------------------------------------
function(_otel_append_component_found _COMPONENT _TARGET OUT_COMPONENTS OUT_COMPONENT_FOUND)
set(_output_components "${${OUT_COMPONENTS}}")
get_target_property(_DEPEND_COMPONENT ${_TARGET} INTERFACE_OTEL_COMPONENT_NAME)
if(_DEPEND_COMPONENT AND NOT ${_DEPEND_COMPONENT} STREQUAL ${_COMPONENT})
_otel_append_dependent_components(${_DEPEND_COMPONENT} _output_components)
message(DEBUG " - adding dependent component ${_DEPEND_COMPONENT} from target ${_TARGET}")
list(APPEND _output_components ${_DEPEND_COMPONENT})
set(${OUT_COMPONENT_FOUND} TRUE PARENT_SCOPE)
else()
set(${OUT_COMPONENT_FOUND} FALSE PARENT_SCOPE)
endif()
set(${OUT_COMPONENTS} "${_output_components}" PARENT_SCOPE)
endfunction()
#-----------------------------------------------------------------------
# _otel_append_thirdparty_found:
# Tries to match one of the supported third-party dependencies to the target name.
# If found the dependency project name is appended to the OUT_THIRDPARTY_DEPS variable.
# The match is based on the OTEL_THIRDPARTY_DEPENDENCIES_SUPPORTED list and optional
# OTEL_<dependency>_TARGET_NAMESPACE variables.
#------------------------------------------------------------------------
function(_otel_append_thirdparty_found _TARGET OUT_THIRDPARTY_DEPS)
set(_output_thirdparty_deps "${${OUT_THIRDPARTY_DEPS}}")
foreach(_DEPENDENCY ${OTEL_THIRDPARTY_DEPENDENCIES_SUPPORTED})
# Search for the dependency namespace in the target name
if(NOT "${OTEL_${_DEPENDENCY}_TARGET_NAMESPACE}" STREQUAL "")
set(_DEPENDENCY_NAMESPACE "${OTEL_${_DEPENDENCY}_TARGET_NAMESPACE}")
else()
set(_DEPENDENCY_NAMESPACE "${_DEPENDENCY}")
endif()
string(FIND "${_TARGET}" "${_DEPENDENCY_NAMESPACE}" _is_thirdparty)
if(_is_thirdparty GREATER -1)
message(DEBUG " - adding thirdparty dependency ${_DEPENDENCY} from target ${_TARGET}")
list(APPEND _output_thirdparty_deps ${_DEPENDENCY})
endif()
endforeach()
set(${OUT_THIRDPARTY_DEPS} "${_output_thirdparty_deps}" PARENT_SCOPE)
endfunction()
#-----------------------------------------------------------------------
# _otel_collect_component_dependencies:
# Collects the component to component dependencies and thirdparty dependencies of a target.
# The dependencies are collected from the target's LINK_LIBRARIES property# and are appended
# to the OUT_COMPONENT_DEPS and OUT_THIRDPARTY_DEPS variables.
#------------------------------------------------------------------------
function(_otel_collect_component_dependencies _TARGET _COMPONENT OUT_COMPONENT_DEPS OUT_THIRDPARTY_DEPS)
get_target_property(_TARGET_TYPE ${_TARGET} TYPE)
message(DEBUG " Target: ${_TARGET} - Type: ${_TARGET_TYPE}")
# Set the linked libraries to search for dependencies
set(_linked_libraries "")
if(_TARGET_TYPE STREQUAL "INTERFACE_LIBRARY")
get_target_property(_interface_libs ${_TARGET} INTERFACE_LINK_LIBRARIES)
set(_linked_libraries "${_interface_libs}")
message(DEBUG " - INTERFACE_LINK_LIBRARIES: ${_interface_libs}")
else()
get_target_property(_link_libs ${_TARGET} LINK_LIBRARIES)
set(_linked_libraries "${_link_libs}")
message(DEBUG " - LINK_LIBRARIES: ${_link_libs}")
endif()
set(_component_deps "${${OUT_COMPONENT_DEPS}}")
set(_thirdparty_deps "${${OUT_THIRDPARTY_DEPS}}")
foreach(_linked_target ${_linked_libraries})
# Handle targets
if(TARGET "${_linked_target}")
set(_component_found FALSE)
_otel_append_component_found(${_COMPONENT} "${_linked_target}" _component_deps _component_found)
if(NOT ${_component_found})
_otel_append_thirdparty_found(${_linked_target} _thirdparty_deps)
endif()
continue()
endif()
# Skip BUILD_INTERFACE targets
string(FIND "${_linked_target}" "$<BUILD_INTERFACE:" _is_build_interface)
if(_is_build_interface GREATER -1)
message(DEBUG " - skipping BUILD_INTERFACE target: ${_linked_target}")
continue()
endif()
# Handle targets in generator expressions
string(FIND "${_linked_target}" "$<" _is_generator_expression)
if(_is_generator_expression GREATER -1)
# Find targets in generator expressions (there can be more than one per expression)
string(REGEX MATCHALL "[A-Za-z0-9_\\-\\.]+(::[A-Za-z0-9_\\-\\.]+)*" _parsed_targets "${_linked_target}")
foreach(_parsed_target ${_parsed_targets})
if(TARGET ${_parsed_target})
set(_component_found FALSE)
_otel_append_component_found(${_COMPONENT} "${_parsed_target}" _component_deps _component_found)
if(NOT ${_component_found})
_otel_append_thirdparty_found(${_parsed_target} _thirdparty_deps)
endif()
endif()
endforeach()
endif()
endforeach()
list(REMOVE_DUPLICATES _component_deps)
list(REMOVE_DUPLICATES _thirdparty_deps)
set(${OUT_COMPONENT_DEPS} "${_component_deps}" PARENT_SCOPE)
set(${OUT_THIRDPARTY_DEPS} "${_thirdparty_deps}" PARENT_SCOPE)
endfunction()
#-----------------------------------------------------------------------
# _otel_add_target_alias:
# Adds an alias target using target's export name and project name.
# opentelemetry-cpp::<target_export_name>
#------------------------------------------------------------------------
function(_otel_add_target_alias _TARGET OUT_ALIAS_TARGETS)
get_target_property(_TARGET_EXPORT_NAME ${_TARGET} EXPORT_NAME)
if(NOT _TARGET_EXPORT_NAME)
message(FATAL_ERROR " Target ${_TARGET} does not have an EXPORT_NAME property.")
elseif(NOT TARGET "${PROJECT_NAME}::${_TARGET_EXPORT_NAME}")
add_library("${PROJECT_NAME}::${_TARGET_EXPORT_NAME}" ALIAS ${_TARGET})
endif()
set(_alias_targets "${${OUT_ALIAS_TARGETS}}")
list(APPEND _alias_targets "${PROJECT_NAME}::${_TARGET_EXPORT_NAME}")
set(${OUT_ALIAS_TARGETS} "${_alias_targets}" PARENT_SCOPE)
endfunction()
#-----------------------------------------------------------------------
# _otel_install_component:
# Installs the component targets and optional files
#-----------------------------------------------------------------------
function(_otel_install_component _COMPONENT)
install(
TARGETS ${_COMPONENT_TARGETS}
EXPORT "${PROJECT_NAME}-${_COMPONENT}-target"
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT ${_COMPONENT})
install(
EXPORT "${PROJECT_NAME}-${_COMPONENT}-target"
FILE "${PROJECT_NAME}-${_COMPONENT}-target.cmake"
NAMESPACE "${PROJECT_NAME}::"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
COMPONENT ${_COMPONENT})
if(_COMPONENT_FILES_DIRECTORY)
install(
DIRECTORY ${_COMPONENT_FILES_DIRECTORY}
DESTINATION ${_COMPONENT_FILES_DESTINATION}
COMPONENT ${_COMPONENT}
FILES_MATCHING ${_COMPONENT_FILES_MATCHING})
endif()
endfunction()
#-----------------------------------------------------------------------
# _otel_populate_component_targets_block:
# Populates the OTEL_COMPONENTS_TARGETS_BLOCK with the component targets
# - sets COMPONENT_<component>_TARGETS variables
#-----------------------------------------------------------------------
function(_otel_populate_component_targets_block IN_COMPONENT COMPONENTS_TARGETS_BLOCK)
# Populate OTEL_COMPONENTS_TARGETS_BLOCK
set(_targets_block ${${COMPONENTS_TARGETS_BLOCK}})
string(APPEND _targets_block
"# COMPONENT ${IN_COMPONENT}\n"
"set(COMPONENT_${IN_COMPONENT}_TARGETS\n"
)
foreach(_TARGET IN LISTS _COMPONENT_TARGETS_ALIAS)
string(APPEND _targets_block " ${_TARGET}\n")
endforeach()
string(APPEND _targets_block ")\n\n")
set(${COMPONENTS_TARGETS_BLOCK} "${_targets_block}" PARENT_SCOPE)
endfunction()
#-----------------------------------------------------------------------
# _otel_populate_component_internal_depends_block:
# Populates the OTEL_COMPONENTS_INTERNAL_DEPENDENCIES_BLOCK with the component dependencies
# - sets COMPONENT_<component>_COMPONENT_DEPENDS variables
#-----------------------------------------------------------------------
function(_otel_populate_component_internal_depends_block IN_COMPONENT COMPONENTS_INTERNAL_DEPENDENCIES_BLOCK)
# Populate OTEL_COMPONENTS_INTERNAL_DEPENDENCIES_BLOCK
set(_deps_block ${${COMPONENTS_INTERNAL_DEPENDENCIES_BLOCK}})
string(APPEND _deps_block
"# COMPONENT ${IN_COMPONENT} internal dependencies\n"
"set(COMPONENT_${IN_COMPONENT}_COMPONENT_DEPENDS\n"
)
foreach(dep IN LISTS _COMPONENT_DEPENDS)
string(APPEND _deps_block " ${dep}\n")
endforeach()
string(APPEND _deps_block ")\n\n")
set(${COMPONENTS_INTERNAL_DEPENDENCIES_BLOCK} "${_deps_block}" PARENT_SCOPE)
endfunction()
#-----------------------------------------------------------------------
function(_otel_populate_component_thirdparty_depends_block IN_COMPONENT COMPONENTS_THIRDPARTY_DEPENDENCIES_BLOCK)
# Populate OTEL_COMPONENTS_THIRDPARTY_DEPENDENCIES_BLOCK
set(_deps_block ${${COMPONENTS_THIRDPARTY_DEPENDENCIES_BLOCK}})
string(APPEND _deps_block
"# COMPONENT ${IN_COMPONENT} thirdparty dependencies\n"
"set(COMPONENT_${IN_COMPONENT}_THIRDPARTY_DEPENDS\n"
)
foreach(dep IN LISTS _COMPONENT_THIRDPARTY_DEPENDS)
string(APPEND _deps_block " ${dep}\n")
endforeach()
string(APPEND _deps_block ")\n\n")
set(${COMPONENTS_THIRDPARTY_DEPENDENCIES_BLOCK} "${_deps_block}" PARENT_SCOPE)
endfunction()
#-----------------------------------------------------------------------
########################################################################
# Main functions to support installing components
# and the opentlemetry-cpp cmake package config files
########################################################################
#-----------------------------------------------------------------------
# otel_add_component:
# Adds a component to the list of components to be installed. A component name and list of targest are required.
# Optional files can be added to the component by specifying a directory, destination and matching pattern.
# Each target is assigned to the component and its dependencies are identified based on the LINK_LIBRARIES property.
# An alias target is also created for each target in the form of PROJECT_NAME::TARGET_EXPORT_NAME.
# Usage:
# otel_add_component(
# COMPONENT <component_name>
# TARGETS <target1> <target2> ...
# FILES_DIRECTORY <directory>
# FILES_DESTINATION <destination>
# FILES_MATCHING <matching>)
#-----------------------------------------------------------------------
function(otel_add_component)
set(optionArgs )
set(oneValueArgs COMPONENT FILES_DIRECTORY FILES_DESTINATION)
set(multiValueArgs TARGETS FILES_MATCHING)
cmake_parse_arguments(_OTEL_ADD_COMP "${optionArgs}" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}")
if(NOT _OTEL_ADD_COMP_COMPONENT)
message(FATAL_ERROR "otel_add_component: COMPONENT is required")
endif()
if(NOT _OTEL_ADD_COMP_TARGETS)
message(FATAL_ERROR "otel_add_component: TARGETS is required")
endif()
message(DEBUG "Add COMPONENT: ${_OTEL_ADD_COMP_COMPONENT}")
set(_COMPONENT_DEPENDS "")
set(_THIRDPARTY_DEPENDS "")
set(_ALIAS_TARGETS "")
foreach(_TARGET ${_OTEL_ADD_COMP_TARGETS})
if(NOT TARGET ${_TARGET})
message(FATAL_ERROR " Target ${_TARGET} not found")
endif()
_otel_set_target_component_property(${_TARGET} ${_OTEL_ADD_COMP_COMPONENT})
_otel_collect_component_dependencies(${_TARGET} ${_OTEL_ADD_COMP_COMPONENT} _COMPONENT_DEPENDS _THIRDPARTY_DEPENDS)
_otel_add_target_alias(${_TARGET} _ALIAS_TARGETS)
endforeach()
if(_OTEL_ADD_COMP_FILES_DIRECTORY)
set(_OTEL_ADD_COMP_FILES_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${_OTEL_ADD_COMP_FILES_DIRECTORY}")
endif()
message(DEBUG " TARGETS: ${_OTEL_ADD_COMP_TARGETS}")
message(DEBUG " TARGETS_ALIAS: ${_ALIAS_TARGETS}")
message(DEBUG " COMPONENT_DEPENDS: ${_COMPONENT_DEPENDS}")
message(DEBUG " THIRDPARTY_DEPENDS: ${_THIRDPARTY_DEPENDS}")
message(DEBUG " FILES_DIRECTORY: ${_OTEL_ADD_COMP_FILES_DIRECTORY}")
message(DEBUG " FILES_DESTINATION: ${_OTEL_ADD_COMP_FILES_DESTINATION}")
message(DEBUG " FILES_MATCHING: ${_OTEL_ADD_COMP_FILES_MATCHING}")
_otel_set_component_properties(
COMPONENT ${_OTEL_ADD_COMP_COMPONENT}
TARGETS ${_OTEL_ADD_COMP_TARGETS}
TARGETS_ALIAS ${_ALIAS_TARGETS}
FILES_DIRECTORY ${_OTEL_ADD_COMP_FILES_DIRECTORY}
FILES_DESTINATION ${_OTEL_ADD_COMP_FILES_DESTINATION}
FILES_MATCHING ${_OTEL_ADD_COMP_FILES_MATCHING}
COMPONENT_DEPENDS ${_COMPONENT_DEPENDS}
THIRDPARTY_DEPENDS ${_THIRDPARTY_DEPENDS})
endfunction()
#-----------------------------------------------------------------------
# otel_install_components:
# Installs all components that have been added using otel_add_component.
# The components are installed in the order they were added.
# The install function will create a cmake config file for each component
# that contains the component name, targets, dependencies and thirdparty dependencies.
# Usage:
# otel_install_components()
#-----------------------------------------------------------------------
function(otel_install_components)
get_property(OTEL_BUILT_COMPONENTS_LIST DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENTS_LIST)
message(STATUS "Installing components:")
set(OTEL_COMPONENTS_TARGETS_BLOCK "")
set(OTEL_COMPONENTS_INTERNAL_DEPENDENCIES_BLOCK "")
set(OTEL_COMPONENTS_THIRDPARTY_DEPENDENCIES_BLOCK "")
foreach(_COMPONENT ${OTEL_BUILT_COMPONENTS_LIST})
get_property(_COMPONENT_DEPENDS DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_DEPENDS_${_COMPONENT})
get_property(_COMPONENT_TARGETS DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_TARGETS_${_COMPONENT})
get_property(_COMPONENT_TARGETS_ALIAS DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_TARGETS_ALIAS_${_COMPONENT})
get_property(_COMPONENT_THIRDPARTY_DEPENDS DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_THIRDPARTY_DEPENDS_${_COMPONENT})
get_property(_COMPONENT_FILES_DIRECTORY DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_FILES_DIRECTORY_${_COMPONENT})
get_property(_COMPONENT_FILES_DESTINATION DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_FILES_DESTINATION_${_COMPONENT})
get_property(_COMPONENT_FILES_MATCHING DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY OTEL_COMPONENT_FILES_MATCHING_${_COMPONENT})
message(STATUS "Install COMPONENT ${_COMPONENT}")
message(STATUS " TARGETS: ${_COMPONENT_TARGETS}")
message(STATUS " TARGETS_ALIAS: ${_COMPONENT_TARGETS_ALIAS}")
message(STATUS " COMPONENT_DEPENDS: ${_COMPONENT_DEPENDS}")
message(STATUS " THIRDPARTY_DEPENDS: ${_COMPONENT_THIRDPARTY_DEPENDS}")
message(STATUS " FILES_DIRECTORY: ${_COMPONENT_FILES_DIRECTORY}")
message(STATUS " FILES_DESTINATION: ${_COMPONENT_FILES_DESTINATION}")
message(STATUS " FILES_MATCHING: ${_COMPONENT_FILES_MATCHING}")
_otel_install_component(${_COMPONENT})
_otel_populate_component_targets_block(${_COMPONENT} OTEL_COMPONENTS_TARGETS_BLOCK)
_otel_populate_component_internal_depends_block(${_COMPONENT} OTEL_COMPONENTS_INTERNAL_DEPENDENCIES_BLOCK)
_otel_populate_component_thirdparty_depends_block(${_COMPONENT} OTEL_COMPONENTS_THIRDPARTY_DEPENDENCIES_BLOCK)
endforeach()
configure_file(
"${PROJECT_SOURCE_DIR}/cmake/templates/component-definitions.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/cmake/component-definitions.cmake"
@ONLY
)
install(
FILES
"${CMAKE_CURRENT_BINARY_DIR}/cmake/component-definitions.cmake"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
COMPONENT cmake-config)
endfunction()
#-----------------------------------------------------------------------
# otel_install_thirdparty_definitions:
# Installs the thirdparty dependency definitions file that contains the list
# of thirdparty dependencies their versions and cmake search modes.
# - sets `OTEL_THIRDPARTY_DEPENDENCIES_SUPPORTED` to the list of dependencies
# - sets `OTEL_<dependency>_VERSION` to the version used to build opentelemetry-cpp
# - sets `OTEL_<dependency>_SEARCH_MODE` to the search mode required to find the dependency
# Usage:
# otel_install_thirdparty_definitions()
#-----------------------------------------------------------------------
function(otel_install_thirdparty_definitions)
set(OTEL_THIRDPARTY_DEPENDENCY_VERSIONS_BLOCK "")
set(OTEL_THIRDPARTY_DEPENDENCY_SEARCH_MODES_BLOCK "")
# Populate OTEL_THIRDPARTY_DEPENDENCY_VERSIONS_BLOCK
foreach(_DEPENDENCY ${OTEL_THIRDPARTY_DEPENDENCIES_SUPPORTED})
string(APPEND OTEL_THIRDPARTY_DEPENDENCY_VERSIONS_BLOCK
"set(OTEL_${_DEPENDENCY}_VERSION \"${${_DEPENDENCY}_VERSION}\")\n"
)
endforeach()
# Populate OTEL_THIRDPARTY_DEPENDENCY_SEARCH_MODES_BLOCK
foreach(_DEPENDENCY ${OTEL_THIRDPARTY_DEPENDENCIES_SUPPORTED})
string(APPEND OTEL_THIRDPARTY_DEPENDENCY_SEARCH_MODES_BLOCK
"set(OTEL_${_DEPENDENCY}_SEARCH_MODE \"${OTEL_${_DEPENDENCY}_SEARCH_MODE}\")\n"
)
endforeach()
configure_file(
"${PROJECT_SOURCE_DIR}/cmake/templates/thirdparty-dependency-definitions.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/cmake/thirdparty-dependency-definitions.cmake"
@ONLY)
install(
FILES
"${CMAKE_CURRENT_BINARY_DIR}/cmake/thirdparty-dependency-definitions.cmake"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
COMPONENT cmake-config)
endfunction()
#-----------------------------------------------------------------------
# otel_install_cmake_config:
# Configures and installs the cmake.config package file and version file
# to support find_package(opentelemetry-cpp CONFIG COMPONENTS ...)
# Usage:
# otel_install_cmake_config()
#-----------------------------------------------------------------------
function(otel_install_cmake_config)
# Write config file for find_package(opentelemetry-cpp CONFIG)
set(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}")
configure_package_config_file(
"${PROJECT_SOURCE_DIR}/cmake/templates/opentelemetry-cpp-config.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}/${PROJECT_NAME}-config.cmake"
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
PATH_VARS INCLUDE_INSTALL_DIR CMAKE_INSTALL_LIBDIR)
# Write version file for find_package(opentelemetry-cpp CONFIG)
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}/${PROJECT_NAME}-config-version.cmake"
COMPATIBILITY ExactVersion)
install(
FILES
"${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}/${PROJECT_NAME}-config.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}/${PROJECT_NAME}-config-version.cmake"
"${CMAKE_CURRENT_LIST_DIR}/cmake/find-package-support-functions.cmake"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
COMPONENT cmake-config)
endfunction()
|