@@ -2951,32 +2951,68 @@ if(ARROW_WITH_UTF8PROC)
29512951endif ()
29522952
29532953macro (build_cares)
2954- message (STATUS "Building c-ares from source" )
2954+ message (STATUS "Building c-ares from source using FetchContent" )
2955+ set (CARES_VENDORED TRUE )
29552956 set (CARES_PREFIX "${CMAKE_CURRENT_BINARY_DIR} /cares_ep-install" )
2956- set (CARES_INCLUDE_DIR "${CARES_PREFIX} /include" )
29572957
2958- # If you set -DCARES_SHARED=ON then the build system names the library
2959- # libcares_static.a
2960- set (CARES_STATIC_LIB
2961- "${CARES_PREFIX} /lib/${CMAKE_STATIC_LIBRARY_PREFIX} cares${CMAKE_STATIC_LIBRARY_SUFFIX} "
2962- )
2958+ # Configure c-ares options before FetchContent
2959+ set (CARES_SHARED OFF )
2960+ set (CARES_STATIC ON )
2961+ set (CARES_INSTALL ON )
2962+ set (CARES_BUILD_TOOLS OFF )
2963+ set (CARES_BUILD_TESTS OFF )
29632964
2964- set (CARES_CMAKE_ARGS "${EP_COMMON_CMAKE_ARGS} " "-DCMAKE_INSTALL_PREFIX=${CARES_PREFIX} "
2965- -DCARES_SHARED=OFF -DCARES_STATIC=ON )
2965+ fetchcontent_declare(cares
2966+ URL ${CARES_SOURCE_URL}
2967+ URL_HASH "SHA256=${ARROW_CARES_BUILD_SHA256_CHECKSUM} " )
29662968
2967- externalproject_add(cares_ep
2968- ${EP_COMMON_OPTIONS}
2969- URL ${CARES_SOURCE_URL}
2970- URL_HASH "SHA256=${ARROW_CARES_BUILD_SHA256_CHECKSUM} "
2971- CMAKE_ARGS ${CARES_CMAKE_ARGS}
2972- BUILD_BYPRODUCTS "${CARES_STATIC_LIB} " )
2969+ prepare_fetchcontent()
29732970
2974- file (MAKE_DIRECTORY ${CARES_INCLUDE_DIR} )
2971+ set (CMAKE_INSTALL_PREFIX_SAVED "${CMAKE_INSTALL_PREFIX} " )
2972+ set (CMAKE_INSTALL_PREFIX "${CARES_PREFIX} " )
2973+ fetchcontent_makeavailable(cares)
29752974
2976- add_library (c-ares::cares STATIC IMPORTED )
2977- set_target_properties (c-ares::cares PROPERTIES IMPORTED_LOCATION "${CARES_STATIC_LIB} " )
2978- target_include_directories (c-ares::cares BEFORE INTERFACE "${CARES_INCLUDE_DIR} " )
2979- add_dependencies (c-ares::cares cares_ep)
2975+ # Restore original install prefix
2976+ set (CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX_SAVED} " )
2977+ cleanup_fetchcontent()
2978+
2979+ # gRPC requires c-ares to be installed to a known location.
2980+ # We have to do this in two steps to avoid double installation of c-ares
2981+ # when Arrow is installed.
2982+ # This custom target ensures c-ares is built before we install
2983+ add_custom_target (cares_built DEPENDS c-ares::cares)
2984+
2985+ # Disable c-ares's install script after it's built to prevent double installation
2986+ add_custom_command (OUTPUT "${cares_BINARY_DIR} /cmake_install.cmake.saved"
2987+ COMMAND ${CMAKE_COMMAND} -E copy_if_different
2988+ "${cares_BINARY_DIR} /cmake_install.cmake"
2989+ "${cares_BINARY_DIR} /cmake_install.cmake.saved"
2990+ COMMAND ${CMAKE_COMMAND} -E echo
2991+ "# c-ares install disabled to prevent double installation with Arrow"
2992+ > "${cares_BINARY_DIR} /cmake_install.cmake"
2993+ DEPENDS cares_built
2994+ COMMENT "Disabling c-ares install to prevent double installation"
2995+ VERBATIM )
2996+
2997+ add_custom_target (cares_install_disabled ALL
2998+ DEPENDS "${cares_BINARY_DIR} /cmake_install.cmake.saved" )
2999+
3000+ # Install c-ares to CARES_PREFIX for gRPC to find
3001+ add_custom_command (OUTPUT "${CARES_PREFIX} /.cares_installed"
3002+ COMMAND ${CMAKE_COMMAND} -E copy_if_different
3003+ "${cares_BINARY_DIR} /cmake_install.cmake.saved"
3004+ "${cares_BINARY_DIR} /cmake_install.cmake.tmp"
3005+ COMMAND ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX=${CARES_PREFIX}
3006+ -DCMAKE_INSTALL_CONFIG_NAME=$<CONFIG> -P
3007+ "${cares_BINARY_DIR} /cmake_install.cmake.tmp" ||
3008+ ${CMAKE_COMMAND} -E true
3009+ COMMAND ${CMAKE_COMMAND} -E touch "${CARES_PREFIX} /.cares_installed"
3010+ DEPENDS cares_install_disabled
3011+ COMMENT "Installing c-ares to ${CARES_PREFIX} for gRPC"
3012+ VERBATIM )
3013+
3014+ # Make cares_ep depend on the install completion marker
3015+ add_custom_target (cares_ep DEPENDS "${CARES_PREFIX} /.cares_installed" )
29803016
29813017 if (APPLE )
29823018 # libresolv must be linked from c-ares version 1.16.1
@@ -2985,8 +3021,6 @@ macro(build_cares)
29853021 "${LIBRESOLV_LIBRARY} " )
29863022 endif ()
29873023
2988- set (CARES_VENDORED TRUE )
2989-
29903024 list (APPEND ARROW_BUNDLED_STATIC_LIBS c-ares::cares)
29913025endmacro ()
29923026
@@ -3208,8 +3242,16 @@ macro(build_grpc)
32083242 get_filename_component (GRPC_PB_ROOT "${GRPC_PROTOBUF_INCLUDE_DIR} " DIRECTORY )
32093243 get_target_property (GRPC_Protobuf_PROTOC_LIBRARY ${ARROW_PROTOBUF_LIBPROTOC}
32103244 IMPORTED_LOCATION )
3211- get_target_property (GRPC_CARES_INCLUDE_DIR c-ares::cares INTERFACE_INCLUDE_DIRECTORIES )
3212- get_filename_component (GRPC_CARES_ROOT "${GRPC_CARES_INCLUDE_DIR} " DIRECTORY )
3245+
3246+ # For FetchContent c-ares, use the install prefix directly
3247+ if (CARES_VENDORED)
3248+ set (GRPC_CARES_ROOT "${CARES_PREFIX} " )
3249+ else ()
3250+ get_target_property (GRPC_CARES_INCLUDE_DIR c-ares::cares
3251+ INTERFACE_INCLUDE_DIRECTORIES )
3252+ get_filename_component (GRPC_CARES_ROOT "${GRPC_CARES_INCLUDE_DIR} " DIRECTORY )
3253+ endif ()
3254+
32133255 get_target_property (GRPC_RE2_INCLUDE_DIR re2::re2 INTERFACE_INCLUDE_DIRECTORIES )
32143256 get_filename_component (GRPC_RE2_ROOT "${GRPC_RE2_INCLUDE_DIR} " DIRECTORY )
32153257
0 commit comments