diff --git a/.github/workflows/android_build.yml b/.github/workflows/android_build.yml new file mode 100644 index 00000000..82667254 --- /dev/null +++ b/.github/workflows/android_build.yml @@ -0,0 +1,195 @@ +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: + runs-on: ubuntu-22.04 + strategy: + fail-fast: false + matrix: + # abi: [arm64-v8a, armeabi-v7a, x86_64] + 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 + restore-keys: | + ${{ runner.os }}-dependencies-cache- + + - 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 NDK + uses: android-actions/setup-android@v3 + + - name: Install NDK (side by side) + shell: bash + run: | + # yes | sdkmanager --licenses + 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 + # Setup ccache for host build + 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-2 + + - 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" + + # Setup ccache + 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 \ + -DBUILD_TOOLS=OFF \ + -DGLOBAL_CC_PROTOBUF_PROTOC="$GITHUB_WORKSPACE/build-host/bin/protoc" \ + -DCMAKE_C_COMPILER_LAUNCHER=ccache \ + -DCMAKE_CXX_COMPILER_LAUNCHER=ccache + cmake --build build-android-${{ matrix.abi }} --parallel + 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-2 + + - name: Build examples + shell: bash + run: | + 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: Install ADB and setup Android emulator + 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 + # disable-animations: true + script: | + # Wait for device to be ready + adb wait-for-device + + # Check file sizes before pushing + echo "Checking binary sizes:" + ls -lah examples/c++/build-android-examples-${{ matrix.abi }}/ + + # Check device architecture + echo "Device architecture info:" + adb shell 'getprop ro.product.cpu.abi' + adb shell 'getprop ro.product.cpu.abilist' + + # 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/ + + # Make executables executable + 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' + + # Verify file integrity + 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 "Exit code: $?" + + echo "Running core example:" + adb shell 'cd /data/local/tmp && ./core-example' + echo "Exit code: $?" + + echo "Running db example:" + adb shell 'cd /data/local/tmp && ./db-example' + echo "Exit code: $?" diff --git a/.gitignore b/.gitignore index 755089d0..0827e539 100644 --- a/.gitignore +++ b/.gitignore @@ -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 \ No newline at end of file diff --git a/build_android.sh b/build_android.sh new file mode 100644 index 00000000..80ff80cd --- /dev/null +++ b/build_android.sh @@ -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!!!" \ No newline at end of file diff --git a/cmake/bazel.cmake b/cmake/bazel.cmake index deaf1656..f1effc6d 100644 --- a/cmake/bazel.cmake +++ b/cmake/bazel.cmake @@ -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}}) diff --git a/examples/c++/CMakeLists.txt b/examples/c++/CMakeLists.txt index 0751bf9e..37d42d60 100644 --- a/examples/c++/CMakeLists.txt +++ b/examples/c++/CMakeLists.txt @@ -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" OR ANDROID) + add_custom_command(TARGET db-example POST_BUILD + COMMAND ${CMAKE_STRIP} "$" + COMMENT "Stripping symbols from db-example") + add_custom_command(TARGET core-example POST_BUILD + COMMAND ${CMAKE_STRIP} "$" + COMMENT "Stripping symbols from core-example") + add_custom_command(TARGET ailego-example POST_BUILD + COMMAND ${CMAKE_STRIP} "$" + COMMENT "Stripping symbols from ailego-example") +endif() + +# Optimize for size +if(CMAKE_BUILD_TYPE STREQUAL "Release" OR 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() diff --git a/examples/c++/build_android.sh b/examples/c++/build_android.sh new file mode 100644 index 00000000..64409c34 --- /dev/null +++ b/examples/c++/build_android.sh @@ -0,0 +1,39 @@ +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 + +#!/bin/bash +set -e + +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 + +ABI=${1:-"arm64-v8a"} +API_LEVEL=${2:-21} +BUILD_TYPE=${3:-"Release"} + +BUILD_DIR="build_android_${ABI}_macos" +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" \ + -DCMAKE_BUILD_TYPE="$BUILD_TYPE" \ + -DHOST_BUILD_DIR="build_android_${ABI}" \ + ../ + +echo "building..." +CORE_COUNT=$(sysctl -n hw.ncpu) +make -j$CORE_COUNT diff --git a/pyproject.toml b/pyproject.toml index dee6728d..051bb136 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -182,6 +182,7 @@ exclude = [ ".git/", ".venv/", "venv/", + "thirdparty", ] [tool.ruff.lint] diff --git a/src/ailego/CMakeLists.txt b/src/ailego/CMakeLists.txt index b01df973..5fcaacac 100644 --- a/src/ailego/CMakeLists.txt +++ b/src/ailego/CMakeLists.txt @@ -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 "") diff --git a/thirdparty/arrow/CMakeLists.txt b/thirdparty/arrow/CMakeLists.txt index eb8cad06..19c7e863 100644 --- a/thirdparty/arrow/CMakeLists.txt +++ b/thirdparty/arrow/CMakeLists.txt @@ -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) @@ -14,20 +19,37 @@ set(LIB_ACERO ${EXTERNAL_LIB_DIR}/libarrow_acero.a) set(LIB_ARROW_DEPENDS ${EXTERNAL_LIB_DIR}/libarrow_bundled_dependencies.a) set(LIB_ARROW_DATASET ${EXTERNAL_LIB_DIR}/libarrow_dataset.a) -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 "${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 "/cpp" - BUILD_COMMAND "${CMAKE_COMMAND}" --build . --target all -- -j ${NPROC} - INSTALL_COMMAND "${CMAKE_COMMAND}" --install "" --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 -) +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 "${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 "/cpp" + BUILD_COMMAND "${CMAKE_COMMAND}" --build . --target all -- -j ${NPROC} + INSTALL_COMMAND "${CMAKE_COMMAND}" --install "" --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 "${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 "/cpp" + BUILD_COMMAND "${CMAKE_COMMAND}" --build . --target all -- -j ${NPROC} + INSTALL_COMMAND "${CMAKE_COMMAND}" --install "" --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() add_library(arrow UNKNOWN IMPORTED GLOBAL) add_dependencies(arrow ARROW.BUILD) diff --git a/thirdparty/arrow/arrow.android.patch b/thirdparty/arrow/arrow.android.patch new file mode 100644 index 00000000..a4e8bba2 --- /dev/null +++ b/thirdparty/arrow/arrow.android.patch @@ -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, + arrow::AsyncGenerator> generator) +- : SourceNode(plan, schema, generator) {} ++ : SourceNode(plan, schema, generator, Ordering::Implicit()) {} + + static Result Make(ExecPlan* plan, std::vector 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 + diff --git a/thirdparty/glog/CMakeLists.txt b/thirdparty/glog/CMakeLists.txt index 04c1d085..611f18ef 100644 --- a/thirdparty/glog/CMakeLists.txt +++ b/thirdparty/glog/CMakeLists.txt @@ -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}) diff --git a/thirdparty/glog/glog.android.patch b/thirdparty/glog/glog.android.patch new file mode 100644 index 00000000..7b2d1a31 --- /dev/null +++ b/thirdparty/glog/glog.android.patch @@ -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_ diff --git a/thirdparty/lz4/CMakeLists.txt b/thirdparty/lz4/CMakeLists.txt index ad5f96b1..7db62d4f 100644 --- a/thirdparty/lz4/CMakeLists.txt +++ b/thirdparty/lz4/CMakeLists.txt @@ -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)