This is an automated email from the ASF dual-hosted git repository.

jackylee-ch pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gluten.git


The following commit(s) were added to refs/heads/main by this push:
     new 8aeff651e5 [VL] Support test/debug/benchmark native builds on macOS 
(follow-up to #12331) (#12470)
8aeff651e5 is described below

commit 8aeff651e538b4912d079066fc4ab5cd967b051a
Author: jackylee <[email protected]>
AuthorDate: Thu Jul 9 10:12:49 2026 +0800

    [VL] Support test/debug/benchmark native builds on macOS (follow-up to 
#12331) (#12470)
---
 cpp/CMakeLists.txt                   | 13 +++++++++
 cpp/core/CMakeLists.txt              | 25 +++++++++-------
 cpp/velox/CMakeLists.txt             | 55 ++++++++++++++++++++++++++++--------
 cpp/velox/tests/CMakeLists.txt       | 10 +++++--
 cpp/velox/tests/FilePathGenerator.cc |  5 ++--
 dev/build-helper-functions.sh        | 13 ++++++---
 dev/builddeps-veloxbe.sh             | 11 ++++++--
 ep/build-velox/src/build-velox.sh    | 18 ++++++++----
 ep/build-velox/src/get-velox.sh      | 15 ++++------
 9 files changed, 118 insertions(+), 47 deletions(-)

diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt
index 4fba7009e8..cce42a9bbe 100644
--- a/cpp/CMakeLists.txt
+++ b/cpp/CMakeLists.txt
@@ -66,6 +66,19 @@ if(NOT DEFINED VELOX_HOME)
   message(STATUS "Set VELOX_HOME to ${VELOX_HOME}")
 endif()
 
+set(GLUTEN_PREFIX_INCLUDE_DIRS)
+if(CMAKE_INSTALL_PREFIX
+   AND NOT CMAKE_INSTALL_PREFIX STREQUAL "/usr/local"
+   AND IS_DIRECTORY "${CMAKE_INSTALL_PREFIX}/include")
+  list(APPEND GLUTEN_PREFIX_INCLUDE_DIRS "${CMAKE_INSTALL_PREFIX}/include")
+endif()
+foreach(PREFIX_PATH IN LISTS CMAKE_PREFIX_PATH)
+  if(IS_DIRECTORY "${PREFIX_PATH}/include")
+    list(APPEND GLUTEN_PREFIX_INCLUDE_DIRS "${PREFIX_PATH}/include")
+  endif()
+endforeach()
+list(REMOVE_DUPLICATES GLUTEN_PREFIX_INCLUDE_DIRS)
+
 if(${CMAKE_BUILD_TYPE} STREQUAL "Debug")
   set(ARROW_HOME
       
${VELOX_HOME}/_build/debug/CMake/resolve_dependency_modules/arrow/arrow_ep/
diff --git a/cpp/core/CMakeLists.txt b/cpp/core/CMakeLists.txt
index f3860166a4..c6da36dbd0 100644
--- a/cpp/core/CMakeLists.txt
+++ b/cpp/core/CMakeLists.txt
@@ -220,6 +220,9 @@ target_include_directories(
   gluten
   PUBLIC ${CMAKE_SYSTEM_INCLUDE_PATH} ${JNI_INCLUDE_DIRS}
          ${CMAKE_CURRENT_SOURCE_DIR} ${PROTO_OUTPUT_DIR} ${PROTOBUF_INCLUDE})
+if(GLUTEN_PREFIX_INCLUDE_DIRS)
+  target_include_directories(gluten BEFORE PUBLIC 
${GLUTEN_PREFIX_INCLUDE_DIRS})
+endif()
 set_target_properties(gluten PROPERTIES LIBRARY_OUTPUT_DIRECTORY
                                         ${root_directory}/releases)
 
@@ -241,13 +244,15 @@ install(TARGETS gluten DESTINATION 
${CMAKE_INSTALL_LIBDIR})
 install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/resources/libhdfs.so
         DESTINATION ${LIBHDFS3_DESTINATION})
 
-add_custom_command(
-  TARGET gluten
-  POST_BUILD
-  COMMAND ld $<TARGET_FILE:gluten> || true
-  COMMENT "Checking ld result of libgluten.so")
-add_custom_command(
-  TARGET gluten
-  POST_BUILD
-  COMMAND ldd $<TARGET_FILE:gluten> || true
-  COMMENT "Checking ldd result of libgluten.so")
+if(CMAKE_SYSTEM_NAME MATCHES "Linux")
+  add_custom_command(
+    TARGET gluten
+    POST_BUILD
+    COMMAND ld $<TARGET_FILE:gluten> || true
+    COMMENT "Checking ld result of libgluten.so")
+  add_custom_command(
+    TARGET gluten
+    POST_BUILD
+    COMMAND ldd $<TARGET_FILE:gluten> || true
+    COMMENT "Checking ldd result of libgluten.so")
+endif()
diff --git a/cpp/velox/CMakeLists.txt b/cpp/velox/CMakeLists.txt
index d935a12d04..56cd88b996 100644
--- a/cpp/velox/CMakeLists.txt
+++ b/cpp/velox/CMakeLists.txt
@@ -262,6 +262,12 @@ if(ENABLE_GLUTEN_VCPKG AND NOT CMAKE_SYSTEM_NAME MATCHES 
"Darwin")
   target_link_options(
     velox PRIVATE -Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/symbols.map)
 endif()
+if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
+  # Make libvelox.dylib own the Velox mono archive. Test utilities can then
+  # resolve Velox symbols from the dylib instead of linking a second copy.
+  target_link_options(velox PRIVATE
+                      "LINKER:-force_load,${VELOX_BUILD_PATH}/lib/libvelox.a")
+endif()
 
 find_protobuf()
 message(STATUS "Found Protobuf: ${PROTOBUF_LIBRARY}")
@@ -289,6 +295,9 @@ target_include_directories(
          ${VELOX_HOME}
          ${PROTO_OUTPUT_DIR}
          ${PROTOBUF_INCLUDE})
+if(GLUTEN_PREFIX_INCLUDE_DIRS)
+  target_include_directories(velox BEFORE PUBLIC ${GLUTEN_PREFIX_INCLUDE_DIRS})
+endif()
 
 set_target_properties(velox PROPERTIES LIBRARY_OUTPUT_DIRECTORY
                                        ${root_directory}/releases)
@@ -308,6 +317,10 @@ target_link_libraries(velox PUBLIC gluten)
 
 # Requires VELOX_MONO_LIBRARY=ON when building Velox.
 import_library(facebook::velox ${VELOX_BUILD_PATH}/lib/libvelox.a)
+set(GLUTEN_VELOX_LINK_SCOPE PUBLIC)
+if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
+  set(GLUTEN_VELOX_LINK_SCOPE PRIVATE)
+endif()
 
 if(BUILD_TESTS)
   add_duckdb()
@@ -337,7 +350,7 @@ if(BUILD_TESTS)
   target_link_libraries(velox PUBLIC facebook::velox::exec_test_lib)
 endif()
 
-target_link_libraries(velox PUBLIC facebook::velox)
+target_link_libraries(velox ${GLUTEN_VELOX_LINK_SCOPE} facebook::velox)
 
 target_link_libraries(velox PUBLIC ${GLUTEN_ROARING_LINK_LIBRARY})
 
@@ -385,6 +398,24 @@ target_link_libraries(velox PUBLIC external::veloxthrift)
 # `-DCMAKE_PREFIX_PATH="${folly lib path}" to cmake arguments. It is also
 # applicable to other dependencies.
 find_package(Folly REQUIRED CONFIG)
+if(CMAKE_SYSTEM_NAME MATCHES "Darwin" AND TARGET gflags_shared)
+  # Folly's exported interface references the static gflags target while glog
+  # links the shared gflags library. Loading both copies into one process makes
+  # gflags register its built-in flags twice and abort test binaries. Point
+  # folly's interface at the shared gflags target instead.
+  foreach(FOLLY_TARGET Folly::folly Folly::folly_deps)
+    if(TARGET ${FOLLY_TARGET})
+      get_target_property(FOLLY_LINK_LIBS ${FOLLY_TARGET}
+                          INTERFACE_LINK_LIBRARIES)
+      if(FOLLY_LINK_LIBS MATCHES "gflags_static")
+        list(TRANSFORM FOLLY_LINK_LIBS REPLACE "gflags_static" "gflags_shared")
+        set_target_properties(
+          ${FOLLY_TARGET} PROPERTIES INTERFACE_LINK_LIBRARIES
+                                     "${FOLLY_LINK_LIBS}")
+      endif()
+    endif()
+  endforeach()
+endif()
 target_link_libraries(velox PUBLIC Folly::folly)
 
 # Link thrift libraries - check vcpkg first, then fall back to system libraries
@@ -555,13 +586,15 @@ if(ENABLE_GPU)
            velox_curl)
 endif()
 
-add_custom_command(
-  TARGET velox
-  POST_BUILD
-  COMMAND ld $<TARGET_FILE:velox> || true
-  COMMENT "Checking ld result of libvelox.so")
-add_custom_command(
-  TARGET velox
-  POST_BUILD
-  COMMAND ldd $<TARGET_FILE:velox> || true
-  COMMENT "Checking ldd result of libvelox.so")
+if(CMAKE_SYSTEM_NAME MATCHES "Linux")
+  add_custom_command(
+    TARGET velox
+    POST_BUILD
+    COMMAND ld $<TARGET_FILE:velox> || true
+    COMMENT "Checking ld result of libvelox.so")
+  add_custom_command(
+    TARGET velox
+    POST_BUILD
+    COMMAND ldd $<TARGET_FILE:velox> || true
+    COMMENT "Checking ldd result of libvelox.so")
+endif()
diff --git a/cpp/velox/tests/CMakeLists.txt b/cpp/velox/tests/CMakeLists.txt
index 59408cd233..87331de818 100644
--- a/cpp/velox/tests/CMakeLists.txt
+++ b/cpp/velox/tests/CMakeLists.txt
@@ -28,12 +28,16 @@ function(add_velox_test TEST_EXEC)
   add_executable(${TEST_EXEC} ${SOURCES} ${VELOX_TEST_COMMON_SRCS})
   target_include_directories(${TEST_EXEC} PRIVATE ${CMAKE_SOURCE_DIR}/velox
                                                   ${CMAKE_SOURCE_DIR}/src)
+  target_compile_definitions(
+    ${TEST_EXEC}
+    PRIVATE GLUTEN_VELOX_TEST_DATA_DIR="${CMAKE_CURRENT_SOURCE_DIR}/data")
   target_link_libraries(${TEST_EXEC} velox ${GLUTEN_ROARING_LINK_LIBRARY}
                         GTest::gtest GTest::gtest_main)
   if(ENABLE_GPU)
     target_link_libraries(${TEST_EXEC} velox_curl)
   endif()
-  gtest_discover_tests(${TEST_EXEC} DISCOVERY_MODE PRE_TEST)
+  gtest_discover_tests(${TEST_EXEC} DISCOVERY_MODE PRE_TEST DISCOVERY_TIMEOUT
+                       60)
 endfunction()
 
 if(ENABLE_GPU)
@@ -68,7 +72,9 @@ if(ENABLE_GPU)
     target_include_directories(${TEST_EXEC} PRIVATE ${CMAKE_SOURCE_DIR}/velox
                                                     ${CMAKE_SOURCE_DIR}/src)
     target_compile_definitions(
-      ${TEST_EXEC} PUBLIC LIBCUDACXX_ENABLE_EXPERIMENTAL_MEMORY_RESOURCE)
+      ${TEST_EXEC}
+      PUBLIC LIBCUDACXX_ENABLE_EXPERIMENTAL_MEMORY_RESOURCE
+      PRIVATE GLUTEN_VELOX_TEST_DATA_DIR="${CMAKE_CURRENT_SOURCE_DIR}/data")
     target_link_libraries(
       ${TEST_EXEC}
       PUBLIC facebook::velox::velox_cudf_expression
diff --git a/cpp/velox/tests/FilePathGenerator.cc 
b/cpp/velox/tests/FilePathGenerator.cc
index 0ee42740b3..a6281251f9 100644
--- a/cpp/velox/tests/FilePathGenerator.cc
+++ b/cpp/velox/tests/FilePathGenerator.cc
@@ -16,10 +16,9 @@
  */
 
 #include "FilePathGenerator.h"
+
 #include <filesystem>
 
 const std::string FilePathGenerator::getDataFilePath(const std::string& 
fileName) {
-  const std::string currentPath = std::filesystem::current_path().c_str();
-  const std::string filePath = currentPath + "/../../../velox/tests/data/" + 
fileName;
-  return filePath;
+  return (std::filesystem::path(GLUTEN_VELOX_TEST_DATA_DIR) / 
fileName).string();
 }
diff --git a/dev/build-helper-functions.sh b/dev/build-helper-functions.sh
index a8a257c286..4692065a66 100644
--- a/dev/build-helper-functions.sh
+++ b/dev/build-helper-functions.sh
@@ -180,12 +180,17 @@ function cmake_install {
 
   local MACOS_ISOLATION_FLAGS=""
   if [[ "$(uname)" == "Darwin" ]]; then
-    if [[ "${INSTALL_PREFIX:-}" == "/usr/local" || "${INSTALL_PREFIX:-}" == 
/usr/local/* ]]; then
+    if [[ -z "${INSTALL_PREFIX:-}" ]]; then
+      :
+    elif [[ "${INSTALL_PREFIX:-}" == "/usr/local" || "${INSTALL_PREFIX:-}" == 
/usr/local/* ]]; then
       echo "INFO: INSTALL_PREFIX=${INSTALL_PREFIX} is under /usr/local; 
keeping /usr/local visible to CMake." >&2
     else
-      COMPILER_FLAGS="$COMPILER_FLAGS -isystem /usr/local/include"
-      MACOS_ISOLATION_FLAGS="-DCMAKE_NO_SYSTEM_FROM_IMPORTED=ON \
-        -DCMAKE_IGNORE_PREFIX_PATH=/usr/local \
+      # CMake ignore paths only affect package discovery. AppleClang still adds
+      # /usr/local/include to the default header search path unless an SDK
+      # sysroot is selected, so pin SDKROOT here too for callers that invoke
+      # cmake_install directly (e.g. build-arrow.sh) without exporting it.
+      export SDKROOT="${SDKROOT:-$(xcrun --show-sdk-path)}"
+      MACOS_ISOLATION_FLAGS="-DCMAKE_IGNORE_PREFIX_PATH=/usr/local \
         
-DCMAKE_IGNORE_PATH=/usr/local;/usr/local/include;/usr/local/lib;/usr/local/lib/cmake
 \
         
-DCMAKE_SYSTEM_IGNORE_PATH=/usr/local;/usr/local/include;/usr/local/lib;/usr/local/lib/cmake"
     fi
diff --git a/dev/builddeps-veloxbe.sh b/dev/builddeps-veloxbe.sh
index 0e7398d29e..f36be37377 100755
--- a/dev/builddeps-veloxbe.sh
+++ b/dev/builddeps-veloxbe.sh
@@ -162,6 +162,12 @@ if [[ "$(uname)" == "Darwin" ]]; then
     export INSTALL_PREFIX=${INSTALL_PREFIX:-${VELOX_HOME}/deps-install}
     if [[ "$INSTALL_PREFIX" == "/usr/local" || "$INSTALL_PREFIX" == 
/usr/local/* ]]; then
         echo "INFO: INSTALL_PREFIX=$INSTALL_PREFIX is under /usr/local; 
keeping /usr/local visible to CMake." >&2
+    else
+        # AppleClang injects /usr/local/include into the default header search
+        # path unless an SDK sysroot is selected. Route this build and all 
child
+        # builds through the SDK so /usr/local headers cannot shadow the ones
+        # from INSTALL_PREFIX.
+        export SDKROOT="${SDKROOT:-$(xcrun --show-sdk-path)}"
     fi
 elif [ -n "${INSTALL_PREFIX:-}" ]; then
     export INSTALL_PREFIX
@@ -217,6 +223,7 @@ concat_velox_param
 export VELOX_HOME
 
 function build_arrow {
+  local GLUTEN_BUILD_TYPE="$BUILD_TYPE"
   if [ ! -d "$VELOX_HOME" ]; then
     get_velox
     if [ -z "${GLUTEN_VCPKG_ENABLED:-}" ] && [ $RUN_SETUP_SCRIPT == "ON" ]; 
then
@@ -227,6 +234,7 @@ function build_arrow {
   fi
   cd $GLUTEN_DIR/dev
   source ./build-arrow.sh
+  BUILD_TYPE="$GLUTEN_BUILD_TYPE"
 }
 
 function build_velox {
@@ -269,8 +277,7 @@ function build_gluten_cpp {
     GLUTEN_CMAKE_OPTIONS+=("-DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX")
   fi
   if [ $OS == 'Darwin' ]; then
-    if [[ "${INSTALL_PREFIX:-}" != "/usr/local" && "${INSTALL_PREFIX:-}" != 
/usr/local/* ]]; then
-      GLUTEN_CMAKE_OPTIONS+=("-DCMAKE_NO_SYSTEM_FROM_IMPORTED=ON")
+    if [[ -n "${INSTALL_PREFIX:-}" && "${INSTALL_PREFIX:-}" != "/usr/local" && 
"${INSTALL_PREFIX:-}" != /usr/local/* ]]; then
       GLUTEN_CMAKE_OPTIONS+=("-DCMAKE_IGNORE_PREFIX_PATH=/usr/local")
       
GLUTEN_CMAKE_OPTIONS+=("-DCMAKE_IGNORE_PATH=/usr/local;/usr/local/include;/usr/local/lib;/usr/local/lib/cmake")
       
GLUTEN_CMAKE_OPTIONS+=("-DCMAKE_SYSTEM_IGNORE_PATH=/usr/local;/usr/local/include;/usr/local/lib;/usr/local/lib/cmake")
diff --git a/ep/build-velox/src/build-velox.sh 
b/ep/build-velox/src/build-velox.sh
index e84a8faab7..31109ed919 100755
--- a/ep/build-velox/src/build-velox.sh
+++ b/ep/build-velox/src/build-velox.sh
@@ -114,8 +114,10 @@ function compile {
     -Wno-error=uninitialized -Wno-unknown-warning-option 
-Wno-deprecated-declarations'
   if [[ "$(uname)" == "Darwin" ]]; then
     CXX_FLAGS="$CXX_FLAGS -Wno-inconsistent-missing-override 
-Wno-macro-redefined"
-    if [[ "${INSTALL_PREFIX:-}" != "/usr/local" && "${INSTALL_PREFIX:-}" != 
/usr/local/* ]]; then
-      CXX_FLAGS="$CXX_FLAGS -isystem /usr/local/include"
+    if [[ -n "${INSTALL_PREFIX:-}" && "${INSTALL_PREFIX:-}" != "/usr/local" && 
"${INSTALL_PREFIX:-}" != /usr/local/* ]]; then
+      # Some prefix-installed deps only publish loose headers (e.g. xsimd), so
+      # keep the prefix include dir on the compiler command line.
+      CXX_FLAGS="$CXX_FLAGS -I${INSTALL_PREFIX}/include"
     fi
   fi
 
@@ -125,8 +127,7 @@ function compile {
   if [ -n "${INSTALL_PREFIX:-}" ]; then
     COMPILE_OPTION="$COMPILE_OPTION -DCMAKE_PREFIX_PATH=${INSTALL_PREFIX} 
-DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX}"
   fi
-  if [[ "$(uname)" == "Darwin" && "${INSTALL_PREFIX:-}" != "/usr/local" && 
"${INSTALL_PREFIX:-}" != /usr/local/* ]]; then
-    COMPILE_OPTION="$COMPILE_OPTION -DCMAKE_NO_SYSTEM_FROM_IMPORTED=ON"
+  if [[ "$(uname)" == "Darwin" && -n "${INSTALL_PREFIX:-}" && 
"${INSTALL_PREFIX:-}" != "/usr/local" && "${INSTALL_PREFIX:-}" != /usr/local/* 
]]; then
     COMPILE_OPTION="$COMPILE_OPTION -DCMAKE_IGNORE_PREFIX_PATH=/usr/local"
     COMPILE_OPTION="$COMPILE_OPTION 
-DCMAKE_IGNORE_PATH=/usr/local\;/usr/local/include\;/usr/local/lib\;/usr/local/lib/cmake"
     COMPILE_OPTION="$COMPILE_OPTION 
-DCMAKE_SYSTEM_IGNORE_PATH=/usr/local\;/usr/local/include\;/usr/local/lib\;/usr/local/lib/cmake"
@@ -191,7 +192,9 @@ function compile {
     cd _build/$COMPILE_TYPE/_deps
     if [ -d xsimd-build ]; then
       echo "INSTALL xsimd."
-      install_cmake_dependency xsimd-build/
+      if [ -f xsimd-build/cmake_install.cmake ]; then
+        install_cmake_dependency xsimd-build/
+      fi
     fi
     if [ -d googletest-build ]; then
       echo "INSTALL gtest."
@@ -218,6 +221,11 @@ if [ "$OS" == 'Darwin' ]; then
   export INSTALL_PREFIX="${INSTALL_PREFIX:-${VELOX_HOME}/deps-install}"
   if [[ "$INSTALL_PREFIX" == "/usr/local" || "$INSTALL_PREFIX" == /usr/local/* 
]]; then
     echo "INFO: INSTALL_PREFIX=$INSTALL_PREFIX is under /usr/local; keeping 
/usr/local visible to CMake." >&2
+  else
+    # AppleClang adds /usr/local/include to the default header search path
+    # unless an SDK sysroot is selected. Keep prefix-based builds on the SDK so
+    # /usr/local headers cannot shadow the ones from INSTALL_PREFIX.
+    export SDKROOT="${SDKROOT:-$(xcrun --show-sdk-path)}"
   fi
 elif [ -n "${INSTALL_PREFIX:-}" ]; then
   export INSTALL_PREFIX
diff --git a/ep/build-velox/src/get-velox.sh b/ep/build-velox/src/get-velox.sh
index 0ba44acfaa..6443710a93 100755
--- a/ep/build-velox/src/get-velox.sh
+++ b/ep/build-velox/src/get-velox.sh
@@ -89,17 +89,12 @@ function process_setup_tencentos32 {
   sed -i "/^[[:space:]]*#/!s/.*dnf config-manager --set-enabled 
powertools/#&/" ${CURRENT_DIR}/setup-centos8.sh
 }
 
-# Keep macOS dependency builds on INSTALL_PREFIX even when /usr/local is 
present.
-# Apple clang injects /usr/local/include as a normal include path before 
CMake's
-# imported system includes, which can mix /usr/local headers with 
INSTALL_PREFIX
-# libraries. Demote it to system include order. Folly also enables jemalloc 
from
-# Homebrew headers but does not link libjemalloc, so keep Folly's 
Linux-equivalent
-# no-jemalloc behavior here; Gluten's own jemalloc build is independent of 
this.
+# Folly enables jemalloc when Homebrew headers are visible but does not link
+# libjemalloc, leaving _mallocx/_nallocx undefined for downstream links. Keep
+# Folly's Linux-equivalent no-jemalloc behavior; Gluten's own jemalloc build is
+# independent of this. Header-search isolation from /usr/local is handled by
+# SDKROOT exported in builddeps-veloxbe.sh / build-velox.sh.
 function process_setup_macos {
-  if [[ "${INSTALL_PREFIX:-}" != "/usr/local" && "${INSTALL_PREFIX:-}" != 
/usr/local/* ]] &&
-      ! grep -Fq '/usr/local/include' scripts/setup-macos.sh; then
-    sed -i '' 's|OS_CXXFLAGS=" -isystem $(brew --prefix)/include 
"|OS_CXXFLAGS=" -isystem $(brew --prefix)/include -isystem /usr/local/include 
"|' scripts/setup-macos.sh
-  fi
   if ! grep -Fq 'FOLLY_USE_JEMALLOC=OFF' scripts/setup-common.sh; then
     sed -i '' 's/local FOLLY_FLAGS=(/local 
FOLLY_FLAGS=(-DFOLLY_USE_JEMALLOC=OFF /' scripts/setup-common.sh
   fi


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to