Skip to content

Commit 8aeff65

Browse files
authored
[VL] Support test/debug/benchmark native builds on macOS (follow-up to #12331) (#12470)
1 parent 6f179f5 commit 8aeff65

9 files changed

Lines changed: 118 additions & 47 deletions

File tree

cpp/CMakeLists.txt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,19 @@ if(NOT DEFINED VELOX_HOME)
6666
message(STATUS "Set VELOX_HOME to ${VELOX_HOME}")
6767
endif()
6868

69+
set(GLUTEN_PREFIX_INCLUDE_DIRS)
70+
if(CMAKE_INSTALL_PREFIX
71+
AND NOT CMAKE_INSTALL_PREFIX STREQUAL "/usr/local"
72+
AND IS_DIRECTORY "${CMAKE_INSTALL_PREFIX}/include")
73+
list(APPEND GLUTEN_PREFIX_INCLUDE_DIRS "${CMAKE_INSTALL_PREFIX}/include")
74+
endif()
75+
foreach(PREFIX_PATH IN LISTS CMAKE_PREFIX_PATH)
76+
if(IS_DIRECTORY "${PREFIX_PATH}/include")
77+
list(APPEND GLUTEN_PREFIX_INCLUDE_DIRS "${PREFIX_PATH}/include")
78+
endif()
79+
endforeach()
80+
list(REMOVE_DUPLICATES GLUTEN_PREFIX_INCLUDE_DIRS)
81+
6982
if(${CMAKE_BUILD_TYPE} STREQUAL "Debug")
7083
set(ARROW_HOME
7184
${VELOX_HOME}/_build/debug/CMake/resolve_dependency_modules/arrow/arrow_ep/

cpp/core/CMakeLists.txt

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,9 @@ target_include_directories(
220220
gluten
221221
PUBLIC ${CMAKE_SYSTEM_INCLUDE_PATH} ${JNI_INCLUDE_DIRS}
222222
${CMAKE_CURRENT_SOURCE_DIR} ${PROTO_OUTPUT_DIR} ${PROTOBUF_INCLUDE})
223+
if(GLUTEN_PREFIX_INCLUDE_DIRS)
224+
target_include_directories(gluten BEFORE PUBLIC ${GLUTEN_PREFIX_INCLUDE_DIRS})
225+
endif()
223226
set_target_properties(gluten PROPERTIES LIBRARY_OUTPUT_DIRECTORY
224227
${root_directory}/releases)
225228

@@ -241,13 +244,15 @@ install(TARGETS gluten DESTINATION ${CMAKE_INSTALL_LIBDIR})
241244
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/resources/libhdfs.so
242245
DESTINATION ${LIBHDFS3_DESTINATION})
243246

244-
add_custom_command(
245-
TARGET gluten
246-
POST_BUILD
247-
COMMAND ld $<TARGET_FILE:gluten> || true
248-
COMMENT "Checking ld result of libgluten.so")
249-
add_custom_command(
250-
TARGET gluten
251-
POST_BUILD
252-
COMMAND ldd $<TARGET_FILE:gluten> || true
253-
COMMENT "Checking ldd result of libgluten.so")
247+
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
248+
add_custom_command(
249+
TARGET gluten
250+
POST_BUILD
251+
COMMAND ld $<TARGET_FILE:gluten> || true
252+
COMMENT "Checking ld result of libgluten.so")
253+
add_custom_command(
254+
TARGET gluten
255+
POST_BUILD
256+
COMMAND ldd $<TARGET_FILE:gluten> || true
257+
COMMENT "Checking ldd result of libgluten.so")
258+
endif()

cpp/velox/CMakeLists.txt

Lines changed: 44 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,12 @@ if(ENABLE_GLUTEN_VCPKG AND NOT CMAKE_SYSTEM_NAME MATCHES "Darwin")
262262
target_link_options(
263263
velox PRIVATE -Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/symbols.map)
264264
endif()
265+
if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
266+
# Make libvelox.dylib own the Velox mono archive. Test utilities can then
267+
# resolve Velox symbols from the dylib instead of linking a second copy.
268+
target_link_options(velox PRIVATE
269+
"LINKER:-force_load,${VELOX_BUILD_PATH}/lib/libvelox.a")
270+
endif()
265271

266272
find_protobuf()
267273
message(STATUS "Found Protobuf: ${PROTOBUF_LIBRARY}")
@@ -289,6 +295,9 @@ target_include_directories(
289295
${VELOX_HOME}
290296
${PROTO_OUTPUT_DIR}
291297
${PROTOBUF_INCLUDE})
298+
if(GLUTEN_PREFIX_INCLUDE_DIRS)
299+
target_include_directories(velox BEFORE PUBLIC ${GLUTEN_PREFIX_INCLUDE_DIRS})
300+
endif()
292301

293302
set_target_properties(velox PROPERTIES LIBRARY_OUTPUT_DIRECTORY
294303
${root_directory}/releases)
@@ -308,6 +317,10 @@ target_link_libraries(velox PUBLIC gluten)
308317

309318
# Requires VELOX_MONO_LIBRARY=ON when building Velox.
310319
import_library(facebook::velox ${VELOX_BUILD_PATH}/lib/libvelox.a)
320+
set(GLUTEN_VELOX_LINK_SCOPE PUBLIC)
321+
if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
322+
set(GLUTEN_VELOX_LINK_SCOPE PRIVATE)
323+
endif()
311324

312325
if(BUILD_TESTS)
313326
add_duckdb()
@@ -337,7 +350,7 @@ if(BUILD_TESTS)
337350
target_link_libraries(velox PUBLIC facebook::velox::exec_test_lib)
338351
endif()
339352

340-
target_link_libraries(velox PUBLIC facebook::velox)
353+
target_link_libraries(velox ${GLUTEN_VELOX_LINK_SCOPE} facebook::velox)
341354

342355
target_link_libraries(velox PUBLIC ${GLUTEN_ROARING_LINK_LIBRARY})
343356

@@ -385,6 +398,24 @@ target_link_libraries(velox PUBLIC external::veloxthrift)
385398
# `-DCMAKE_PREFIX_PATH="${folly lib path}" to cmake arguments. It is also
386399
# applicable to other dependencies.
387400
find_package(Folly REQUIRED CONFIG)
401+
if(CMAKE_SYSTEM_NAME MATCHES "Darwin" AND TARGET gflags_shared)
402+
# Folly's exported interface references the static gflags target while glog
403+
# links the shared gflags library. Loading both copies into one process makes
404+
# gflags register its built-in flags twice and abort test binaries. Point
405+
# folly's interface at the shared gflags target instead.
406+
foreach(FOLLY_TARGET Folly::folly Folly::folly_deps)
407+
if(TARGET ${FOLLY_TARGET})
408+
get_target_property(FOLLY_LINK_LIBS ${FOLLY_TARGET}
409+
INTERFACE_LINK_LIBRARIES)
410+
if(FOLLY_LINK_LIBS MATCHES "gflags_static")
411+
list(TRANSFORM FOLLY_LINK_LIBS REPLACE "gflags_static" "gflags_shared")
412+
set_target_properties(
413+
${FOLLY_TARGET} PROPERTIES INTERFACE_LINK_LIBRARIES
414+
"${FOLLY_LINK_LIBS}")
415+
endif()
416+
endif()
417+
endforeach()
418+
endif()
388419
target_link_libraries(velox PUBLIC Folly::folly)
389420

390421
# Link thrift libraries - check vcpkg first, then fall back to system libraries
@@ -555,13 +586,15 @@ if(ENABLE_GPU)
555586
velox_curl)
556587
endif()
557588

