kou commented on a change in pull request #10260:
URL: https://github.com/apache/arrow/pull/10260#discussion_r753517666
##########
File path: cpp/cmake_modules/ThirdpartyToolchain.cmake
##########
@@ -3865,6 +3902,212 @@ if(ARROW_ORC)
message(STATUS "Found ORC headers: ${ORC_INCLUDE_DIR}")
endif()
+# ----------------------------------------------------------------------
+# OpenTelemetry C++
+
+macro(build_opentelemetry)
+ message("Building OpenTelemetry from source")
+ set(OPENTELEMETRY_PREFIX
"${CMAKE_CURRENT_BINARY_DIR}/opentelemetry_ep-install")
+ set(OPENTELEMETRY_INCLUDE_DIR "${OPENTELEMETRY_PREFIX}/include")
+ set(OPENTELEMETRY_STATIC_LIB
+
"${OPENTELEMETRY_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}opentelemetry${CMAKE_STATIC_LIBRARY_SUFFIX}"
+ )
+ set(_OPENTELEMETRY_APIS api ext sdk)
+ set(_OPENTELEMETRY_LIBS
+ common
+ http_client_curl
+ ostream_span_exporter
+ otlp_http_exporter
+ otlp_recordable
+ proto
+ resources
+ trace
+ version)
+ set(OPENTELEMETRY_BUILD_BYPRODUCTS)
+ set(OPENTELEMETRY_LIBRARIES)
+
+ foreach(_OPENTELEMETRY_LIB ${_OPENTELEMETRY_APIS})
+ add_library(opentelemetry-cpp::${_OPENTELEMETRY_LIB} INTERFACE IMPORTED)
+ set_target_properties(opentelemetry-cpp::${_OPENTELEMETRY_LIB}
+ PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
+ "${OPENTELEMETRY_INCLUDE_DIR}")
+ endforeach()
+ foreach(_OPENTELEMETRY_LIB ${_OPENTELEMETRY_LIBS})
+ if(_OPENTELEMETRY_LIB STREQUAL "http_client_curl")
+ set(_OPENTELEMETRY_STATIC_LIBRARY
+
"${OPENTELEMETRY_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}${_OPENTELEMETRY_LIB}${CMAKE_STATIC_LIBRARY_SUFFIX}"
+ )
+ elseif(_OPENTELEMETRY_LIB STREQUAL "ostream_span_exporter")
+ set(_OPENTELEMETRY_STATIC_LIBRARY
+
"${OPENTELEMETRY_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}opentelemetry_exporter_ostream_span${CMAKE_STATIC_LIBRARY_SUFFIX}"
+ )
+ elseif(_OPENTELEMETRY_LIB STREQUAL "otlp_http_exporter")
+ set(_OPENTELEMETRY_STATIC_LIBRARY
+
"${OPENTELEMETRY_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}opentelemetry_exporter_otlp_http${CMAKE_STATIC_LIBRARY_SUFFIX}"
+ )
+ else()
+ set(_OPENTELEMETRY_STATIC_LIBRARY
+
"${OPENTELEMETRY_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}opentelemetry_${_OPENTELEMETRY_LIB}${CMAKE_STATIC_LIBRARY_SUFFIX}"
+ )
+ endif()
+ add_library(opentelemetry-cpp::${_OPENTELEMETRY_LIB} STATIC IMPORTED)
+ set_target_properties(opentelemetry-cpp::${_OPENTELEMETRY_LIB}
+ PROPERTIES IMPORTED_LOCATION
${_OPENTELEMETRY_STATIC_LIBRARY})
+ list(APPEND OPENTELEMETRY_BUILD_BYPRODUCTS
${_OPENTELEMETRY_STATIC_LIBRARY})
+ list(APPEND OPENTELEMETRY_LIBRARIES
opentelemetry-cpp::${_OPENTELEMETRY_LIB})
+ endforeach()
+
+ set(OPENTELEMETRY_CMAKE_ARGS
+ ${EP_COMMON_TOOLCHAIN}
+ "-DCMAKE_INSTALL_PREFIX=${OPENTELEMETRY_PREFIX}"
+ "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
+ -DCMAKE_INSTALL_LIBDIR=lib
+ "-DCMAKE_CXX_FLAGS=${EP_CXX_FLAGS}"
+ -DBUILD_TESTING=OFF
+ -DWITH_EXAMPLES=OFF)
+
+ set(OPENTELEMETRY_PREFIX_PATH_LIST)
+ # Don't specify the DEPENDS unless we actually have dependencies, else
+ # Ninja/other build systems may consider this target to always be dirty
+ set(_OPENTELEMETRY_DEPENDENCIES)
+ add_custom_target(opentelemetry_dependencies)
+
+ if(ARROW_WITH_OPENTELEMETRY)
+ set(_OPENTELEMETRY_DEPENDENCIES "opentelemetry_dependencies")
+ list(APPEND ARROW_BUNDLED_STATIC_LIBS ${OPENTELEMETRY_LIBRARIES})
+ list(APPEND OPENTELEMETRY_PREFIX_PATH_LIST ${NLOHMANN_JSON_PREFIX})
+ set(OPENTELEMETRY_CMAKE_ARGS ${OPENTELEMETRY_CMAKE_ARGS} -DWITH_OTLP=ON
+ -DWITH_OTLP_HTTP=ON -DWITH_OTLP_GRPC=OFF)
+
+ # OpenTelemetry with OTLP enabled requires Protobuf definitions from a
+ # submodule. This submodule path is hardcoded into their CMake definitions,
+ # and submodules are not included in their releases. Add a custom build
step
+ # to download and extract the Protobufs.
+
+ # Adding such a step is rather complicated, so instead: create a separate
+ # ExternalProject that just fetches the Protobufs, then add a custom step
+ # to the main build to copy the Protobufs.
+ externalproject_add(opentelemetry_proto_ep
+ ${EP_LOG_OPTIONS}
+ URL_HASH
"SHA256=${ARROW_OPENTELEMETRY_PROTO_BUILD_SHA256_CHECKSUM}"
+ URL ${OPENTELEMETRY_PROTO_SOURCE_URL}
+ BUILD_COMMAND ""
+ CONFIGURE_COMMAND ""
+ INSTALL_COMMAND ""
+ EXCLUDE_FROM_ALL OFF)
+
+ add_dependencies(opentelemetry_dependencies nlohmann_json_ep
opentelemetry_proto_ep)
+ if(gRPC_SOURCE STREQUAL "BUNDLED")
+ # TODO: opentelemetry-cpp::proto doesn't declare a dependency on gRPC, so
+ # even if we provide the location of gRPC, it'll fail to compile.
+ message(FATAL_ERROR "ARROW_WITH_OPENTELEMETRY cannot be configured with
gRPC_SOURCE=BUNDLED. "
+ "See
https://github.com/open-telemetry/opentelemetry-cpp/issues/1045"
+ )
+ endif()
+ else()
+ set(OPENTELEMETRY_CMAKE_ARGS ${OPENTELEMETRY_CMAKE_ARGS}
-DWITH_API_ONLY=ON)
Review comment:
Could you use `list(APPEND ...)`?
##########
File path: cpp/cmake_modules/ThirdpartyToolchain.cmake
##########
@@ -3865,6 +3902,212 @@ if(ARROW_ORC)
message(STATUS "Found ORC headers: ${ORC_INCLUDE_DIR}")
endif()
+# ----------------------------------------------------------------------
+# OpenTelemetry C++
+
+macro(build_opentelemetry)
+ message("Building OpenTelemetry from source")
+ set(OPENTELEMETRY_PREFIX
"${CMAKE_CURRENT_BINARY_DIR}/opentelemetry_ep-install")
+ set(OPENTELEMETRY_INCLUDE_DIR "${OPENTELEMETRY_PREFIX}/include")
+ set(OPENTELEMETRY_STATIC_LIB
+
"${OPENTELEMETRY_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}opentelemetry${CMAKE_STATIC_LIBRARY_SUFFIX}"
+ )
+ set(_OPENTELEMETRY_APIS api ext sdk)
+ set(_OPENTELEMETRY_LIBS
+ common
+ http_client_curl
+ ostream_span_exporter
+ otlp_http_exporter
+ otlp_recordable
+ proto
+ resources
+ trace
+ version)
+ set(OPENTELEMETRY_BUILD_BYPRODUCTS)
+ set(OPENTELEMETRY_LIBRARIES)
+
+ foreach(_OPENTELEMETRY_LIB ${_OPENTELEMETRY_APIS})
+ add_library(opentelemetry-cpp::${_OPENTELEMETRY_LIB} INTERFACE IMPORTED)
+ set_target_properties(opentelemetry-cpp::${_OPENTELEMETRY_LIB}
+ PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
+ "${OPENTELEMETRY_INCLUDE_DIR}")
+ endforeach()
+ foreach(_OPENTELEMETRY_LIB ${_OPENTELEMETRY_LIBS})
+ if(_OPENTELEMETRY_LIB STREQUAL "http_client_curl")
+ set(_OPENTELEMETRY_STATIC_LIBRARY
+
"${OPENTELEMETRY_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}${_OPENTELEMETRY_LIB}${CMAKE_STATIC_LIBRARY_SUFFIX}"
+ )
+ elseif(_OPENTELEMETRY_LIB STREQUAL "ostream_span_exporter")
+ set(_OPENTELEMETRY_STATIC_LIBRARY
+
"${OPENTELEMETRY_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}opentelemetry_exporter_ostream_span${CMAKE_STATIC_LIBRARY_SUFFIX}"
+ )
+ elseif(_OPENTELEMETRY_LIB STREQUAL "otlp_http_exporter")
+ set(_OPENTELEMETRY_STATIC_LIBRARY
+
"${OPENTELEMETRY_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}opentelemetry_exporter_otlp_http${CMAKE_STATIC_LIBRARY_SUFFIX}"
+ )
+ else()
+ set(_OPENTELEMETRY_STATIC_LIBRARY
+
"${OPENTELEMETRY_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}opentelemetry_${_OPENTELEMETRY_LIB}${CMAKE_STATIC_LIBRARY_SUFFIX}"
+ )
+ endif()
+ add_library(opentelemetry-cpp::${_OPENTELEMETRY_LIB} STATIC IMPORTED)
+ set_target_properties(opentelemetry-cpp::${_OPENTELEMETRY_LIB}
+ PROPERTIES IMPORTED_LOCATION
${_OPENTELEMETRY_STATIC_LIBRARY})
+ list(APPEND OPENTELEMETRY_BUILD_BYPRODUCTS
${_OPENTELEMETRY_STATIC_LIBRARY})
+ list(APPEND OPENTELEMETRY_LIBRARIES
opentelemetry-cpp::${_OPENTELEMETRY_LIB})
+ endforeach()
+
+ set(OPENTELEMETRY_CMAKE_ARGS
+ ${EP_COMMON_TOOLCHAIN}
+ "-DCMAKE_INSTALL_PREFIX=${OPENTELEMETRY_PREFIX}"
+ "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
+ -DCMAKE_INSTALL_LIBDIR=lib
+ "-DCMAKE_CXX_FLAGS=${EP_CXX_FLAGS}"
+ -DBUILD_TESTING=OFF
+ -DWITH_EXAMPLES=OFF)
+
+ set(OPENTELEMETRY_PREFIX_PATH_LIST)
+ # Don't specify the DEPENDS unless we actually have dependencies, else
+ # Ninja/other build systems may consider this target to always be dirty
+ set(_OPENTELEMETRY_DEPENDENCIES)
+ add_custom_target(opentelemetry_dependencies)
+
+ if(ARROW_WITH_OPENTELEMETRY)
+ set(_OPENTELEMETRY_DEPENDENCIES "opentelemetry_dependencies")
+ list(APPEND ARROW_BUNDLED_STATIC_LIBS ${OPENTELEMETRY_LIBRARIES})
+ list(APPEND OPENTELEMETRY_PREFIX_PATH_LIST ${NLOHMANN_JSON_PREFIX})
+ set(OPENTELEMETRY_CMAKE_ARGS ${OPENTELEMETRY_CMAKE_ARGS} -DWITH_OTLP=ON
+ -DWITH_OTLP_HTTP=ON -DWITH_OTLP_GRPC=OFF)
+
+ # OpenTelemetry with OTLP enabled requires Protobuf definitions from a
+ # submodule. This submodule path is hardcoded into their CMake definitions,
+ # and submodules are not included in their releases. Add a custom build
step
+ # to download and extract the Protobufs.
+
+ # Adding such a step is rather complicated, so instead: create a separate
+ # ExternalProject that just fetches the Protobufs, then add a custom step
+ # to the main build to copy the Protobufs.
+ externalproject_add(opentelemetry_proto_ep
+ ${EP_LOG_OPTIONS}
+ URL_HASH
"SHA256=${ARROW_OPENTELEMETRY_PROTO_BUILD_SHA256_CHECKSUM}"
+ URL ${OPENTELEMETRY_PROTO_SOURCE_URL}
+ BUILD_COMMAND ""
+ CONFIGURE_COMMAND ""
+ INSTALL_COMMAND ""
+ EXCLUDE_FROM_ALL OFF)
+
+ add_dependencies(opentelemetry_dependencies nlohmann_json_ep
opentelemetry_proto_ep)
+ if(gRPC_SOURCE STREQUAL "BUNDLED")
+ # TODO: opentelemetry-cpp::proto doesn't declare a dependency on gRPC, so
+ # even if we provide the location of gRPC, it'll fail to compile.
+ message(FATAL_ERROR "ARROW_WITH_OPENTELEMETRY cannot be configured with
gRPC_SOURCE=BUNDLED. "
+ "See
https://github.com/open-telemetry/opentelemetry-cpp/issues/1045"
+ )
+ endif()
+ else()
+ set(OPENTELEMETRY_CMAKE_ARGS ${OPENTELEMETRY_CMAKE_ARGS}
-DWITH_API_ONLY=ON)
+ if(WIN32)
+ # WITH_ETW does not respect WITH_API_ONLY
+ set(OPENTELEMETRY_CMAKE_ARGS ${OPENTELEMETRY_CMAKE_ARGS} -DWITH_ETW=OFF)
+ endif()
+ endif()
+
+ set(OPENTELEMETRY_PREFIX_PATH_LIST_SEP_CHAR "|")
+ # JOIN is CMake >=3.12 only
+ string(REPLACE ";" "${OPENTELEMETRY_PREFIX_PATH_LIST_SEP_CHAR}"
+ OPENTELEMETRY_PREFIX_PATH "${OPENTELEMETRY_PREFIX_PATH_LIST}")
+ set(OPENTELEMETRY_CMAKE_ARGS ${OPENTELEMETRY_CMAKE_ARGS}
+
"-DCMAKE_PREFIX_PATH=${OPENTELEMETRY_PREFIX_PATH}")
+
+ if(CMAKE_SYSTEM_PROCESSOR STREQUAL "s390x")
+ # OpenTelemetry tries to determine the processor arch for vcpkg, which
fails
+ # on s390x, even though it doesn't use vcpkg there. Tell it ARCH manually
+ externalproject_add(opentelemetry_ep
+ ${EP_LOG_OPTIONS}
+ URL_HASH
"SHA256=${ARROW_OPENTELEMETRY_BUILD_SHA256_CHECKSUM}"
+ LIST_SEPARATOR
${OPENTELEMETRY_PREFIX_PATH_LIST_SEP_CHAR}
+ CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env ARCH=s390x
+ ${CMAKE_COMMAND} -G
${CMAKE_GENERATOR}
+ "<SOURCE_DIR><SOURCE_SUBDIR>"
+ ${OPENTELEMETRY_CMAKE_ARGS}
+ BUILD_COMMAND ${CMAKE_COMMAND} --build "<BINARY_DIR>"
--target all
+ INSTALL_COMMAND ${CMAKE_COMMAND} --build
"<BINARY_DIR>" --target
+ install
+ URL ${OPENTELEMETRY_SOURCE_URL}
+ BUILD_BYPRODUCTS ${OPENTELEMETRY_BUILD_BYPRODUCTS}
+ EXCLUDE_FROM_ALL NOT
+ ${ARROW_WITH_OPENTELEMETRY}
+ DEPENDS ${_OPENTELEMETRY_DEPENDENCIES})
+ else()
+ externalproject_add(opentelemetry_ep
+ ${EP_LOG_OPTIONS}
+ URL_HASH
"SHA256=${ARROW_OPENTELEMETRY_BUILD_SHA256_CHECKSUM}"
+ LIST_SEPARATOR
${OPENTELEMETRY_PREFIX_PATH_LIST_SEP_CHAR}
+ CMAKE_ARGS ${OPENTELEMETRY_CMAKE_ARGS}
+ URL ${OPENTELEMETRY_SOURCE_URL}
+ BUILD_BYPRODUCTS ${OPENTELEMETRY_BUILD_BYPRODUCTS}
+ EXCLUDE_FROM_ALL NOT
+ ${ARROW_WITH_OPENTELEMETRY}
+ DEPENDS ${_OPENTELEMETRY_DEPENDENCIES})
+ endif()
+
+ if(ARROW_WITH_OPENTELEMETRY)
+ externalproject_add_step(opentelemetry_ep download_proto
+ COMMAND ${CMAKE_COMMAND} -E copy_directory
+
$<TARGET_PROPERTY:opentelemetry_proto_ep,_EP_SOURCE_DIR>/opentelemetry
+
$<TARGET_PROPERTY:opentelemetry_ep,_EP_SOURCE_DIR>/third_party/opentelemetry-proto/opentelemetry
+ DEPENDEES download
+ DEPENDERS configure)
+ endif()
+
+ add_dependencies(toolchain opentelemetry_ep)
+ add_dependencies(toolchain-tests opentelemetry_ep)
+
+ set(OPENTELEMETRY_VENDORED 1)
+
+ set_target_properties(opentelemetry-cpp::common
+ PROPERTIES INTERFACE_LINK_LIBRARIES
+
"opentelemetry-cpp::api;opentelemetry-cpp::sdk;Threads::Threads"
+ )
+ set_target_properties(opentelemetry-cpp::resources
+ PROPERTIES INTERFACE_LINK_LIBRARIES
"opentelemetry-cpp::common")
+ set_target_properties(opentelemetry-cpp::trace
+ PROPERTIES INTERFACE_LINK_LIBRARIES
+
"opentelemetry-cpp::common;opentelemetry-cpp::resources"
+ )
+ set_target_properties(opentelemetry-cpp::http_client_curl
+ PROPERTIES INTERFACE_LINK_LIBRARIES
+ "opentelemetry-cpp::ext;CURL::libcurl")
+ set_target_properties(opentelemetry-cpp::proto
+ PROPERTIES INTERFACE_LINK_LIBRARIES
+ "${ARROW_PROTOBUF_LIBPROTOBUF}")
+ set_target_properties(opentelemetry-cpp::otlp_recordable
+ PROPERTIES INTERFACE_LINK_LIBRARIES
+
"opentelemetry-cpp::trace;opentelemetry-cpp::resources;opentelemetry-cpp::proto"
+ )
+ set_target_properties(opentelemetry-cpp::otlp_http_exporter
+ PROPERTIES INTERFACE_LINK_LIBRARIES
+
"opentelemetry-cpp::otlp_recordable;opentelemetry-cpp::http_client_curl;nlohmann_json::nlohmann_json"
+ )
+
+ foreach(_OPENTELEMETRY_LIB ${_OPENTELEMETRY_LIBS})
+ add_dependencies(opentelemetry-cpp::${_OPENTELEMETRY_LIB} opentelemetry_ep)
+ endforeach()
+endmacro()
+
+if(ARROW_WITH_OPENTELEMETRY)
+ set(opentelemetry-cpp_SOURCE "AUTO")
+ if(ARROW_WITH_OPENTELEMETRY)
Review comment:
This is redundant.
##########
File path: cpp/cmake_modules/ThirdpartyToolchain.cmake
##########
@@ -3865,6 +3902,212 @@ if(ARROW_ORC)
message(STATUS "Found ORC headers: ${ORC_INCLUDE_DIR}")
endif()
+# ----------------------------------------------------------------------
+# OpenTelemetry C++
+
+macro(build_opentelemetry)
+ message("Building OpenTelemetry from source")
+ set(OPENTELEMETRY_PREFIX
"${CMAKE_CURRENT_BINARY_DIR}/opentelemetry_ep-install")
+ set(OPENTELEMETRY_INCLUDE_DIR "${OPENTELEMETRY_PREFIX}/include")
+ set(OPENTELEMETRY_STATIC_LIB
+
"${OPENTELEMETRY_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}opentelemetry${CMAKE_STATIC_LIBRARY_SUFFIX}"
+ )
+ set(_OPENTELEMETRY_APIS api ext sdk)
+ set(_OPENTELEMETRY_LIBS
+ common
+ http_client_curl
+ ostream_span_exporter
+ otlp_http_exporter
+ otlp_recordable
+ proto
+ resources
+ trace
+ version)
+ set(OPENTELEMETRY_BUILD_BYPRODUCTS)
+ set(OPENTELEMETRY_LIBRARIES)
+
+ foreach(_OPENTELEMETRY_LIB ${_OPENTELEMETRY_APIS})
+ add_library(opentelemetry-cpp::${_OPENTELEMETRY_LIB} INTERFACE IMPORTED)
+ set_target_properties(opentelemetry-cpp::${_OPENTELEMETRY_LIB}
+ PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
+ "${OPENTELEMETRY_INCLUDE_DIR}")
+ endforeach()
+ foreach(_OPENTELEMETRY_LIB ${_OPENTELEMETRY_LIBS})
+ if(_OPENTELEMETRY_LIB STREQUAL "http_client_curl")
+ set(_OPENTELEMETRY_STATIC_LIBRARY
+
"${OPENTELEMETRY_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}${_OPENTELEMETRY_LIB}${CMAKE_STATIC_LIBRARY_SUFFIX}"
+ )
+ elseif(_OPENTELEMETRY_LIB STREQUAL "ostream_span_exporter")
+ set(_OPENTELEMETRY_STATIC_LIBRARY
+
"${OPENTELEMETRY_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}opentelemetry_exporter_ostream_span${CMAKE_STATIC_LIBRARY_SUFFIX}"
+ )
+ elseif(_OPENTELEMETRY_LIB STREQUAL "otlp_http_exporter")
+ set(_OPENTELEMETRY_STATIC_LIBRARY
+
"${OPENTELEMETRY_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}opentelemetry_exporter_otlp_http${CMAKE_STATIC_LIBRARY_SUFFIX}"
+ )
+ else()
+ set(_OPENTELEMETRY_STATIC_LIBRARY
+
"${OPENTELEMETRY_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}opentelemetry_${_OPENTELEMETRY_LIB}${CMAKE_STATIC_LIBRARY_SUFFIX}"
+ )
+ endif()
+ add_library(opentelemetry-cpp::${_OPENTELEMETRY_LIB} STATIC IMPORTED)
+ set_target_properties(opentelemetry-cpp::${_OPENTELEMETRY_LIB}
+ PROPERTIES IMPORTED_LOCATION
${_OPENTELEMETRY_STATIC_LIBRARY})
+ list(APPEND OPENTELEMETRY_BUILD_BYPRODUCTS
${_OPENTELEMETRY_STATIC_LIBRARY})
+ list(APPEND OPENTELEMETRY_LIBRARIES
opentelemetry-cpp::${_OPENTELEMETRY_LIB})
+ endforeach()
+
+ set(OPENTELEMETRY_CMAKE_ARGS
+ ${EP_COMMON_TOOLCHAIN}
+ "-DCMAKE_INSTALL_PREFIX=${OPENTELEMETRY_PREFIX}"
+ "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
+ -DCMAKE_INSTALL_LIBDIR=lib
+ "-DCMAKE_CXX_FLAGS=${EP_CXX_FLAGS}"
+ -DBUILD_TESTING=OFF
+ -DWITH_EXAMPLES=OFF)
+
+ set(OPENTELEMETRY_PREFIX_PATH_LIST)
+ # Don't specify the DEPENDS unless we actually have dependencies, else
+ # Ninja/other build systems may consider this target to always be dirty
+ set(_OPENTELEMETRY_DEPENDENCIES)
+ add_custom_target(opentelemetry_dependencies)
+
+ if(ARROW_WITH_OPENTELEMETRY)
+ set(_OPENTELEMETRY_DEPENDENCIES "opentelemetry_dependencies")
+ list(APPEND ARROW_BUNDLED_STATIC_LIBS ${OPENTELEMETRY_LIBRARIES})
+ list(APPEND OPENTELEMETRY_PREFIX_PATH_LIST ${NLOHMANN_JSON_PREFIX})
+ set(OPENTELEMETRY_CMAKE_ARGS ${OPENTELEMETRY_CMAKE_ARGS} -DWITH_OTLP=ON
+ -DWITH_OTLP_HTTP=ON -DWITH_OTLP_GRPC=OFF)
+
+ # OpenTelemetry with OTLP enabled requires Protobuf definitions from a
+ # submodule. This submodule path is hardcoded into their CMake definitions,
+ # and submodules are not included in their releases. Add a custom build
step
+ # to download and extract the Protobufs.
+
+ # Adding such a step is rather complicated, so instead: create a separate
+ # ExternalProject that just fetches the Protobufs, then add a custom step
+ # to the main build to copy the Protobufs.
+ externalproject_add(opentelemetry_proto_ep
+ ${EP_LOG_OPTIONS}
+ URL_HASH
"SHA256=${ARROW_OPENTELEMETRY_PROTO_BUILD_SHA256_CHECKSUM}"
+ URL ${OPENTELEMETRY_PROTO_SOURCE_URL}
+ BUILD_COMMAND ""
+ CONFIGURE_COMMAND ""
+ INSTALL_COMMAND ""
+ EXCLUDE_FROM_ALL OFF)
+
+ add_dependencies(opentelemetry_dependencies nlohmann_json_ep
opentelemetry_proto_ep)
+ if(gRPC_SOURCE STREQUAL "BUNDLED")
+ # TODO: opentelemetry-cpp::proto doesn't declare a dependency on gRPC, so
+ # even if we provide the location of gRPC, it'll fail to compile.
+ message(FATAL_ERROR "ARROW_WITH_OPENTELEMETRY cannot be configured with
gRPC_SOURCE=BUNDLED. "
+ "See
https://github.com/open-telemetry/opentelemetry-cpp/issues/1045"
+ )
+ endif()
+ else()
+ set(OPENTELEMETRY_CMAKE_ARGS ${OPENTELEMETRY_CMAKE_ARGS}
-DWITH_API_ONLY=ON)
+ if(WIN32)
+ # WITH_ETW does not respect WITH_API_ONLY
+ set(OPENTELEMETRY_CMAKE_ARGS ${OPENTELEMETRY_CMAKE_ARGS} -DWITH_ETW=OFF)
+ endif()
+ endif()
+
+ set(OPENTELEMETRY_PREFIX_PATH_LIST_SEP_CHAR "|")
+ # JOIN is CMake >=3.12 only
+ string(REPLACE ";" "${OPENTELEMETRY_PREFIX_PATH_LIST_SEP_CHAR}"
+ OPENTELEMETRY_PREFIX_PATH "${OPENTELEMETRY_PREFIX_PATH_LIST}")
+ set(OPENTELEMETRY_CMAKE_ARGS ${OPENTELEMETRY_CMAKE_ARGS}
+
"-DCMAKE_PREFIX_PATH=${OPENTELEMETRY_PREFIX_PATH}")
+
+ if(CMAKE_SYSTEM_PROCESSOR STREQUAL "s390x")
+ # OpenTelemetry tries to determine the processor arch for vcpkg, which
fails
+ # on s390x, even though it doesn't use vcpkg there. Tell it ARCH manually
+ externalproject_add(opentelemetry_ep
+ ${EP_LOG_OPTIONS}
+ URL_HASH
"SHA256=${ARROW_OPENTELEMETRY_BUILD_SHA256_CHECKSUM}"
+ LIST_SEPARATOR
${OPENTELEMETRY_PREFIX_PATH_LIST_SEP_CHAR}
+ CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env ARCH=s390x
+ ${CMAKE_COMMAND} -G
${CMAKE_GENERATOR}
+ "<SOURCE_DIR><SOURCE_SUBDIR>"
+ ${OPENTELEMETRY_CMAKE_ARGS}
+ BUILD_COMMAND ${CMAKE_COMMAND} --build "<BINARY_DIR>"
--target all
+ INSTALL_COMMAND ${CMAKE_COMMAND} --build
"<BINARY_DIR>" --target
+ install
+ URL ${OPENTELEMETRY_SOURCE_URL}
+ BUILD_BYPRODUCTS ${OPENTELEMETRY_BUILD_BYPRODUCTS}
+ EXCLUDE_FROM_ALL NOT
+ ${ARROW_WITH_OPENTELEMETRY}
+ DEPENDS ${_OPENTELEMETRY_DEPENDENCIES})
+ else()
+ externalproject_add(opentelemetry_ep
+ ${EP_LOG_OPTIONS}
+ URL_HASH
"SHA256=${ARROW_OPENTELEMETRY_BUILD_SHA256_CHECKSUM}"
+ LIST_SEPARATOR
${OPENTELEMETRY_PREFIX_PATH_LIST_SEP_CHAR}
+ CMAKE_ARGS ${OPENTELEMETRY_CMAKE_ARGS}
+ URL ${OPENTELEMETRY_SOURCE_URL}
+ BUILD_BYPRODUCTS ${OPENTELEMETRY_BUILD_BYPRODUCTS}
+ EXCLUDE_FROM_ALL NOT
+ ${ARROW_WITH_OPENTELEMETRY}
+ DEPENDS ${_OPENTELEMETRY_DEPENDENCIES})
+ endif()
+
+ if(ARROW_WITH_OPENTELEMETRY)
+ externalproject_add_step(opentelemetry_ep download_proto
+ COMMAND ${CMAKE_COMMAND} -E copy_directory
+
$<TARGET_PROPERTY:opentelemetry_proto_ep,_EP_SOURCE_DIR>/opentelemetry
+
$<TARGET_PROPERTY:opentelemetry_ep,_EP_SOURCE_DIR>/third_party/opentelemetry-proto/opentelemetry
+ DEPENDEES download
+ DEPENDERS configure)
+ endif()
+
+ add_dependencies(toolchain opentelemetry_ep)
+ add_dependencies(toolchain-tests opentelemetry_ep)
+
+ set(OPENTELEMETRY_VENDORED 1)
+
+ set_target_properties(opentelemetry-cpp::common
+ PROPERTIES INTERFACE_LINK_LIBRARIES
+
"opentelemetry-cpp::api;opentelemetry-cpp::sdk;Threads::Threads"
+ )
+ set_target_properties(opentelemetry-cpp::resources
+ PROPERTIES INTERFACE_LINK_LIBRARIES
"opentelemetry-cpp::common")
+ set_target_properties(opentelemetry-cpp::trace
+ PROPERTIES INTERFACE_LINK_LIBRARIES
+
"opentelemetry-cpp::common;opentelemetry-cpp::resources"
+ )
+ set_target_properties(opentelemetry-cpp::http_client_curl
+ PROPERTIES INTERFACE_LINK_LIBRARIES
+ "opentelemetry-cpp::ext;CURL::libcurl")
+ set_target_properties(opentelemetry-cpp::proto
+ PROPERTIES INTERFACE_LINK_LIBRARIES
+ "${ARROW_PROTOBUF_LIBPROTOBUF}")
+ set_target_properties(opentelemetry-cpp::otlp_recordable
+ PROPERTIES INTERFACE_LINK_LIBRARIES
+
"opentelemetry-cpp::trace;opentelemetry-cpp::resources;opentelemetry-cpp::proto"
+ )
+ set_target_properties(opentelemetry-cpp::otlp_http_exporter
+ PROPERTIES INTERFACE_LINK_LIBRARIES
+
"opentelemetry-cpp::otlp_recordable;opentelemetry-cpp::http_client_curl;nlohmann_json::nlohmann_json"
+ )
+
+ foreach(_OPENTELEMETRY_LIB ${_OPENTELEMETRY_LIBS})
+ add_dependencies(opentelemetry-cpp::${_OPENTELEMETRY_LIB} opentelemetry_ep)
+ endforeach()
+endmacro()
+
+if(ARROW_WITH_OPENTELEMETRY)
+ set(opentelemetry-cpp_SOURCE "AUTO")
+ if(ARROW_WITH_OPENTELEMETRY)
+ build_nlohmann_json_once()
+ find_curl()
Review comment:
Why should we put them here?
It seems that `build_opentelemetry()` should have them.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]