This is an automated email from the ASF dual-hosted git repository.
kou pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git
The following commit(s) were added to refs/heads/main by this push:
new f8ae141782 GH-48178: [C++] Use FetchContent for bundled RE2 (#48179)
f8ae141782 is described below
commit f8ae1417826b6f72b0876e985d1060cd15597744
Author: Raúl Cumplido <[email protected]>
AuthorDate: Sat Nov 22 07:06:08 2025 +0100
GH-48178: [C++] Use FetchContent for bundled RE2 (#48179)
### Rationale for this change
As a follow up of requiring a minimum CMake version >= 3.25 we discussed
moving our dependencies from ExternalProject to FetchContent. This can simplify
our third party dependency management. Moving RE2 is the next step before
moving Protobuf and gRPC.
### What changes are included in this PR?
The general change is moving from `ExternalProject` to `FetchContent`.
It also add some required integration due to other dependencies, like gRPC,
using `ExternalProject`. We not only have to build but also install in order
for those other dependencies to find RE2. This causes some timing issues
between config, build, install that requires us to create a custom target to
depend on so the other dependencies find abseil.
### Are these changes tested?
Yes, the changes are tested locally and on CI.
### Are there any user-facing changes?
No
* GitHub Issue: #48178
Authored-by: Raúl Cumplido <[email protected]>
Signed-off-by: Sutou Kouhei <[email protected]>
---
cpp/cmake_modules/ThirdpartyToolchain.cmake | 96 +++++++++++++++++++----------
1 file changed, 65 insertions(+), 31 deletions(-)
diff --git a/cpp/cmake_modules/ThirdpartyToolchain.cmake
b/cpp/cmake_modules/ThirdpartyToolchain.cmake
index 835baec87b..fae39acd1b 100644
--- a/cpp/cmake_modules/ThirdpartyToolchain.cmake
+++ b/cpp/cmake_modules/ThirdpartyToolchain.cmake
@@ -2799,37 +2799,66 @@ 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)
+
+ # This custom target ensures re2 is built before we install
+ add_custom_target(re2_built DEPENDS re2::re2)
+
+ 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_built
+ 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" ||
+ ${CMAKE_COMMAND} -E true
+ COMMAND ${CMAKE_COMMAND} -E touch
"${RE2_PREFIX}/.re2_installed"
+ DEPENDS re2_install_disabled
+ COMMENT "Installing RE2 to ${RE2_PREFIX} for gRPC"
+ VERBATIM)
+
+ add_custom_target(re2_fc DEPENDS "${RE2_PREFIX}/.re2_installed")
+
+ set(ARROW_BUNDLED_STATIC_LIBS
+ ${ARROW_BUNDLED_STATIC_LIBS} re2::re2
+ PARENT_SCOPE)
+ list(POP_BACK CMAKE_MESSAGE_INDENT)
+endfunction()
if(ARROW_WITH_RE2)
resolve_dependency(re2
@@ -3234,7 +3263,7 @@ macro(build_grpc)
endif()
if(RE2_VENDORED)
- add_dependencies(grpc_dependencies re2_ep)
+ add_dependencies(grpc_dependencies re2_fc)
endif()
add_dependencies(grpc_dependencies ${ARROW_PROTOBUF_LIBPROTOBUF}
c-ares::cares
@@ -3255,8 +3284,13 @@ macro(build_grpc)
get_filename_component(GRPC_CARES_ROOT "${GRPC_CARES_INCLUDE_DIR}"
DIRECTORY)
endif()
- get_target_property(GRPC_RE2_INCLUDE_DIR re2::re2
INTERFACE_INCLUDE_DIRECTORIES)
- get_filename_component(GRPC_RE2_ROOT "${GRPC_RE2_INCLUDE_DIR}" DIRECTORY)
+ # For FetchContent RE2, use the install prefix directly
+ if(RE2_VENDORED)
+ set(GRPC_RE2_ROOT "${RE2_PREFIX}")
+ else()
+ get_target_property(GRPC_RE2_INCLUDE_DIR re2::re2
INTERFACE_INCLUDE_DIRECTORIES)
+ get_filename_component(GRPC_RE2_ROOT "${GRPC_RE2_INCLUDE_DIR}" DIRECTORY)
+ endif()
# Put Abseil, etc. first so that local directories are searched
# before (what are likely) system directories