558-
add_custom_command(
559-
TARGET velox
560-
POST_BUILD
561-
COMMAND ld $<TARGET_FILE:velox> || true
562-
COMMENT "Checking ld result of libvelox.so")
563-
add_custom_command(
564-
TARGET velox
565-
POST_BUILD
566-
COMMAND ldd $<TARGET_FILE:velox> || true
567-
COMMENT "Checking ldd result of libvelox.so")
589+
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
590+
add_custom_command(
591+
TARGET velox
592+
POST_BUILD
593+
COMMAND ld $<TARGET_FILE:velox> || true
594+
COMMENT "Checking ld result of libvelox.so")
595+
add_custom_command(
596+
TARGET velox
597+
POST_BUILD
598+
COMMAND ldd $<TARGET_FILE:velox> || true
599+
COMMENT "Checking ldd result of libvelox.so")
600+
endif()

cpp/velox/tests/CMakeLists.txt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,16 @@ function(add_velox_test TEST_EXEC)
2828
add_executable(${TEST_EXEC} ${SOURCES} ${VELOX_TEST_COMMON_SRCS})
2929
target_include_directories(${TEST_EXEC} PRIVATE ${CMAKE_SOURCE_DIR}/velox
3030
${CMAKE_SOURCE_DIR}/src)
31+
target_compile_definitions(
32+
${TEST_EXEC}
33+
PRIVATE GLUTEN_VELOX_TEST_DATA_DIR="${CMAKE_CURRENT_SOURCE_DIR}/data")
3134
target_link_libraries(${TEST_EXEC} velox ${GLUTEN_ROARING_LINK_LIBRARY}
3235
GTest::gtest GTest::gtest_main)
3336
if(ENABLE_GPU)
3437
target_link_libraries(${TEST_EXEC} velox_curl)
3538
endif()
36-
gtest_discover_tests(${TEST_EXEC} DISCOVERY_MODE PRE_TEST)
39+
gtest_discover_tests(${TEST_EXEC} DISCOVERY_MODE PRE_TEST DISCOVERY_TIMEOUT
40+
60)
3741
endfunction()
3842

