diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index e9af8b0..2c1600a 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -106,6 +106,28 @@ jobs: - uses: actions/checkout@v5 if: steps.check-skip.outputs.skip != 'true' + - name: Download Android SDK + if: steps.check-skip.outputs.skip != 'true' && runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y unzip cmake ninja-build gcc wget curl autoconf automake libtool pkg-config meson + wget -O ndk.zip https://dl.google.com/android/repository/android-ndk-r29-linux.zip + sudo mkdir -p /opt/Android/Sdk/ + sudo unzip ndk.zip -d /opt/Android/Sdk/ndk + rm ndk.zip + wget -O cmdline-tools.zip "https://dl.google.com/android/repository/commandlinetools-linux-14742923_latest.zip?hl=zh-cn" + sudo unzip cmdline-tools.zip -d /opt/Android/Sdk/cmdline-tools + rm cmdline-tools.zip + sudo mv /opt/Android/Sdk/cmdline-tools/cmdline-tools /opt/Android/Sdk/cmdline-tools/latest + sudo chown -R $USER:$USER /opt/Android/Sdk + sudo mkdir -p /opt/android-deps + sudo chown -R $USER:$USER /opt/android-deps + echo "ANDROID_SDK_ROOT=/opt/Android/Sdk" >> "$GITHUB_ENV" + echo "ANDROID_HOME=/opt/Android/Sdk" >> "$GITHUB_ENV" + echo "ANDROID_NDK_ROOT=/opt/Android/Sdk/ndk/android-ndk-r29" >> "$GITHUB_ENV" + echo "/opt/Android/Sdk/cmdline-tools/latest/bin" >> "$GITHUB_PATH" + echo "/opt/Android/Sdk/ndk/android-ndk-r29" >> "$GITHUB_PATH" + - name: Set up Python if: steps.check-skip.outputs.skip != 'true' @@ -248,7 +270,7 @@ jobs: CIBW_ARCHS: ${{ matrix.archs }} CIBW_BUILD: cp314-* # Pass through environment variables needed by build scripts - CIBW_ENVIRONMENT_PASS_LINUX: GITHUB_WORKSPACE HOST_DEPENDENCIES + CIBW_ENVIRONMENT_PASS_LINUX: GITHUB_WORKSPACE HOST_DEPENDENCIES ANDROID_SDK_ROOT ANDROID_HOME ANDROID_NDK_ROOT CIBW_ENVIRONMENT_PASS_MACOS: GITHUB_WORKSPACE HOST_DEPENDENCIES # Set HOST_DEPENDENCIES for use in build scripts HOST_DEPENDENCIES: ${{ join(matrix.package.host_dependencies, ' ') }} @@ -332,6 +354,28 @@ jobs: - uses: actions/checkout@v5 if: steps.check-skip.outputs.skip != 'true' + - name: Download Android SDK + if: steps.check-skip.outputs.skip != 'true' && runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y unzip cmake ninja-build gcc wget curl autoconf automake libtool pkg-config meson + wget -O ndk.zip https://dl.google.com/android/repository/android-ndk-r29-linux.zip + sudo mkdir -p /opt/Android/Sdk/ + sudo unzip ndk.zip -d /opt/Android/Sdk/ndk + rm ndk.zip + wget -O cmdline-tools.zip "https://dl.google.com/android/repository/commandlinetools-linux-14742923_latest.zip?hl=zh-cn" + sudo unzip cmdline-tools.zip -d /opt/Android/Sdk/cmdline-tools + rm cmdline-tools.zip + sudo mv /opt/Android/Sdk/cmdline-tools/cmdline-tools /opt/Android/Sdk/cmdline-tools/latest + sudo chown -R $USER:$USER /opt/Android/Sdk + sudo mkdir -p /opt/android-deps + sudo chown -R $USER:$USER /opt/android-deps + echo "ANDROID_SDK_ROOT=/opt/Android/Sdk" >> "$GITHUB_ENV" + echo "ANDROID_HOME=/opt/Android/Sdk" >> "$GITHUB_ENV" + echo "ANDROID_NDK_ROOT=/opt/Android/Sdk/ndk/android-ndk-r29" >> "$GITHUB_ENV" + echo "/opt/Android/Sdk/cmdline-tools/latest/bin" >> "$GITHUB_PATH" + echo "/opt/Android/Sdk/ndk/android-ndk-r29" >> "$GITHUB_PATH" + - name: Set up Python if: steps.check-skip.outputs.skip != 'true' @@ -474,7 +518,7 @@ jobs: CIBW_ARCHS: ${{ matrix.archs }} CIBW_BUILD: cp314-* # Pass through environment variables needed by build scripts - CIBW_ENVIRONMENT_PASS_LINUX: GITHUB_WORKSPACE HOST_DEPENDENCIES + CIBW_ENVIRONMENT_PASS_LINUX: GITHUB_WORKSPACE HOST_DEPENDENCIES ANDROID_SDK_ROOT ANDROID_HOME ANDROID_NDK_ROOT CIBW_ENVIRONMENT_PASS_MACOS: GITHUB_WORKSPACE HOST_DEPENDENCIES # Set HOST_DEPENDENCIES for use in build scripts HOST_DEPENDENCIES: ${{ join(matrix.package.host_dependencies, ' ') }} @@ -558,6 +602,28 @@ jobs: - uses: actions/checkout@v5 if: steps.check-skip.outputs.skip != 'true' + - name: Download Android SDK + if: steps.check-skip.outputs.skip != 'true' && runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y unzip cmake ninja-build gcc wget curl autoconf automake libtool pkg-config meson + wget -O ndk.zip https://dl.google.com/android/repository/android-ndk-r29-linux.zip + sudo mkdir -p /opt/Android/Sdk/ + sudo unzip ndk.zip -d /opt/Android/Sdk/ndk + rm ndk.zip + wget -O cmdline-tools.zip "https://dl.google.com/android/repository/commandlinetools-linux-14742923_latest.zip?hl=zh-cn" + sudo unzip cmdline-tools.zip -d /opt/Android/Sdk/cmdline-tools + rm cmdline-tools.zip + sudo mv /opt/Android/Sdk/cmdline-tools/cmdline-tools /opt/Android/Sdk/cmdline-tools/latest + sudo chown -R $USER:$USER /opt/Android/Sdk + sudo mkdir -p /opt/android-deps + sudo chown -R $USER:$USER /opt/android-deps + echo "ANDROID_SDK_ROOT=/opt/Android/Sdk" >> "$GITHUB_ENV" + echo "ANDROID_HOME=/opt/Android/Sdk" >> "$GITHUB_ENV" + echo "ANDROID_NDK_ROOT=/opt/Android/Sdk/ndk/android-ndk-r29" >> "$GITHUB_ENV" + echo "/opt/Android/Sdk/cmdline-tools/latest/bin" >> "$GITHUB_PATH" + echo "/opt/Android/Sdk/ndk/android-ndk-r29" >> "$GITHUB_PATH" + - name: Set up Python if: steps.check-skip.outputs.skip != 'true' @@ -721,7 +787,7 @@ jobs: CIBW_ARCHS: ${{ matrix.archs }} CIBW_BUILD: cp314-* # Pass through environment variables needed by build scripts - CIBW_ENVIRONMENT_PASS_LINUX: GITHUB_WORKSPACE HOST_DEPENDENCIES + CIBW_ENVIRONMENT_PASS_LINUX: GITHUB_WORKSPACE HOST_DEPENDENCIES ANDROID_SDK_ROOT ANDROID_HOME ANDROID_NDK_ROOT CIBW_ENVIRONMENT_PASS_MACOS: GITHUB_WORKSPACE HOST_DEPENDENCIES # Set HOST_DEPENDENCIES for use in build scripts HOST_DEPENDENCIES: ${{ join(matrix.package.host_dependencies, ' ') }} diff --git a/recipes/pillow/build_libjpeg.sh b/recipes/pillow/build_libjpeg.sh index fdc6b2a..1e6e363 100755 --- a/recipes/pillow/build_libjpeg.sh +++ b/recipes/pillow/build_libjpeg.sh @@ -101,7 +101,8 @@ if [ "$CIBW_PLATFORM" = "android" ]; then export LDFLAGS="--sysroot=$SYSROOT" # Configure and build libjpeg-turbo using CMake - INSTALL_DIR="/tmp/libjpeg-install-${ANDROID_ABI}" + INSTALL_DIR="/opt/android-deps/${ANDROID_ABI}" + mkdir -p "$INSTALL_DIR" BUILD_DIR="build-${ANDROID_ABI}" mkdir -p "$BUILD_DIR" cd "$BUILD_DIR" diff --git a/recipes/pillow/build_libtiff.sh b/recipes/pillow/build_libtiff.sh index 593dc90..b0fa41c 100755 --- a/recipes/pillow/build_libtiff.sh +++ b/recipes/pillow/build_libtiff.sh @@ -98,7 +98,7 @@ if [ "$CIBW_PLATFORM" = "android" ]; then export LDFLAGS="--sysroot=$SYSROOT" # Configure and build libtiff - INSTALL_DIR="/tmp/libtiff-install-${ANDROID_ABI}" + INSTALL_DIR="/opt/android-deps/${ANDROID_ABI}" mkdir -p "$INSTALL_DIR" # Clean previous build diff --git a/recipes/pillow/build_zlib.sh b/recipes/pillow/build_zlib.sh index 5c083c8..aab375a 100755 --- a/recipes/pillow/build_zlib.sh +++ b/recipes/pillow/build_zlib.sh @@ -94,7 +94,7 @@ if [ "$CIBW_PLATFORM" = "android" ]; then export LDFLAGS="--sysroot=$SYSROOT" # Configure and build zlib - INSTALL_DIR="/tmp/zlib-install-${ANDROID_ABI}" + INSTALL_DIR="/opt/android-deps/${ANDROID_ABI}" mkdir -p "$INSTALL_DIR" # Clean previous build diff --git a/recipes/pillow/patches/cross_compile_libs_detect.patch b/recipes/pillow/patches/cross_compile_libs_detect.patch index 73a8d2e..8aa1715 100644 --- a/recipes/pillow/patches/cross_compile_libs_detect.patch +++ b/recipes/pillow/patches/cross_compile_libs_detect.patch @@ -8,7 +8,7 @@ import re import shutil import struct -@@ -688,10 +689,56 @@ +@@ -688,10 +689,37 @@ _add_directory(library_dirs, "/usr/local/lib") _add_directory(include_dirs, "/usr/local/include") @@ -16,52 +16,26 @@ - _add_directory(include_dirs, "/usr/include") - # alpine, at least - _add_directory(library_dirs, "/lib") -+ # For cross-compilation: Auto-detect cross-compiled libraries in /tmp -+ # This handles zlib, libjpeg, and libtiff built by our build scripts ++ # For cross-compilation: Auto-detect cross-compiled libraries in /opt/android-deps ++ # All dependent libraries (zlib, libjpeg-turbo, libtiff, etc.) are installed ++ # per-ABI under /opt/android-deps/${ABI}/ + is_cross_compiling = False -+ -+ zlib_dirs = glob.glob('/tmp/zlib-install-*/include') -+ if zlib_dirs: -+ is_cross_compiling = True -+ include_dir = zlib_dirs[0] -+ lib_dir = include_dir.replace('/include', '/lib') -+ print(f"Found cross-compiled zlib:") -+ print(f" Include: {include_dir}") -+ print(f" Lib: {lib_dir}") -+ if os.path.exists(lib_dir): -+ _add_directory(library_dirs, lib_dir) -+ _add_directory(include_dirs, include_dir) -+ print(" Added to build paths") -+ -+ libjpeg_dirs = glob.glob('/tmp/libjpeg-install-*/include') -+ if libjpeg_dirs: -+ is_cross_compiling = True -+ include_dir = libjpeg_dirs[0] -+ lib_dir = include_dir.replace('/include', '/lib') -+ print(f"Found cross-compiled libjpeg:") -+ print(f" Include: {include_dir}") -+ print(f" Lib: {lib_dir}") -+ if os.path.exists(lib_dir): -+ _add_directory(library_dirs, lib_dir) -+ _add_directory(include_dirs, include_dir) -+ print(" Added to build paths") -+ -+ libtiff_dirs = glob.glob('/tmp/libtiff-install-*/include') -+ if libtiff_dirs: ++ ++ android_deps_dirs = glob.glob('/opt/android-deps/*/include') ++ if android_deps_dirs: + is_cross_compiling = True -+ include_dir = libtiff_dirs[0] -+ lib_dir = include_dir.replace('/include', '/lib') -+ print(f"Found cross-compiled libtiff:") -+ print(f" Include: {include_dir}") -+ print(f" Lib: {lib_dir}") -+ if os.path.exists(lib_dir): -+ _add_directory(library_dirs, lib_dir) -+ _add_directory(include_dirs, include_dir) -+ print(" Added to build paths") -+ ++ for include_dir in android_deps_dirs: ++ lib_dir = include_dir.replace('/include', '/lib') ++ print(f"Found cross-compiled Android deps:") ++ print(f" Include: {include_dir}") ++ print(f" Lib: {lib_dir}") ++ if os.path.exists(lib_dir): ++ _add_directory(library_dirs, lib_dir) ++ _add_directory(include_dirs, include_dir) ++ print(" Added to build paths") ++ + # Skip host system paths when cross-compiling to avoid header conflicts + if not is_cross_compiling: -+ + _add_directory(library_dirs, "/usr/lib") + _add_directory(include_dirs, "/usr/include") + # alpine, at least diff --git a/scripts/setup_cross_compile_env.sh b/scripts/setup_cross_compile_env.sh index 6a07184..8fdb6b4 100755 --- a/scripts/setup_cross_compile_env.sh +++ b/scripts/setup_cross_compile_env.sh @@ -10,6 +10,7 @@ echo "Setting up cross-compilation environment for host dependencies..." find_library_install() { local lib_name=$1 local search_patterns=( + "/opt/android-deps/*" "/tmp/${lib_name}-install-*" "/tmp/${lib_name}-*" "$HOME/.local/${lib_name}"