Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 69 additions & 3 deletions .github/workflows/wheels.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down Expand Up @@ -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, ' ') }}
Expand Down Expand Up @@ -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'
Expand Down Expand Up @@ -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, ' ') }}
Expand Down Expand Up @@ -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'
Expand Down Expand Up @@ -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, ' ') }}
Expand Down
3 changes: 2 additions & 1 deletion recipes/pillow/build_libjpeg.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
2 changes: 1 addition & 1 deletion recipes/pillow/build_libtiff.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion recipes/pillow/build_zlib.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
60 changes: 17 additions & 43 deletions recipes/pillow/patches/cross_compile_libs_detect.patch
Original file line number Diff line number Diff line change
Expand Up @@ -8,60 +8,34 @@
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")

- _add_directory(library_dirs, "/usr/lib")
- _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
Expand Down
1 change: 1 addition & 0 deletions scripts/setup_cross_compile_env.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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}"
Expand Down