3943
if(ENABLE_GPU)
@@ -68,7 +72,9 @@ if(ENABLE_GPU)
6872
target_include_directories(${TEST_EXEC} PRIVATE ${CMAKE_SOURCE_DIR}/velox
6973
${CMAKE_SOURCE_DIR}/src)
7074
target_compile_definitions(
71-
${TEST_EXEC} PUBLIC LIBCUDACXX_ENABLE_EXPERIMENTAL_MEMORY_RESOURCE)
75+
${TEST_EXEC}
76+
PUBLIC LIBCUDACXX_ENABLE_EXPERIMENTAL_MEMORY_RESOURCE
77+
PRIVATE GLUTEN_VELOX_TEST_DATA_DIR="${CMAKE_CURRENT_SOURCE_DIR}/data")
7278
target_link_libraries(
7379
${TEST_EXEC}
7480
PUBLIC facebook::velox::velox_cudf_expression

cpp/velox/tests/FilePathGenerator.cc

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,9 @@
1616
*/
1717

1818
#include "FilePathGenerator.h"
19+
1920
#include <filesystem>
2021

2122
const std::string FilePathGenerator::getDataFilePath(const std::string& fileName) {
22-
const std::string currentPath = std::filesystem::current_path().c_str();
23-
const std::string filePath = currentPath + "/../../../velox/tests/data/" + fileName;
24-
return filePath;
23+
return (std::filesystem::path(GLUTEN_VELOX_TEST_DATA_DIR) / fileName).string();
2524
}

dev/build-helper-functions.sh

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -180,12 +180,17 @@ function cmake_install {
180180

181181
local MACOS_ISOLATION_FLAGS=""
182182
if [[ "$(uname)" == "Darwin" ]]; then
183-
if [[ "${INSTALL_PREFIX:-}" == "/usr/local" || "${INSTALL_PREFIX:-}" == /usr/local/* ]]; then
183+
if [[ -z "${INSTALL_PREFIX:-}" ]]; then
184+
:
185+
elif [[ "${INSTALL_PREFIX:-}" == "/usr/local" || "${INSTALL_PREFIX:-}" == /usr/local/* ]]; then
184186
echo "INFO: INSTALL_PREFIX=${INSTALL_PREFIX} is under /usr/local; keeping /usr/local visible to CMake." >&2
185187
else
186-
COMPILER_FLAGS="$COMPILER_FLAGS -isystem /usr/local/include"
187-
MACOS_ISOLATION_FLAGS="-DCMAKE_NO_SYSTEM_FROM_IMPORTED=ON \
188-
-DCMAKE_IGNORE_PREFIX_PATH=/usr/local \
188+
# CMake ignore paths only affect package discovery. AppleClang still adds
189+
# /usr/local/include to the default header search path unless an SDK
190+
# sysroot is selected, so pin SDKROOT here too for callers that invoke
191+
# cmake_install directly (e.g. build-arrow.sh) without exporting it.
192+
export SDKROOT="${SDKROOT:-$(xcrun --show-sdk-path)}"
193+
MACOS_ISOLATION_FLAGS="-DCMAKE_IGNORE_PREFIX_PATH=/usr/local \
189194
-DCMAKE_IGNORE_PATH=/usr/local;/usr/local/include;/usr/local/lib;/usr/local/lib/cmake \
190195
-DCMAKE_SYSTEM_IGNORE_PATH=/usr/local;/usr/local/include;/usr/local/lib;/usr/local/lib/cmake"
191196
fi

dev/builddeps-veloxbe.sh

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,12 @@ if [[ "$(uname)" == "Darwin" ]]; then
162162
export INSTALL_PREFIX=${INSTALL_PREFIX:-${VELOX_HOME}/deps-install}
163163
if [[ "$INSTALL_PREFIX" == "/usr/local" || "$INSTALL_PREFIX" == /usr/local/* ]]; then
164164
echo "INFO: INSTALL_PREFIX=$INSTALL_PREFIX is under /usr/local; keeping /usr/local visible to CMake." >&2
165+
else
166+
# AppleClang injects /usr/local/include into the default header search
167+
# path unless an SDK sysroot is selected. Route this build and all child
168+
# builds through the SDK so /usr/local headers cannot shadow the ones
169+
# from INSTALL_PREFIX.
170+
export SDKROOT="${SDKROOT:-$(xcrun --show-sdk-path)}"
165171
fi
166172
elif [ -n "${INSTALL_PREFIX:-}" ]; then
167173
export INSTALL_PREFIX
@@ -217,6 +223,7 @@ concat_velox_param
217223
export VELOX_HOME
218224

219225
function build_arrow {
226+
local GLUTEN_BUILD_TYPE="$BUILD_TYPE"
220227
if [ ! -d "$VELOX_HOME" ]; then
221228
get_velox
222229
if [ -z "${GLUTEN_VCPKG_ENABLED:-}" ] && [ $RUN_SETUP_SCRIPT == "ON" ]; then
@@ -227,6 +234,7 @@ function build_arrow {
227234
fi
228235
cd $GLUTEN_DIR/dev
229236
source ./build-arrow.sh
237+
BUILD_TYPE="$GLUTEN_BUILD_TYPE"
230238
}
231239

232240
function build_velox {
@@ -269,8 +277,7 @@ function build_gluten_cpp {
269277
GLUTEN_CMAKE_OPTIONS+=("-DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX")
270278
fi
271279
if [ $OS == 'Darwin' ]; then
272-
if [[ "${INSTALL_PREFIX:-}" != "/usr/local" && "${INSTALL_PREFIX:-}" != /usr/local/* ]]; then
273-
GLUTEN_CMAKE_OPTIONS+=("-DCMAKE_NO_SYSTEM_FROM_IMPORTED=ON")
280+
if [[ -n "${INSTALL_PREFIX:-}" && "${INSTALL_PREFIX:-}" != "/usr/local" && "${INSTALL_PREFIX:-}" != /usr/local/* ]]; then
274281
GLUTEN_CMAKE_OPTIONS+=("-DCMAKE_IGNORE_PREFIX_PATH=/usr/local")
275282
GLUTEN_CMAKE_OPTIONS+=("-DCMAKE_IGNORE_PATH=/usr/local;/usr/local/include;/usr/local/lib;/usr/local/lib/cmake")
276283
GLUTEN_CMAKE_OPTIONS+=("-DCMAKE_SYSTEM_IGNORE_PATH=/usr/local;/usr/local/include;/usr/local/lib;/usr/local/lib/cmake")

ep/build-velox/src/build-velox.sh

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,10 @@ function compile {
114114
-Wno-error=uninitialized -Wno-unknown-warning-option -Wno-deprecated-declarations'
115115
if [[ "$(uname)" == "Darwin" ]]; then
116116
CXX_FLAGS="$CXX_FLAGS -Wno-inconsistent-missing-override -Wno-macro-redefined"
117-
if [[ "${INSTALL_PREFIX:-}" != "/usr/local" && "${INSTALL_PREFIX:-}" != /usr/local/* ]]; then
118-
CXX_FLAGS="$CXX_FLAGS -isystem /usr/local/include"
117+
if [[ -n "${INSTALL_PREFIX:-}" && "${INSTALL_PREFIX:-}" != "/usr/local" && "${INSTALL_PREFIX:-}" != /usr/local/* ]]; then
118+
# Some prefix-installed deps only publish loose headers (e.g. xsimd), so
119+
# keep the prefix include dir on the compiler command line.
120+
CXX_FLAGS="$CXX_FLAGS -I${INSTALL_PREFIX}/include"
119121
fi
120122
fi
121123

@@ -125,8 +127,7 @@ function compile {
125127
if [ -n "${INSTALL_PREFIX:-}" ]; then
126128
COMPILE_OPTION="$COMPILE_OPTION -DCMAKE_PREFIX_PATH=${INSTALL_PREFIX} -DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX}"
127129
fi
128-
if [[ "$(uname)" == "Darwin" && "${INSTALL_PREFIX:-}" != "/usr/local" && "${INSTALL_PREFIX:-}" != /usr/local/* ]]; then
129-
COMPILE_OPTION="$COMPILE_OPTION -DCMAKE_NO_SYSTEM_FROM_IMPORTED=ON"
130+
if [[ "$(uname)" == "Darwin" && -n "${INSTALL_PREFIX:-}" && "${INSTALL_PREFIX:-}" != "/usr/local" && "${INSTALL_PREFIX:-}" != /usr/local/* ]]; then
130131
COMPILE_OPTION="$COMPILE_OPTION -DCMAKE_IGNORE_PREFIX_PATH=/usr/local"
131132
COMPILE_OPTION="$COMPILE_OPTION -DCMAKE_IGNORE_PATH=/usr/local\;/usr/local/include\;/usr/local/lib\;/usr/local/lib/cmake"
132133
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 {
191192
cd _build/$COMPILE_TYPE/_deps
192193
if [ -d xsimd-build ]; then
193194
echo "INSTALL xsimd."
194-
install_cmake_dependency xsimd-build/
195+
if [ -f xsimd-build/cmake_install.cmake ]; then
196+
install_cmake_dependency xsimd-build/
197+
fi
195198
fi
196199
if [ -d googletest-build ]; then
197200
echo "INSTALL gtest."
@@ -218,6 +221,11 @@ if [ "$OS" == 'Darwin' ]; then
218221
export INSTALL_PREFIX="${INSTALL_PREFIX:-${VELOX_HOME}/deps-install}"
219222
if [[ "$INSTALL_PREFIX" == "/usr/local" || "$INSTALL_PREFIX" == /usr/local/* ]]; then
220223
echo "INFO: INSTALL_PREFIX=$INSTALL_PREFIX is under /usr/local; keeping /usr/local visible to CMake." >&2
224+
else
225+
# AppleClang adds /usr/local/include to the default header search path
226+
# unless an SDK sysroot is selected. Keep prefix-based builds on the SDK so
227+
# /usr/local headers cannot shadow the ones from INSTALL_PREFIX.
228+
export SDKROOT="${SDKROOT:-$(xcrun --show-sdk-path)}"
221229
fi
222230
elif [ -n "${INSTALL_PREFIX:-}" ]; then
223231
export INSTALL_PREFIX

ep/build-velox/src/get-velox.sh

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -89,17 +89,12 @@ function process_setup_tencentos32 {
8989
sed -i "/^[[:space:]]*#/!s/.*dnf config-manager --set-enabled powertools/#&/" ${CURRENT_DIR}/setup-centos8.sh
9090
}
9191

92-
# Keep macOS dependency builds on INSTALL_PREFIX even when /usr/local is present.
93-
# Apple clang injects /usr/local/include as a normal include path before CMake's
94-
# imported system includes, which can mix /usr/local headers with INSTALL_PREFIX
95-
# libraries. Demote it to system include order. Folly also enables jemalloc from
96-
# Homebrew headers but does not link libjemalloc, so keep Folly's Linux-equivalent
97-
# no-jemalloc behavior here; Gluten's own jemalloc build is independent of this.
92+
# Folly enables jemalloc when Homebrew headers are visible but does not link
93+
# libjemalloc, leaving _mallocx/_nallocx undefined for downstream links. Keep
94+
# Folly's Linux-equivalent no-jemalloc behavior; Gluten's own jemalloc build is
95+
# independent of this. Header-search isolation from /usr/local is handled by
96+
# SDKROOT exported in builddeps-veloxbe.sh / build-velox.sh.
9897
function process_setup_macos {
99-
if [[ "${INSTALL_PREFIX:-}" != "/usr/local" && "${INSTALL_PREFIX:-}" != /usr/local/* ]] &&
100-
! grep -Fq '/usr/local/include' scripts/setup-macos.sh; then
101-
sed -i '' 's|OS_CXXFLAGS=" -isystem $(brew --prefix)/include "|OS_CXXFLAGS=" -isystem $(brew --prefix)/include -isystem /usr/local/include "|' scripts/setup-macos.sh
102-
fi
10398
if ! grep -Fq 'FOLLY_USE_JEMALLOC=OFF' scripts/setup-common.sh; then
10499
sed -i '' 's/local FOLLY_FLAGS=(/local FOLLY_FLAGS=(-DFOLLY_USE_JEMALLOC=OFF /' scripts/setup-common.sh
105100
fi

0 commit comments

Comments
 (0)