feat: support android platform cross build (#90)
This commit is contained in:
parent
83c03ed0e4
commit
43e3eeac40
|
|
@ -0,0 +1,188 @@
|
|||
name: android-cross-build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "main" ]
|
||||
paths-ignore:
|
||||
- '**.md'
|
||||
merge_group:
|
||||
pull_request:
|
||||
branches: [ "main" ]
|
||||
paths-ignore:
|
||||
- '**.md'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build-android:
|
||||
# sdkmanager and other Android tools are x86‑only; ARM runners fail with exit code 1
|
||||
# switch back to an x86 image so the setup-android action can install the SDK
|
||||
runs-on: ubuntu-24.04
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
abi: [x86_64]
|
||||
api: [21]
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Cache dependencies
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
~/.ccache
|
||||
key: ${{ runner.os }}-dependencies-cache-${{ hashFiles('**/CMakeLists.txt', 'thirdparty/**') }}-stl-fix
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
cmake ninja-build git ca-certificates python3 \
|
||||
build-essential make ccache
|
||||
|
||||
- name: Setup Java 17
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: temurin
|
||||
java-version: '17'
|
||||
|
||||
- name: Setup Android SDK
|
||||
uses: android-actions/setup-android@v3
|
||||
|
||||
- name: Install NDK (side by side)
|
||||
shell: bash
|
||||
run: |
|
||||
sdkmanager "ndk;26.1.10909125"
|
||||
|
||||
- name: Cache host protoc build
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: build-host
|
||||
key: ${{ runner.os }}-host-protoc-${{ hashFiles('src/**', 'CMakeLists.txt') }}-stl-fix
|
||||
restore-keys: |
|
||||
${{ runner.os }}-host-protoc-
|
||||
|
||||
- name: Use host env to compile protoc
|
||||
shell: bash
|
||||
run: |
|
||||
git submodule update --init
|
||||
if [ ! -d "build-host" ]; then
|
||||
export CCACHE_BASEDIR="$GITHUB_WORKSPACE"
|
||||
export CCACHE_NOHASHDIR=1
|
||||
export CCACHE_SLOPPINESS=clang_index_store,file_stat_matches,include_file_mtime,locale,time_macros
|
||||
|
||||
cmake -S . -B build-host -G Ninja \
|
||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
|
||||
cmake --build build-host --target protoc --parallel
|
||||
else
|
||||
echo "Using cached host protoc build"
|
||||
fi
|
||||
|
||||
- name: Cache Android build
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: build-android-${{ matrix.abi }}
|
||||
key: ${{ runner.os }}-android-build-${{ matrix.abi }}-${{ hashFiles('src/**', 'CMakeLists.txt', 'cmake/**', 'thirdparty/**') }}-stl-fix-3
|
||||
|
||||
- name: Configure and Build
|
||||
shell: bash
|
||||
run: |
|
||||
git submodule foreach --recursive 'git stash --include-untracked'
|
||||
|
||||
export ANDROID_SDK_ROOT="$ANDROID_HOME"
|
||||
export ANDROID_NDK_HOME="$ANDROID_SDK_ROOT/ndk/26.1.10909125"
|
||||
|
||||
export CCACHE_BASEDIR="$GITHUB_WORKSPACE"
|
||||
export CCACHE_NOHASHDIR=1
|
||||
export CCACHE_SLOPPINESS=clang_index_store,file_stat_matches,include_file_mtime,locale,time_macros
|
||||
|
||||
if [ ! -d "build-android-${{ matrix.abi }}" ]; then
|
||||
cmake -S . -B build-android-${{ matrix.abi }} -G Ninja \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake" \
|
||||
-DANDROID_ABI=${{ matrix.abi }} \
|
||||
-DANDROID_PLATFORM=android-${{ matrix.api }} \
|
||||
-DANDROID_STL=c++_static \
|
||||
-DBUILD_PYTHON_BINDINGS=OFF \
|
||||
-DENABLE_NATIVE=OFF \
|
||||
-DAUTO_DETECT_ARCH=OFF \
|
||||
-DBUILD_TOOLS=OFF \
|
||||
-DGLOBAL_CC_PROTOBUF_PROTOC="$GITHUB_WORKSPACE/build-host/bin/protoc" \
|
||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_VERBOSE_MAKEFILE=ON
|
||||
cmake --build build-android-${{ matrix.abi }} --parallel --verbose
|
||||
else
|
||||
echo "Using cached Android build directory"
|
||||
fi
|
||||
|
||||
- name: Cache examples build
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: examples/c++/build-android-examples-${{ matrix.abi }}
|
||||
key: ${{ runner.os }}-examples-build-${{ matrix.abi }}-${{ hashFiles('examples/c++/**', 'CMakeLists.txt', 'src/**') }}-stl-fix-3
|
||||
|
||||
- name: Build examples
|
||||
shell: bash
|
||||
run: |
|
||||
export ANDROID_SDK_ROOT="$ANDROID_HOME"
|
||||
export ANDROID_NDK_HOME="$ANDROID_SDK_ROOT/ndk/26.1.10909125"
|
||||
|
||||
if [ ! -d "examples/c++/build-android-examples-${{ matrix.abi }}" ]; then
|
||||
cmake -S examples/c++ -B examples/c++/build-android-examples-${{ matrix.abi }} -G Ninja \
|
||||
-DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake" \
|
||||
-DANDROID_ABI=${{ matrix.abi }} \
|
||||
-DANDROID_PLATFORM=android-${{ matrix.api }} \
|
||||
-DANDROID_STL=c++_static \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON \
|
||||
-DHOST_BUILD_DIR="build-android-${{ matrix.abi }}" \
|
||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
|
||||
cmake --build examples/c++/build-android-examples-${{ matrix.abi }} --parallel
|
||||
else
|
||||
echo "Using cached examples build"
|
||||
fi
|
||||
|
||||
- name: Run on Android emulator (arm64) and verify
|
||||
uses: reactivecircus/android-emulator-runner@v2
|
||||
with:
|
||||
api-level: ${{ matrix.api }}
|
||||
arch: ${{ matrix.abi }}
|
||||
# target: google_apis
|
||||
# emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -netdelay none -netspeed full
|
||||
# disable-animations: true
|
||||
script: |
|
||||
adb wait-for-device
|
||||
|
||||
echo "Device ABI:"
|
||||
adb shell getprop ro.product.cpu.abi
|
||||
adb shell getprop ro.product.cpu.abilist
|
||||
|
||||
echo "Checking binary sizes:"
|
||||
ls -lah examples/c++/build-android-examples-${{ matrix.abi }}/
|
||||
|
||||
# Push executables to device
|
||||
adb push examples/c++/build-android-examples-${{ matrix.abi }}/ailego-example /data/local/tmp/
|
||||
adb push examples/c++/build-android-examples-${{ matrix.abi }}/core-example /data/local/tmp/
|
||||
adb push examples/c++/build-android-examples-${{ matrix.abi }}/db-example /data/local/tmp/
|
||||
|
||||
adb shell chmod 755 /data/local/tmp/ailego-example
|
||||
adb shell chmod 755 /data/local/tmp/core-example
|
||||
adb shell chmod 755 /data/local/tmp/db-example
|
||||
|
||||
echo "File info on device:"
|
||||
adb shell ls -la /data/local/tmp/ailego-example
|
||||
adb shell ls -la /data/local/tmp/core-example
|
||||
adb shell ls -la /data/local/tmp/db-example
|
||||
|
||||
echo "Running ailego example:"
|
||||
adb shell 'cd /data/local/tmp && ./ailego-example'
|
||||
|
||||
echo "Running core example:"
|
||||
adb shell 'cd /data/local/tmp && ./core-example'
|
||||
|
||||
echo "Running db example:"
|
||||
adb shell 'cd /data/local/tmp && ./db-example'
|
||||
|
|
@ -5,7 +5,6 @@ build*
|
|||
bin/*
|
||||
lib/*
|
||||
var/*
|
||||
thirdparty
|
||||
venv*
|
||||
tests/integration/conf/*
|
||||
tests/de_integration/conf/*
|
||||
|
|
@ -48,3 +47,5 @@ yarn-debug.log*
|
|||
yarn-error.log*
|
||||
|
||||
allure-*
|
||||
|
||||
!build_android.sh
|
||||
|
|
@ -11,6 +11,7 @@
|
|||
[submodule "thirdparty/rocksdb/rocksdb-8.1.1"]
|
||||
path = thirdparty/rocksdb/rocksdb-8.1.1
|
||||
url = https://github.com/facebook/rocksdb.git
|
||||
ignore = all
|
||||
[submodule "thirdparty/yaml-cpp/yaml-cpp-0.6.3"]
|
||||
path = thirdparty/yaml-cpp/yaml-cpp-0.6.3
|
||||
url = https://github.com/jbeder/yaml-cpp.git
|
||||
|
|
|
|||
|
|
@ -1313,6 +1313,9 @@ function(cc_proto_library)
|
|||
|
||||
_find_protobuf("${CC_ARGS_PROTOBUF_VERSION}")
|
||||
set(CC_PROTOBUF_PROTOC ${CC_PROTOBUF_PROTOC_${CC_ARGS_PROTOBUF_VERSION}})
|
||||
if(DEFINED GLOBAL_CC_PROTOBUF_PROTOC)
|
||||
set(CC_PROTOBUF_PROTOC ${GLOBAL_CC_PROTOBUF_PROTOC})
|
||||
endif()
|
||||
set(CC_PROTOBUF_INCS ${CC_PROTOBUF_INCS_${CC_ARGS_PROTOBUF_VERSION}})
|
||||
set(CC_PROTOBUF_LIBS ${CC_PROTOBUF_LIBS_${CC_ARGS_PROTOBUF_VERSION}})
|
||||
|
||||
|
|
|
|||
|
|
@ -7,9 +7,14 @@ set(CMAKE_CXX_STANDARD 17)
|
|||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
|
||||
# --- Paths to Zvec and dependencies ---
|
||||
# Allow custom host build directory, default to "build"
|
||||
if(NOT DEFINED HOST_BUILD_DIR)
|
||||
set(HOST_BUILD_DIR "build")
|
||||
endif()
|
||||
|
||||
set(ZVEC_INCLUDE_DIR ${CMAKE_BINARY_DIR}/../../../src/include)
|
||||
set(ZVEC_LIB_DIR ${CMAKE_BINARY_DIR}/../../../build/lib)
|
||||
set(ZVEC_DEPENDENCY_LIB_DIR ${CMAKE_BINARY_DIR}/../../../build/external/usr/local/lib)
|
||||
set(ZVEC_LIB_DIR ${CMAKE_BINARY_DIR}/../../../${HOST_BUILD_DIR}/lib)
|
||||
set(ZVEC_DEPENDENCY_LIB_DIR ${CMAKE_BINARY_DIR}/../../../${HOST_BUILD_DIR}/external/usr/local/lib)
|
||||
|
||||
# Add include and library search paths
|
||||
include_directories(${ZVEC_INCLUDE_DIR})
|
||||
|
|
@ -84,6 +89,16 @@ elseif(APPLE)
|
|||
zvec-ailego
|
||||
${zvec_core_deps}
|
||||
)
|
||||
elseif(ANDROID)
|
||||
target_link_libraries(zvec-core INTERFACE
|
||||
-Wl,--whole-archive
|
||||
zvec_core
|
||||
-Wl,--no-whole-archive
|
||||
-Wl,--start-group
|
||||
zvec-ailego
|
||||
${zvec_core_deps}
|
||||
-Wl,--end-group
|
||||
)
|
||||
else()
|
||||
message(FATAL_ERROR "Unsupported platform: ${CMAKE_SYSTEM_NAME}")
|
||||
endif()
|
||||
|
|
@ -106,6 +121,17 @@ elseif(APPLE)
|
|||
zvec-ailego
|
||||
${zvec_db_deps}
|
||||
)
|
||||
elseif(ANDROID)
|
||||
target_link_libraries(zvec-db INTERFACE
|
||||
zvec_db
|
||||
zvec-core
|
||||
zvec-ailego
|
||||
-Wl,--start-group
|
||||
${zvec_db_deps}
|
||||
-Wl,--end-group
|
||||
)
|
||||
else()
|
||||
message(FATAL_ERROR "Unsupported platform: ${CMAKE_SYSTEM_NAME}")
|
||||
endif()
|
||||
|
||||
|
||||
|
|
@ -114,6 +140,11 @@ add_executable(db-example db/main.cc)
|
|||
target_link_libraries(db-example PRIVATE
|
||||
zvec-db
|
||||
)
|
||||
if(ANDROID)
|
||||
target_link_libraries(db-example PRIVATE
|
||||
log
|
||||
)
|
||||
endif()
|
||||
|
||||
add_executable(core-example core/main.cc)
|
||||
target_link_libraries(core-example PRIVATE
|
||||
|
|
@ -124,3 +155,24 @@ add_executable(ailego-example ailego/main.cc)
|
|||
target_link_libraries(ailego-example PRIVATE
|
||||
zvec-ailego
|
||||
)
|
||||
|
||||
# Strip symbols to reduce executable size
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Release" AND ANDROID)
|
||||
add_custom_command(TARGET db-example POST_BUILD
|
||||
COMMAND ${CMAKE_STRIP} "$<TARGET_FILE:db-example>"
|
||||
COMMENT "Stripping symbols from db-example")
|
||||
add_custom_command(TARGET core-example POST_BUILD
|
||||
COMMAND ${CMAKE_STRIP} "$<TARGET_FILE:core-example>"
|
||||
COMMENT "Stripping symbols from core-example")
|
||||
add_custom_command(TARGET ailego-example POST_BUILD
|
||||
COMMAND ${CMAKE_STRIP} "$<TARGET_FILE:ailego-example>"
|
||||
COMMENT "Stripping symbols from ailego-example")
|
||||
endif()
|
||||
|
||||
# Optimize for size
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Release" AND ANDROID)
|
||||
set_property(TARGET db-example core-example ailego-example
|
||||
PROPERTY COMPILE_FLAGS "-Os")
|
||||
set_property(TARGET db-example core-example ailego-example
|
||||
PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
|
||||
endif()
|
||||
|
|
|
|||
|
|
@ -193,6 +193,7 @@ exclude = [
|
|||
".git/",
|
||||
".venv/",
|
||||
"venv/",
|
||||
"thirdparty",
|
||||
]
|
||||
|
||||
[tool.ruff.lint]
|
||||
|
|
|
|||
|
|
@ -0,0 +1,65 @@
|
|||
#!/bin/bash
|
||||
set -e
|
||||
CURRENT_DIR=$(pwd)
|
||||
|
||||
ABI=${1:-"arm64-v8a"}
|
||||
API_LEVEL=${2:-21}
|
||||
BUILD_TYPE=${3:-"Release"}
|
||||
|
||||
# step1: use host env to compile protoc
|
||||
echo "step1: building protoc for host..."
|
||||
HOST_BUILD_DIR="build_host"
|
||||
mkdir -p $HOST_BUILD_DIR
|
||||
cd $HOST_BUILD_DIR
|
||||
|
||||
cmake -DCMAKE_BUILD_TYPE="$BUILD_TYPE" ..
|
||||
make -j protoc
|
||||
PROTOC_EXECUTABLE=$CURRENT_DIR/$HOST_BUILD_DIR/bin/protoc
|
||||
cd $CURRENT_DIR
|
||||
|
||||
echo "step1: Done!!!"
|
||||
|
||||
# step2: cross build zvec based on android ndk
|
||||
echo "step2: building zvec for android..."
|
||||
|
||||
# reset thirdparty directory
|
||||
git submodule foreach --recursive 'git stash --include-untracked'
|
||||
|
||||
export ANDROID_SDK_ROOT=$HOME/Library/Android/sdk
|
||||
export ANDROID_HOME=$ANDROID_SDK_ROOT
|
||||
export ANDROID_NDK_HOME=$ANDROID_SDK_ROOT/ndk/28.2.13676358
|
||||
export CMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake
|
||||
|
||||
export PATH=$PATH:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin
|
||||
export PATH=$PATH:$ANDROID_SDK_ROOT/platform-tools
|
||||
export PATH=$PATH:$ANDROID_NDK_HOME
|
||||
|
||||
if [ -z "$ANDROID_NDK_HOME" ]; then
|
||||
echo "error: ANDROID_NDK_HOME env not set"
|
||||
echo "please install NDK and set env variable ANDROID_NDK_HOME"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
BUILD_DIR="build_android_${ABI}"
|
||||
mkdir -p $BUILD_DIR
|
||||
cd $BUILD_DIR
|
||||
|
||||
echo "configure CMake..."
|
||||
cmake \
|
||||
-DANDROID_NDK="$ANDROID_NDK_HOME" \
|
||||
-DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake" \
|
||||
-DANDROID_ABI="$ABI" \
|
||||
-DANDROID_NATIVE_API_LEVEL="$API_LEVEL" \
|
||||
-DANDROID_STL="c++_static" \
|
||||
-DCMAKE_BUILD_TYPE="$BUILD_TYPE" \
|
||||
-DBUILD_PYTHON_BINDINGS=OFF \
|
||||
-DBUILD_TOOLS=OFF \
|
||||
-DCMAKE_INSTALL_PREFIX="./install" \
|
||||
-DGLOBAL_CC_PROTOBUF_PROTOC=$PROTOC_EXECUTABLE \
|
||||
../
|
||||
|
||||
echo "building..."
|
||||
CORE_COUNT=$(sysctl -n hw.ncpu)
|
||||
make -j$CORE_COUNT
|
||||
|
||||
echo "step2: Done!!!"
|
||||
|
|
@ -3,7 +3,7 @@ include(${PROJECT_ROOT_DIR}/cmake/option.cmake)
|
|||
|
||||
find_package(Threads REQUIRED)
|
||||
|
||||
if(UNIX AND NOT APPLE)
|
||||
if(UNIX AND NOT APPLE AND NOT ANDROID)
|
||||
find_library(LIB_RT NAMES rt)
|
||||
else()
|
||||
set(LIB_RT "")
|
||||
|
|
|
|||
|
|
@ -1,6 +1,11 @@
|
|||
set(ARROW_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/apache-arrow-21.0.0)
|
||||
set(ARROW_PATCH ${CMAKE_CURRENT_SOURCE_DIR}/arrow.patch)
|
||||
apply_patch_once("arrow_fix" "${ARROW_SRC_DIR}" "${ARROW_PATCH}")
|
||||
if(ANDROID)
|
||||
set(ARROW_PATCH ${CMAKE_CURRENT_SOURCE_DIR}/arrow.android.patch)
|
||||
apply_patch_once("arrow_android_fix" "${ARROW_SRC_DIR}" "${ARROW_PATCH}")
|
||||
else()
|
||||
set(ARROW_PATCH ${CMAKE_CURRENT_SOURCE_DIR}/arrow.patch)
|
||||
apply_patch_once("arrow_fix" "${ARROW_SRC_DIR}" "${ARROW_PATCH}")
|
||||
endif()
|
||||
|
||||
include(ExternalProject)
|
||||
include(ProcessorCount)
|
||||
|
|
@ -28,21 +33,38 @@ if(USE_OSS_MIRROR)
|
|||
message(STATUS "Using OSS mirror for third-party downloads")
|
||||
endif()
|
||||
|
||||
if(ANDROID)
|
||||
ExternalProject_Add(
|
||||
ARROW.BUILD PREFIX arrow
|
||||
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/apache-arrow-21.0.0
|
||||
DOWNLOAD_COMMAND ""
|
||||
BUILD_IN_SOURCE false
|
||||
CONFIGURE_COMMAND env ${CONFIGURE_ENV_LIST} "${CMAKE_COMMAND}" ${CMAKE_CACHE_ARGS} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_DEBUG_POSTFIX= -DARROW_BUILD_SHARED=OFF -DARROW_ACERO=ON -DARROW_FILESYSTEM=ON -DARROW_DATASET=ON -DARROW_PARQUET=ON -DARROW_COMPUTE=ON -DARROW_WITH_ZLIB=OFF -DARROW_DEPENDENCY_SOURCE=BUNDLED -DARROW_MIMALLOC=OFF -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DANDROID_ABI=${ANDROID_ABI} -DANDROID_NATIVE_API_LEVEL=${ANDROID_NATIVE_API_LEVEL} -DARROW_WITH_MUSL=OFF "<SOURCE_DIR>/cpp"
|
||||
BUILD_COMMAND "${CMAKE_COMMAND}" --build . --target all -- -j ${NPROC}
|
||||
INSTALL_COMMAND "${CMAKE_COMMAND}" --install "<BINARY_DIR>" --prefix=${EXTERNAL_BINARY_DIR}/usr/local
|
||||
BYPRODUCTS ${LIB_PARQUET} ${LIB_ARROW} ${LIB_COMPUTE} ${LIB_ACERO} ${LIB_ARROW_DEPENDS} ${LIB_ARROW_DATASET}
|
||||
LOG_DOWNLOAD ON
|
||||
LOG_CONFIGURE ON
|
||||
LOG_BUILD ON
|
||||
LOG_INSTALL ON
|
||||
)
|
||||
else()
|
||||
ExternalProject_Add(
|
||||
ARROW.BUILD PREFIX arrow
|
||||
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/apache-arrow-21.0.0
|
||||
DOWNLOAD_COMMAND ""
|
||||
BUILD_IN_SOURCE false
|
||||
CONFIGURE_COMMAND env ${CONFIGURE_ENV_LIST} "${CMAKE_COMMAND}" ${CMAKE_CACHE_ARGS} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_DEBUG_POSTFIX= -DARROW_BUILD_SHARED=OFF -DARROW_ACERO=ON -DARROW_FILESYSTEM=ON -DARROW_DATASET=ON -DARROW_PARQUET=ON -DARROW_COMPUTE=ON -DARROW_WITH_ZLIB=OFF -DARROW_DEPENDENCY_SOURCE=BUNDLED -DARROW_MIMALLOC=OFF -DCMAKE_INSTALL_LIBDIR=lib "<SOURCE_DIR>/cpp"
|
||||
BUILD_COMMAND "${CMAKE_COMMAND}" --build . --target all -- -j ${NPROC}
|
||||
INSTALL_COMMAND "${CMAKE_COMMAND}" --install "<BINARY_DIR>" --prefix=${EXTERNAL_BINARY_DIR}/usr/local
|
||||
BYPRODUCTS ${LIB_PARQUET} ${LIB_ARROW} ${LIB_COMPUTE} ${LIB_ACERO} ${LIB_ARROW_DEPENDS} ${LIB_ARROW_DATASET}
|
||||
LOG_DOWNLOAD ON
|
||||
LOG_CONFIGURE ON
|
||||
LOG_BUILD ON
|
||||
LOG_INSTALL ON
|
||||
)
|
||||
endif()
|
||||
|
||||
ExternalProject_Add(
|
||||
ARROW.BUILD PREFIX arrow
|
||||
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/apache-arrow-21.0.0
|
||||
DOWNLOAD_COMMAND ""
|
||||
BUILD_IN_SOURCE false
|
||||
CONFIGURE_COMMAND env ${CONFIGURE_ENV_LIST} "${CMAKE_COMMAND}" ${CMAKE_CACHE_ARGS} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_DEBUG_POSTFIX= -DARROW_BUILD_SHARED=OFF -DARROW_ACERO=ON -DARROW_FILESYSTEM=ON -DARROW_DATASET=ON -DARROW_PARQUET=ON -DARROW_COMPUTE=ON -DARROW_WITH_ZLIB=OFF -DARROW_DEPENDENCY_SOURCE=BUNDLED -DARROW_MIMALLOC=OFF -DCMAKE_INSTALL_LIBDIR=lib "<SOURCE_DIR>/cpp"
|
||||
BUILD_COMMAND "${CMAKE_COMMAND}" --build . --target all -- -j ${NPROC}
|
||||
INSTALL_COMMAND "${CMAKE_COMMAND}" --install "<BINARY_DIR>" --prefix=${EXTERNAL_BINARY_DIR}/usr/local
|
||||
BYPRODUCTS ${LIB_PARQUET} ${LIB_ARROW} ${LIB_COMPUTE} ${LIB_ACERO} ${LIB_ARROW_DEPENDS} ${LIB_ARROW_DATASET}
|
||||
LOG_DOWNLOAD ON
|
||||
LOG_CONFIGURE ON
|
||||
LOG_BUILD ON
|
||||
LOG_INSTALL ON
|
||||
)
|
||||
add_library(arrow UNKNOWN IMPORTED GLOBAL)
|
||||
add_dependencies(arrow ARROW.BUILD)
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,82 @@
|
|||
diff --git a/cpp/cmake_modules/ThirdpartyToolchain.cmake b/cpp/cmake_modules/ThirdpartyToolchain.cmake
|
||||
index 7fa4b66d4b..78bcb6d47e 100644
|
||||
--- a/cpp/cmake_modules/ThirdpartyToolchain.cmake
|
||||
+++ b/cpp/cmake_modules/ThirdpartyToolchain.cmake
|
||||
@@ -950,6 +950,13 @@ set(EP_COMMON_CMAKE_ARGS
|
||||
# https://github.com/apache/arrow/issues/45985
|
||||
-DCMAKE_POLICY_VERSION_MINIMUM=3.5)
|
||||
|
||||
+if(ANDROID)
|
||||
+ list(APPEND EP_COMMON_CMAKE_ARGS
|
||||
+ -DANDROID_ABI=${ANDROID_ABI}
|
||||
+ -DANDROID_NATIVE_API_LEVEL=${ANDROID_NATIVE_API_LEVEL}
|
||||
+ -DANDROID_NDK=${ANDROID_NDK})
|
||||
+endif()
|
||||
+
|
||||
# if building with a toolchain file, pass that through
|
||||
if(CMAKE_TOOLCHAIN_FILE)
|
||||
list(APPEND EP_COMMON_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE})
|
||||
diff --git a/cpp/src/arrow/acero/source_node.cc b/cpp/src/arrow/acero/source_node.cc
|
||||
index 0f58406760..cf68bfdcbe 100644
|
||||
--- a/cpp/src/arrow/acero/source_node.cc
|
||||
+++ b/cpp/src/arrow/acero/source_node.cc
|
||||
@@ -407,7 +407,7 @@ struct SchemaSourceNode : public SourceNode {
|
||||
struct RecordBatchReaderSourceNode : public SourceNode {
|
||||
RecordBatchReaderSourceNode(ExecPlan* plan, std::shared_ptr<Schema> schema,
|
||||
arrow::AsyncGenerator<std::optional<ExecBatch>> generator)
|
||||
- : SourceNode(plan, schema, generator) {}
|
||||
+ : SourceNode(plan, schema, generator, Ordering::Implicit()) {}
|
||||
|
||||
static Result<ExecNode*> Make(ExecPlan* plan, std::vector<ExecNode*> inputs,
|
||||
const ExecNodeOptions& options) {
|
||||
diff --git a/cpp/src/arrow/vendored/datetime/tz.cpp b/cpp/src/arrow/vendored/datetime/tz.cpp
|
||||
index 2cf6c62a84..9e64b62297 100644
|
||||
--- a/cpp/src/arrow/vendored/datetime/tz.cpp
|
||||
+++ b/cpp/src/arrow/vendored/datetime/tz.cpp
|
||||
@@ -605,7 +605,9 @@ tzdb_list
|
||||
create_tzdb()
|
||||
{
|
||||
tzdb_list tz_db;
|
||||
+#if !defined(ANDROID) && !defined(__ANDROID__)
|
||||
tzdb_list::undocumented_helper::push_front(tz_db, init_tzdb().release());
|
||||
+#endif // !defined(ANDROID) && !defined(__ANDROID__)
|
||||
return tz_db;
|
||||
}
|
||||
|
||||
@@ -3900,7 +3902,9 @@ reload_tzdb()
|
||||
if (!v.empty() && v == remote_version())
|
||||
return get_tzdb_list().front();
|
||||
#endif // AUTO_DOWNLOAD
|
||||
+#if !defined(ANDROID) && !defined(__ANDROID__)
|
||||
tzdb_list::undocumented_helper::push_front(get_tzdb_list(), init_tzdb().release());
|
||||
+#endif // !defined(ANDROID) && !defined(__ANDROID__)
|
||||
return get_tzdb_list().front();
|
||||
}
|
||||
|
||||
diff --git a/cpp/src/arrow/vendored/datetime/tz.h b/cpp/src/arrow/vendored/datetime/tz.h
|
||||
index 61ab3df106..d456d6765f 100644
|
||||
--- a/cpp/src/arrow/vendored/datetime/tz.h
|
||||
+++ b/cpp/src/arrow/vendored/datetime/tz.h
|
||||
@@ -858,7 +858,9 @@ private:
|
||||
load_data(std::istream& inf, std::int32_t tzh_leapcnt, std::int32_t tzh_timecnt,
|
||||
std::int32_t tzh_typecnt, std::int32_t tzh_charcnt);
|
||||
# if defined(ANDROID) || defined(__ANDROID__)
|
||||
+public:
|
||||
void parse_from_android_tzdata(std::ifstream& inf, const std::size_t off);
|
||||
+private:
|
||||
# endif // defined(ANDROID) || defined(__ANDROID__)
|
||||
#else // !USE_OS_TZDB
|
||||
DATE_API sys_info get_info_impl(sys_seconds tp, int tz_int) const;
|
||||
diff --git a/cpp/src/arrow/vendored/musl/strptime.c b/cpp/src/arrow/vendored/musl/strptime.c
|
||||
index 41912fd1bb..9d0b4dc1bf 100644
|
||||
--- a/cpp/src/arrow/vendored/musl/strptime.c
|
||||
+++ b/cpp/src/arrow/vendored/musl/strptime.c
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
#undef HAVE_LANGINFO
|
||||
|
||||
-#ifndef _WIN32
|
||||
+#if !defined(_WIN32) && !defined(__ANDROID__)
|
||||
#define HAVE_LANGINFO 1
|
||||
#endif
|
||||
|
||||
|
|
@ -6,8 +6,13 @@ set(HAVE_LIB_GFLAGS TRUE CACHE BOOL "")
|
|||
add_compile_options(-Wno-deprecated-declarations)
|
||||
|
||||
set(GLOG_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/glog-0.5.0)
|
||||
set(GLOG_PATCH ${CMAKE_CURRENT_SOURCE_DIR}/glog.patch)
|
||||
apply_patch_once("glog_fix" "${GLOG_SRC_DIR}" "${GLOG_PATCH}")
|
||||
if (ANDROID)
|
||||
set(GLOG_ANDROID_PATCH ${CMAKE_CURRENT_SOURCE_DIR}/glog.android.patch)
|
||||
apply_patch_once("glog_android_fix" "${GLOG_SRC_DIR}" "${GLOG_ANDROID_PATCH}")
|
||||
else()
|
||||
set(GLOG_PATCH ${CMAKE_CURRENT_SOURCE_DIR}/glog.patch)
|
||||
apply_patch_once("glog_fix" "${GLOG_SRC_DIR}" "${GLOG_PATCH}")
|
||||
endif()
|
||||
|
||||
set(_SAVED_CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY})
|
||||
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${EXTERNAL_LIB_DIR})
|
||||
|
|
|
|||
|
|
@ -0,0 +1,78 @@
|
|||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||
index 62ebbcc..e17f67e 100644
|
||||
--- a/CMakeLists.txt
|
||||
+++ b/CMakeLists.txt
|
||||
@@ -17,7 +17,7 @@ set (CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR})
|
||||
set (CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH})
|
||||
set (CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
|
||||
|
||||
-option (BUILD_SHARED_LIBS "Build shared libraries" ON)
|
||||
+option (BUILD_STATIC_LIBS "Build shared libraries" ON)
|
||||
option (PRINT_UNSYMBOLIZED_STACK_TRACES
|
||||
"Print file offsets in traces instead of symbolizing" OFF)
|
||||
option (WITH_CUSTOM_PREFIX "Enable support for user-generated message prefixes" OFF)
|
||||
@@ -802,12 +802,12 @@ if (BUILD_TESTING)
|
||||
FIXTURES_REQUIRED "cmake_package_config;cmake_package_config_working")
|
||||
endif (BUILD_TESTING)
|
||||
|
||||
-install (TARGETS glog
|
||||
- EXPORT glog-targets
|
||||
- RUNTIME DESTINATION ${_glog_CMake_BINDIR}
|
||||
- PUBLIC_HEADER DESTINATION ${_glog_CMake_INCLUDE_DIR}/glog
|
||||
- LIBRARY DESTINATION ${_glog_CMake_LIBDIR}
|
||||
- ARCHIVE DESTINATION ${_glog_CMake_LIBDIR})
|
||||
+#install (TARGETS glog
|
||||
+# EXPORT glog-targets
|
||||
+# RUNTIME DESTINATION ${_glog_CMake_BINDIR}
|
||||
+# PUBLIC_HEADER DESTINATION ${_glog_CMake_INCLUDE_DIR}/glog
|
||||
+# LIBRARY DESTINATION ${_glog_CMake_LIBDIR}
|
||||
+# ARCHIVE DESTINATION ${_glog_CMake_LIBDIR})
|
||||
|
||||
if (WITH_PKGCONFIG)
|
||||
install (
|
||||
@@ -840,8 +840,8 @@ write_basic_package_version_file (
|
||||
${CMAKE_CURRENT_BINARY_DIR}/glog-config-version.cmake
|
||||
COMPATIBILITY SameMajorVersion)
|
||||
|
||||
-export (TARGETS glog NAMESPACE glog:: FILE glog-targets.cmake)
|
||||
-export (PACKAGE glog)
|
||||
+#export (TARGETS glog NAMESPACE glog:: FILE glog-targets.cmake)
|
||||
+#export (PACKAGE glog)
|
||||
|
||||
get_filename_component (_PREFIX "${CMAKE_INSTALL_PREFIX}" ABSOLUTE)
|
||||
|
||||
@@ -885,5 +885,5 @@ install (DIRECTORY ${_glog_BINARY_CMake_DATADIR}
|
||||
FILES_MATCHING PATTERN "*.cmake"
|
||||
)
|
||||
|
||||
-install (EXPORT glog-targets NAMESPACE glog:: DESTINATION
|
||||
- ${_glog_CMake_INSTALLDIR})
|
||||
+#install (EXPORT glog-targets NAMESPACE glog:: DESTINATION
|
||||
+# ${_glog_CMake_INSTALLDIR})
|
||||
diff --git a/src/stacktrace_generic-inl.h b/src/stacktrace_generic-inl.h
|
||||
index fad81d3..67209ac 100644
|
||||
--- a/src/stacktrace_generic-inl.h
|
||||
+++ b/src/stacktrace_generic-inl.h
|
||||
@@ -39,21 +39,7 @@ _START_GOOGLE_NAMESPACE_
|
||||
|
||||
// If you change this function, also change GetStackFrames below.
|
||||
int GetStackTrace(void** result, int max_depth, int skip_count) {
|
||||
- static const int kStackLength = 64;
|
||||
- void * stack[kStackLength];
|
||||
- int size;
|
||||
-
|
||||
- size = backtrace(stack, kStackLength);
|
||||
- skip_count++; // we want to skip the current frame as well
|
||||
- int result_count = size - skip_count;
|
||||
- if (result_count < 0)
|
||||
- result_count = 0;
|
||||
- if (result_count > max_depth)
|
||||
- result_count = max_depth;
|
||||
- for (int i = 0; i < result_count; i++)
|
||||
- result[i] = stack[i + skip_count];
|
||||
-
|
||||
- return result_count;
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
_END_GOOGLE_NAMESPACE_
|
||||
|
|
@ -4,26 +4,67 @@ file(MAKE_DIRECTORY ${lz4_INCLUDE_DIR})
|
|||
file(MAKE_DIRECTORY ${lz4_LIBRARY_DIR})
|
||||
|
||||
include(ExternalProject)
|
||||
ExternalProject_Add(
|
||||
Lz4.BUILD
|
||||
PREFIX lz4
|
||||
URL "${CMAKE_CURRENT_SOURCE_DIR}/lz4-1.9.4"
|
||||
CONFIGURE_COMMAND ""
|
||||
BUILD_COMMAND env CFLAGS=-fPIC BUILD_SHARED=no make -j
|
||||
INSTALL_COMMAND make DESTDIR=${EXTERNAL_BINARY_DIR} BUILD_SHARED=no install
|
||||
BUILD_IN_SOURCE ON
|
||||
LOG_DOWNLOAD ON
|
||||
LOG_CONFIGURE ON
|
||||
LOG_BUILD ON
|
||||
LOG_INSTALL ON
|
||||
BUILD_BYPRODUCTS ${lz4_LIBRARY_DIR}/liblz4.a
|
||||
|
||||
set(_lz4_env "")
|
||||
if(ANDROID)
|
||||
string(REGEX REPLACE "^android-([0-9]+)$" "\\1" ANDROID_API_LEVEL "${ANDROID_PLATFORM}")
|
||||
|
||||
if(ANDROID_ABI STREQUAL "arm64-v8a")
|
||||
set(TARGET_TRIPLE "aarch64-linux-android")
|
||||
elseif(ANDROID_ABI STREQUAL "armeabi-v7a")
|
||||
set(TARGET_TRIPLE "armv7a-linux-androideabi")
|
||||
elseif(ANDROID_ABI STREQUAL "x86")
|
||||
set(TARGET_TRIPLE "i686-linux-android")
|
||||
elseif(ANDROID_ABI STREQUAL "x86_64")
|
||||
set(TARGET_TRIPLE "x86_64-linux-android")
|
||||
else()
|
||||
message(FATAL_ERROR "Unsupported ANDROID_ABI: ${ANDROID_ABI}")
|
||||
endif()
|
||||
|
||||
set(SYSROOT "${ANDROID_NDK}/toolchains/llvm/prebuilt/${ANDROID_HOST_TAG}/sysroot")
|
||||
set(COMMON_FLAGS
|
||||
"--sysroot=${SYSROOT}"
|
||||
"-target ${TARGET_TRIPLE}${ANDROID_API_LEVEL}"
|
||||
"-fPIC"
|
||||
"-D__ANDROID_API__=${ANDROID_API_LEVEL}"
|
||||
)
|
||||
|
||||
list(APPEND COMMON_FLAGS ${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE}})
|
||||
|
||||
string(JOIN " " _lz4_cflags ${COMMON_FLAGS})
|
||||
|
||||
list(APPEND _lz4_env
|
||||
"CC=${CMAKE_C_COMPILER}"
|
||||
"AR=${CMAKE_AR}"
|
||||
"RANLIB=${CMAKE_RANLIB}"
|
||||
"STRIP=${ANDROID_NDK}/toolchains/llvm/prebuilt/${ANDROID_HOST_TAG}/bin/llvm-strip"
|
||||
"CFLAGS=${_lz4_cflags}"
|
||||
)
|
||||
|
||||
else()
|
||||
list(APPEND _lz4_env "CFLAGS=-fPIC")
|
||||
endif()
|
||||
|
||||
ExternalProject_Add(
|
||||
Lz4.BUILD
|
||||
PREFIX lz4
|
||||
URL "${CMAKE_CURRENT_SOURCE_DIR}/lz4-1.9.4"
|
||||
CONFIGURE_COMMAND ""
|
||||
BUILD_COMMAND env ${_lz4_env} BUILD_SHARED=no make -j
|
||||
INSTALL_COMMAND make DESTDIR=${EXTERNAL_BINARY_DIR} BUILD_SHARED=no install
|
||||
BUILD_IN_SOURCE ON
|
||||
LOG_DOWNLOAD ON
|
||||
LOG_CONFIGURE ON
|
||||
LOG_BUILD ON
|
||||
LOG_INSTALL ON
|
||||
BUILD_BYPRODUCTS ${lz4_LIBRARY_DIR}/liblz4.a
|
||||
)
|
||||
|
||||
add_library(lz4 STATIC IMPORTED GLOBAL)
|
||||
set_target_properties(
|
||||
lz4 PROPERTIES
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${lz4_INCLUDE_DIR}"
|
||||
IMPORTED_LOCATION "${lz4_LIBRARY_DIR}/liblz4.a"
|
||||
lz4 PROPERTIES
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${lz4_INCLUDE_DIR}"
|
||||
IMPORTED_LOCATION "${lz4_LIBRARY_DIR}/liblz4.a"
|
||||
)
|
||||
add_dependencies(lz4 Lz4.BUILD)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +1,9 @@
|
|||
set(ROCKSDB_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/rocksdb-8.1.1)
|
||||
if (ANDROID)
|
||||
set(ROCKSDB_ANDROID_PATCH ${CMAKE_CURRENT_SOURCE_DIR}/rocksdb.android.patch)
|
||||
apply_patch_once("rocksdb_android_fix" "${ROCKSDB_SRC_DIR}" "${ROCKSDB_ANDROID_PATCH}")
|
||||
endif()
|
||||
|
||||
set(ROCKSDB_BUILD_SHARED OFF CACHE BOOL "Disable install in rocksdb" FORCE)
|
||||
|
||||
set(WITH_TESTS OFF CACHE BOOL "Disable testing in rocksdb" FORCE)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,13 @@
|
|||
diff --git a/env/io_posix.cc b/env/io_posix.cc
|
||||
index 0ec0e9c83..a78ac5a13 100644
|
||||
--- a/env/io_posix.cc
|
||||
+++ b/env/io_posix.cc
|
||||
@@ -27,7 +27,7 @@
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
-#ifdef OS_LINUX
|
||||
+#if defined(OS_LINUX) || defined(OS_ANDROID)
|
||||
#include <sys/statfs.h>
|
||||
#include <sys/sysmacros.h>
|
||||
#endif
|
||||
Loading…
Reference in New Issue