Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Correct Pillow builds on x86 #65

Merged
merged 8 commits into from
Sep 25, 2024
64 changes: 53 additions & 11 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,23 @@ jobs:
test:
name: Test builds
needs: pre-commit
runs-on: macOS-latest
runs-on: ${{ matrix.runs-on }}
strategy:
fail-fast: false
matrix:
python-version: [ "3.9", "3.10", "3.11", "3.12", "3.13-dev" ]
python-version: [ "3.9", "3.10", "3.11", "3.12", "3.13" ]
runs-on: [ "macos-latest", "macos-12" ]

exclude:
# Don't need to run x86 tests on every Python version
- python-version: "3.9"
runs-on: "macos-12"
- python-version: "3.10"
runs-on: "macos-12"
- python-version: "3.11"
runs-on: "macos-12"
- python-version: "3.13"
runs-on: "macos-12"

steps:
- name: Checkout
Expand All @@ -43,30 +55,60 @@ jobs:
- name: Set up Python
uses: actions/[email protected]
with:
python-version: ${{ matrix.python-version }}
# -dev suffix is a no-op for published releases
python-version: ${{ matrix.python-version }}-dev

# Initial call to the setup script sets up the environment
- name: Set up Forge
run: |
source ./setup-iOS.sh $(cut -d- -f1 <<< ${{ matrix.python-version }})
source ./setup-iOS.sh ${{ matrix.python-version }}

# Build packages that are pre-build dependencies
# Calling setup script activates existing environment
- name: Build bzip2
run: |
source ./setup-iOS.sh ${{ matrix.python-version }}
forge iOS bzip2 -vv

- name: Build ninja
run: |
source ./setup-iOS.sh ${{ matrix.python-version }}
forge iOS ninja -vv

# Build an example of a native package
# Build examples of native packages
# Calling setup script activates existing environment
- name: Build libjpeg
run: |
source ./setup-iOS.sh $(cut -d- -f1 <<< ${{ matrix.python-version }})
forge iOS libjpeg
source ./setup-iOS.sh ${{ matrix.python-version }}
forge iOS libjpeg -vv

- name: Build freetype
run: |
source ./setup-iOS.sh ${{ matrix.python-version }}
forge iOS freetype -vv

# Build an example of a simple Python package
# Calling setup script activates existing environment
- name: Build lru-dict
run: |
source ./setup-iOS.sh $(cut -d- -f1 <<< ${{ matrix.python-version }})
forge iOS lru-dict
source ./setup-iOS.sh ${{ matrix.python-version }}
forge iOS lru-dict -vv

# Build a package with dependencies on other packages
- name: Build pillow
run: |
source ./setup-iOS.sh ${{ matrix.python-version }}
forge iOS pillow -vv

# Build a package with a complex build system
- name: Build numpy
run: |
source ./setup-iOS.sh ${{ matrix.python-version }}
forge iOS numpy -vv

