Copilot commented on code in PR #48179:
URL: https://github.com/apache/arrow/pull/48179#discussion_r2544822638


##########
cpp/cmake_modules/ThirdpartyToolchain.cmake:
##########
@@ -2799,37 +2799,64 @@ if(ARROW_WITH_ZSTD)
 endif()
 
 # ----------------------------------------------------------------------
-# RE2 (required for Gandiva)
+# RE2 (required for Gandiva and gRPC)
 
-macro(build_re2)
-  message(STATUS "Building RE2 from source")
-  set(RE2_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/re2_ep-install")
-  set(RE2_STATIC_LIB
-      
"${RE2_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}re2${CMAKE_STATIC_LIBRARY_SUFFIX}")
+function(build_re2)
+  list(APPEND CMAKE_MESSAGE_INDENT "RE2: ")
+  message(STATUS "Building RE2 from source using FetchContent")
+  set(RE2_VENDORED
+      TRUE
+      PARENT_SCOPE)
+  set(RE2_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/re2_fc-install")
+  set(RE2_PREFIX
+      "${RE2_PREFIX}"
+      PARENT_SCOPE)
 
-  set(RE2_CMAKE_ARGS ${EP_COMMON_CMAKE_ARGS} 
"-DCMAKE_INSTALL_PREFIX=${RE2_PREFIX}")
+  fetchcontent_declare(re2
+                       URL ${RE2_SOURCE_URL}
+                       URL_HASH "SHA256=${ARROW_RE2_BUILD_SHA256_CHECKSUM}")
+  prepare_fetchcontent()
 
-  externalproject_add(re2_ep
-                      ${EP_COMMON_OPTIONS}
-                      INSTALL_DIR ${RE2_PREFIX}
-                      URL ${RE2_SOURCE_URL}
-                      URL_HASH "SHA256=${ARROW_RE2_BUILD_SHA256_CHECKSUM}"
-                      CMAKE_ARGS ${RE2_CMAKE_ARGS}
-                      BUILD_BYPRODUCTS "${RE2_STATIC_LIB}")
-
-  file(MAKE_DIRECTORY "${RE2_PREFIX}/include")
-  add_library(re2::re2 STATIC IMPORTED)
-  set_target_properties(re2::re2 PROPERTIES IMPORTED_LOCATION 
"${RE2_STATIC_LIB}")
-  target_include_directories(re2::re2 BEFORE INTERFACE "${RE2_PREFIX}/include")
-
-  add_dependencies(re2::re2 re2_ep)
-  set(RE2_VENDORED TRUE)
-  # Set values so that FindRE2 finds this too
-  set(RE2_LIB ${RE2_STATIC_LIB})
-  set(RE2_INCLUDE_DIR "${RE2_PREFIX}/include")
-
-  list(APPEND ARROW_BUNDLED_STATIC_LIBS re2::re2)
-endmacro()
+  # Unity build causes some build errors
+  set(CMAKE_UNITY_BUILD OFF)
+  fetchcontent_makeavailable(re2)
+
+  # Install RE2 for gRPC to find via find_package()
+  # Save and disable RE2's install script
+  add_custom_command(OUTPUT "${re2_BINARY_DIR}/cmake_install.cmake.saved"
+                     COMMAND ${CMAKE_COMMAND} -E copy_if_different
+                             "${re2_BINARY_DIR}/cmake_install.cmake"
+                             "${re2_BINARY_DIR}/cmake_install.cmake.saved"
+                     COMMAND ${CMAKE_COMMAND} -E echo
+                             "# RE2 install disabled to prevent double 
installation with Arrow"
+                             > "${re2_BINARY_DIR}/cmake_install.cmake"
+                     DEPENDS re2::re2
+                     COMMENT "Disabling RE2 install to prevent double 
installation"
+                     VERBATIM)

Review Comment:
   The custom command lacks an intermediate target between `re2::re2` and the 
install disable logic. The c-ares and Abseil implementations use an 
intermediate `<dep>_built` target to ensure all libraries are built before 
manipulating install scripts. Consider adding a `re2_built` target that depends 
on `re2::re2` to improve clarity and ensure proper sequencing, similar to lines 
3008 and 3090-3156 in the codebase.



##########
cpp/cmake_modules/ThirdpartyToolchain.cmake:
##########
@@ -2799,37 +2799,64 @@ if(ARROW_WITH_ZSTD)
 endif()
 
 # ----------------------------------------------------------------------
-# RE2 (required for Gandiva)
+# RE2 (required for Gandiva and gRPC)
 
-macro(build_re2)
-  message(STATUS "Building RE2 from source")
-  set(RE2_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/re2_ep-install")
-  set(RE2_STATIC_LIB
-      
"${RE2_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}re2${CMAKE_STATIC_LIBRARY_SUFFIX}")
+function(build_re2)
+  list(APPEND CMAKE_MESSAGE_INDENT "RE2: ")
+  message(STATUS "Building RE2 from source using FetchContent")
+  set(RE2_VENDORED
+      TRUE
+      PARENT_SCOPE)
+  set(RE2_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/re2_fc-install")
+  set(RE2_PREFIX
+      "${RE2_PREFIX}"
+      PARENT_SCOPE)
 
-  set(RE2_CMAKE_ARGS ${EP_COMMON_CMAKE_ARGS} 
"-DCMAKE_INSTALL_PREFIX=${RE2_PREFIX}")
+  fetchcontent_declare(re2
+                       URL ${RE2_SOURCE_URL}
+                       URL_HASH "SHA256=${ARROW_RE2_BUILD_SHA256_CHECKSUM}")
+  prepare_fetchcontent()
 
-  externalproject_add(re2_ep
-                      ${EP_COMMON_OPTIONS}
-                      INSTALL_DIR ${RE2_PREFIX}
-                      URL ${RE2_SOURCE_URL}
-                      URL_HASH "SHA256=${ARROW_RE2_BUILD_SHA256_CHECKSUM}"
-                      CMAKE_ARGS ${RE2_CMAKE_ARGS}
-                      BUILD_BYPRODUCTS "${RE2_STATIC_LIB}")
-
-  file(MAKE_DIRECTORY "${RE2_PREFIX}/include")
-  add_library(re2::re2 STATIC IMPORTED)
-  set_target_properties(re2::re2 PROPERTIES IMPORTED_LOCATION 
"${RE2_STATIC_LIB}")
-  target_include_directories(re2::re2 BEFORE INTERFACE "${RE2_PREFIX}/include")
-
-  add_dependencies(re2::re2 re2_ep)
-  set(RE2_VENDORED TRUE)
-  # Set values so that FindRE2 finds this too
-  set(RE2_LIB ${RE2_STATIC_LIB})
-  set(RE2_INCLUDE_DIR "${RE2_PREFIX}/include")
-
-  list(APPEND ARROW_BUNDLED_STATIC_LIBS re2::re2)
-endmacro()
+  # Unity build causes some build errors
+  set(CMAKE_UNITY_BUILD OFF)
+  fetchcontent_makeavailable(re2)
+
+  # Install RE2 for gRPC to find via find_package()
+  # Save and disable RE2's install script
+  add_custom_command(OUTPUT "${re2_BINARY_DIR}/cmake_install.cmake.saved"
+                     COMMAND ${CMAKE_COMMAND} -E copy_if_different
+                             "${re2_BINARY_DIR}/cmake_install.cmake"
+                             "${re2_BINARY_DIR}/cmake_install.cmake.saved"
+                     COMMAND ${CMAKE_COMMAND} -E echo
+                             "# RE2 install disabled to prevent double 
installation with Arrow"
+                             > "${re2_BINARY_DIR}/cmake_install.cmake"
+                     DEPENDS re2::re2
+                     COMMENT "Disabling RE2 install to prevent double 
installation"
+                     VERBATIM)
+
+  add_custom_target(re2_install_disabled ALL
+                    DEPENDS "${re2_BINARY_DIR}/cmake_install.cmake.saved")
+
+  # Install RE2 to RE2_PREFIX for gRPC to find
+  add_custom_command(OUTPUT "${RE2_PREFIX}/.re2_installed"
+                     COMMAND ${CMAKE_COMMAND} -E copy_if_different
+                             "${re2_BINARY_DIR}/cmake_install.cmake.saved"
+                             "${re2_BINARY_DIR}/cmake_install.cmake.tmp"
+                     COMMAND ${CMAKE_COMMAND} 
-DCMAKE_INSTALL_PREFIX=${RE2_PREFIX}
+                             -DCMAKE_INSTALL_CONFIG_NAME=$<CONFIG> -P
+                             "${re2_BINARY_DIR}/cmake_install.cmake.tmp"
+                     COMMAND ${CMAKE_COMMAND} -E touch 
"${RE2_PREFIX}/.re2_installed"
+                     DEPENDS re2_install_disabled
+                     COMMENT "Installing RE2 to ${RE2_PREFIX} for gRPC"
+                     VERBATIM)

Review Comment:
   The install command lacks error handling that exists in the c-ares 
implementation (line 3032-3033). Consider adding `|| ${CMAKE_COMMAND} -E true` 
after the install command to handle cases where the install might fail 
gracefully, matching the pattern used for c-ares which also needs to be 
installed for gRPC.



-- 
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]

Reply via email to