kou commented on a change in pull request #10260:
URL: https://github.com/apache/arrow/pull/10260#discussion_r750707704



##########
File path: cpp/cmake_modules/ThirdpartyToolchain.cmake
##########
@@ -3865,6 +3905,221 @@ 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)
+
+  if(NOT ${CMAKE_VERSION} VERSION_LESS "3.15.0")
+    # Make sure all installed artifacts get cleaned up. Important for the RPM
+    # builds which fail if anything is left behind. Things in BUILD_BYPRODUCTS
+    # get cleaned automatically, but we can't list every header installed.
+    set_property(TARGET opentelemetry_ep
+                 APPEND
+                 PROPERTY ADDITIONAL_CLEAN_FILES "${OPENTELEMETRY_PREFIX}")
+  endif()

Review comment:
       I think that we don't need this.
   If we don't run any steps of `opentelemetry_ep` on `ninja install`, the RPM 
related problem can be solved. The `ninja install` in the RPM build is ran with 
`DESTDIR`. If the install step of `opentelemetry_ep` is ran with `ninja 
install`, OpenTelemetry related files are installed into `${DESTDIR}/....`. It 
causes the RPM related problem.




-- 
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: github-unsubscr...@arrow.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


Reply via email to