# Build an example of a simple Python package using C++
# Calling setup script activates existing environment
- name: Build brotli
run: |
source ./setup-iOS.sh $(cut -d- -f1 <<< ${{ matrix.python-version }})
forge iOS brotli
source ./setup-iOS.sh ${{ matrix.python-version }}
forge iOS brotli -vv
4 changes: 2 additions & 2 deletions recipes/numpy/patches/mobile-1.26.0.patch
Original file line number Diff line number Diff line change
Expand Up @@ -149,13 +149,13 @@ diff -ru numpy-1.26.0-orig/vendored-meson/meson-python/mesonpy/__init__.py numpy
self._meson_cross_file.write_text(cross_file_data)
self._meson_args['setup'].extend(('--cross-file', os.fspath(self._meson_cross_file)))
+ elif sysconfig_platform.startswith("ios-"):
+ arch = sysconfig_platform.split("-")[-1]
+ arch = sysconfig_platform.split("-")[-2]
+ family = "aarch64" if arch == "arm64" else arch
+ cross_file_data = textwrap.dedent(
+ f"""
+ [binaries]
+ c = [{sysconfig.get_config_var("CC")!r}]
+ cpp = [{sysconfig.get_config_var("CC")!r}]
+ cpp = [{sysconfig.get_config_var("CXX")!r}]
+
+ [host_machine]
+ system = 'ios'
Expand Down
2 changes: 2 additions & 0 deletions recipes/pillow/meta.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ build:
# libfreetype references both libz and libbz2
# but doesn't link them into the static library
- LDFLAGS=-lz -lbz2
config:
- debug=true

requirements:
host:
Expand Down
27 changes: 22 additions & 5 deletions recipes/pillow/patches/setup-9.4.0.patch
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
Common subdirectories: Pillow-9.4.0-orig/Tests and Pillow-9.4.0/Tests
Common subdirectories: Pillow-9.4.0-orig/__pycache__ and Pillow-9.4.0/__pycache__
Common subdirectories: Pillow-9.4.0-orig/depends and Pillow-9.4.0/depends
Common subdirectories: Pillow-9.4.0-orig/docs and Pillow-9.4.0/docs
diff -u Pillow-9.4.0-orig/setup.py Pillow-9.4.0/setup.py
--- Pillow-9.4.0-orig/setup.py 2023-01-02 08:17:32
+++ Pillow-9.4.0/setup.py 2023-09-21 10:16:17
@@ -408,10 +408,19 @@
--- Pillow-9.4.0-orig/setup.py 2023-01-01 16:17:32
+++ Pillow-9.4.0/setup.py 2024-09-25 11:17:51
@@ -408,10 +408,22 @@
self.extensions.remove(extension)
break

Expand All @@ -19,14 +20,17 @@ diff -u Pillow-9.4.0-orig/setup.py Pillow-9.4.0/setup.py
+ ("watchos", False): ["--sdk", "watchos"],
+ ("watchos", True): ["--sdk", "watchsimulator"],
+ ("darwin", False): [],
+ }[sys.platform, getattr(sys.implementation, "_multiarch", "").endswith("simulator")]
+ }[
+ sys.platform,
+ getattr(sys.implementation, "_multiarch", "").endswith("simulator"),
+ ]
sdk_path = (
- subprocess.check_output(["xcrun", "--show-sdk-path"])
+ subprocess.check_output(["xcrun", "--show-sdk-path"] + sdk)
.strip()
.decode("latin1")
)
@@ -556,10 +564,15 @@
@@ -556,10 +568,15 @@
_add_directory(library_dirs, "/usr/X11/lib")
_add_directory(include_dirs, "/usr/X11/include")

Expand All @@ -43,3 +47,16 @@ diff -u Pillow-9.4.0-orig/setup.py Pillow-9.4.0/setup.py
elif (
sys.platform.startswith("linux")
or sys.platform.startswith("gnu")
@@ -593,7 +610,9 @@
# FIXME: check /opt/stuff directories here?

# standard locations
- if not self.disable_platform_guessing:
+ if not (
+ self.disable_platform_guessing or sys.platform in {"ios", "tvos", "watchos"}
+ ):
_add_directory(library_dirs, "/usr/local/lib")
_add_directory(include_dirs, "/usr/local/include")

Common subdirectories: Pillow-9.4.0-orig/src and Pillow-9.4.0/src
Common subdirectories: Pillow-9.4.0-orig/winbuild and Pillow-9.4.0/winbuild
24 changes: 21 additions & 3 deletions recipes/pillow/patches/setup.patch
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
diff -ur pillow-10.4.0-orig/setup.py pillow-10.4.0/setup.py
--- pillow-10.4.0-orig/setup.py 2024-07-01 14:02:01
+++ pillow-10.4.0/setup.py 2024-09-05 14:20:16
Common subdirectories: pillow-10.4.0-orig/Tests and pillow-10.4.0/Tests
Common subdirectories: pillow-10.4.0-orig/_custom_build and pillow-10.4.0/_custom_build
Common subdirectories: pillow-10.4.0-orig/depends and pillow-10.4.0/depends
Common subdirectories: pillow-10.4.0-orig/docs and pillow-10.4.0/docs
diff -u pillow-10.4.0-orig/setup.py pillow-10.4.0/setup.py
--- pillow-10.4.0-orig/setup.py 2024-06-30 23:02:01
+++ pillow-10.4.0/setup.py 2024-09-25 11:15:21
@@ -422,10 +422,22 @@
self.extensions.remove(extension)
break
Expand Down Expand Up @@ -46,3 +50,17 @@ diff -ur pillow-10.4.0-orig/setup.py pillow-10.4.0/setup.py
elif (
sys.platform.startswith("linux")
or sys.platform.startswith("gnu")
@@ -618,7 +635,10 @@
# FIXME: check /opt/stuff directories here?

# standard locations
- if not self.disable_platform_guessing:
+ # The standard locations aren't standard on iOS et al.
+ if not (
+ self.disable_platform_guessing or sys.platform in {"ios", "tvos", "watchos"}
+ ):
_add_directory(library_dirs, "/usr/local/lib")
_add_directory(include_dirs, "/usr/local/include")

Common subdirectories: pillow-10.4.0-orig/src and pillow-10.4.0/src
Common subdirectories: pillow-10.4.0-orig/winbuild and pillow-10.4.0/winbuild
11 changes: 10 additions & 1 deletion src/forge/build.py
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,7 @@ def compile_env(self, **kwargs) -> dict[str:str]:
ar = sysconfig_data["AR"]

cc = sysconfig_data["CC"]
cxx = sysconfig_data["CXX"]

cflags = self.cross_venv.sysconfig_data["CFLAGS"]

Expand Down Expand Up @@ -258,7 +259,9 @@ def compile_env(self, **kwargs) -> dict[str:str]:
env = {
"AR": ar,
"CC": cc,
"CXX": cxx,
"CFLAGS": cflags,
"CXXFLAGS": cflags,
"LDFLAGS": ldflags,
"INSTALL_ROOT": str(self.cross_venv.install_root),
}
Expand Down Expand Up @@ -560,6 +563,10 @@ def _build(self):
else:
output_dir = str(Path.cwd() / "dist")

config_args = []
for config in self.package.meta["build"]["config"]:
config_args.extend(["-C", config])

self.cross_venv.run(
self.log_file,
[
Expand All @@ -570,7 +577,9 @@ def _build(self):
"--wheel",
"--outdir",
output_dir,
],
"-v",
]
+ config_args,
cwd=self.build_path,
env=self.compile_env(**script_env),
)
5 changes: 5 additions & 0 deletions src/forge/schema/meta-schema.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,11 @@ properties:
default: []
items:
type: string
config: # Config arguments to pass to python -m build in the form -C value
type: array
default: []
items:
type: string
additionalProperties: false

requirements:
Expand Down