forked from gentoo/gentoo
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
dev-python/pillow: Fix cross-compiling (again)
Upstream isn't merging my patch in a hurry so apply here. Signed-off-by: James Le Cuirot <[email protected]>
- Loading branch information
Showing
2 changed files
with
193 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
From 774d7a570d9f76903de3c3267512b8a7d252c21e Mon Sep 17 00:00:00 2001 | ||
From: James Le Cuirot <[email protected]> | ||
Date: Fri, 22 Dec 2023 22:38:27 +0000 | ||
Subject: [PATCH] Fix cross-compiling by searching the right lib and include | ||
directories | ||
|
||
We were previously searching the `{sys.prefix}/lib` and | ||
`{sys.prefix}/include` directories unconditionally. This is problematic | ||
when cross-compiling, as it does not take account of any sysroot where | ||
alternative libraries and headers are located. Adding `-I/usr/include` | ||
causes the build to explode, at least when cross-compiling from 64-bit | ||
to 32-bit. | ||
|
||
Python does not officially support cross-compiling, but Gentoo achieves | ||
this by modifying the sysconfig variables like `LIBDIR` and `INCLUDEDIR` | ||
with great results. | ||
|
||
Assuming "lib" is bad. 64-bit Linux systems often use lib64, putting | ||
32-bit libraries under lib. You cannot assume that either though, as | ||
pure 64-bit Linux systems may just use lib instead. Things get even | ||
stranger on RISC-V. | ||
|
||
The value of `sys.prefix` changes when using a virtualenv. Dependencies | ||
may be installed here, so it does make sense to continue supporting this | ||
case, even if it is incompatible with cross-compiling. Unlike regular | ||
environments, "lib" is generally used for libraries, although a lib64 | ||
symlink may also be present. | ||
--- | ||
setup.py | 13 +++++++++++-- | ||
1 file changed, 11 insertions(+), 2 deletions(-) | ||
|
||
diff --git a/setup.py b/setup.py | ||
index 1bf0bcff558..07163d001fc 100755 | ||
--- a/setup.py | ||
+++ b/setup.py | ||
@@ -15,6 +15,7 @@ | ||
import struct | ||
import subprocess | ||
import sys | ||
+import sysconfig | ||
import warnings | ||
|
||
from setuptools import Extension, setup | ||
@@ -504,8 +505,16 @@ def build_extensions(self): | ||
for d in os.environ[k].split(os.path.pathsep): | ||
_add_directory(library_dirs, d) | ||
|
||
- _add_directory(library_dirs, os.path.join(sys.prefix, "lib")) | ||
- _add_directory(include_dirs, os.path.join(sys.prefix, "include")) | ||
+ _add_directory( | ||
+ library_dirs, | ||
+ (sys.prefix == sys.base_prefix and sysconfig.get_config_var("LIBDIR")) | ||
+ or os.path.join(sys.prefix, "lib"), | ||
+ ) | ||
+ _add_directory( | ||
+ include_dirs, | ||
+ (sys.prefix == sys.base_prefix and sysconfig.get_config_var("INCLUDEDIR")) | ||
+ or os.path.join(sys.prefix, "include"), | ||
+ ) | ||
|
||
# | ||
# add platform directories |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,131 @@ | ||
# Copyright 1999-2024 Gentoo Authors | ||
# Distributed under the terms of the GNU General Public License v2 | ||
|
||
EAPI=8 | ||
|
||
DISTUTILS_EXT=1 | ||
# setuptools wrapper | ||
DISTUTILS_USE_PEP517=standalone | ||
PYTHON_COMPAT=( python3_{10..12} pypy3 ) | ||
PYTHON_REQ_USE='tk?,threads(+)' | ||
|
||
inherit distutils-r1 toolchain-funcs virtualx | ||
|
||
MY_PN=Pillow | ||
MY_P=${MY_PN}-${PV} | ||
|
||
DESCRIPTION="Python Imaging Library (fork)" | ||
HOMEPAGE=" | ||
https://python-pillow.org/ | ||
https://github.com/python-pillow/Pillow/ | ||
https://pypi.org/project/pillow/ | ||
" | ||
SRC_URI=" | ||
https://github.com/python-pillow/Pillow/archive/${PV}.tar.gz | ||
-> ${P}.gh.tar.gz | ||
" | ||
S="${WORKDIR}/${MY_P}" | ||
|
||
LICENSE="HPND" | ||
SLOT="0" | ||
KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~m68k ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~amd64-linux ~x86-linux ~arm64-macos ~x64-macos" | ||
IUSE="examples imagequant +jpeg jpeg2k lcms test tiff tk truetype webp xcb zlib" | ||
REQUIRED_USE="test? ( jpeg jpeg2k lcms tiff truetype )" | ||
RESTRICT="!test? ( test )" | ||
|
||
DEPEND=" | ||
imagequant? ( media-gfx/libimagequant:= ) | ||
jpeg? ( media-libs/libjpeg-turbo:= ) | ||
jpeg2k? ( media-libs/openjpeg:2= ) | ||
lcms? ( media-libs/lcms:2= ) | ||
tiff? ( media-libs/tiff:=[jpeg,zlib] ) | ||
truetype? ( media-libs/freetype:2= ) | ||
webp? ( media-libs/libwebp:= ) | ||
xcb? ( x11-libs/libxcb ) | ||
zlib? ( sys-libs/zlib:= ) | ||
" | ||
RDEPEND=" | ||
${DEPEND} | ||
dev-python/olefile[${PYTHON_USEDEP}] | ||
" | ||
BDEPEND=" | ||
dev-python/setuptools[${PYTHON_USEDEP}] | ||
dev-python/wheel[${PYTHON_USEDEP}] | ||
virtual/pkgconfig | ||
test? ( | ||
${RDEPEND} | ||
dev-python/defusedxml[${PYTHON_USEDEP}] | ||
dev-python/packaging[${PYTHON_USEDEP}] | ||
dev-python/pytest[${PYTHON_USEDEP}] | ||
dev-python/pytest-timeout[${PYTHON_USEDEP}] | ||
|| ( | ||
media-gfx/imagemagick[png] | ||
media-gfx/graphicsmagick[png] | ||
) | ||
) | ||
" | ||
|
||
EPYTEST_DESELECT=( | ||
# TODO; incompatible Qt version? | ||
Tests/test_qt_image_qapplication.py::test_sanity | ||
) | ||
|
||
PATCHES=( | ||
# https://github.com/python-pillow/pillow/pull/7634 | ||
"${FILESDIR}/${P}-cross.patch" | ||
) | ||
|
||
usepil() { | ||
usex "${1}" enable disable | ||
} | ||
|
||
python_configure_all() { | ||
# It's important that these flags are also passed during the install phase | ||
# as well. Make sure of that if you change the lines below. See bug 661308. | ||
cat >> setup.cfg <<-EOF || die | ||
[build_ext] | ||
disable_platform_guessing = True | ||
$(usepil truetype)_freetype = True | ||
$(usepil jpeg)_jpeg = True | ||
$(usepil jpeg2k)_jpeg2000 = True | ||
$(usepil lcms)_lcms = True | ||
$(usepil tiff)_tiff = True | ||
$(usepil imagequant)_imagequant = True | ||
$(usepil webp)_webp = True | ||
$(usepil webp)_webpmux = True | ||
$(usepil xcb)_xcb = True | ||
$(usepil zlib)_zlib = True | ||
EOF | ||
|
||
# We have patched in this env var. | ||
tc-export PKG_CONFIG | ||
} | ||
|
||
src_test() { | ||
virtx distutils-r1_src_test | ||
} | ||
|
||
python_test() { | ||
local EPYTEST_DESELECT=( | ||
# TODO (is clipboard unreliable in Xvfb?) | ||
Tests/test_imagegrab.py::TestImageGrab::test_grabclipboard | ||
) | ||
|
||
"${EPYTHON}" selftest.py --installed || die "selftest failed with ${EPYTHON}" | ||
# no:relaxed: pytest-relaxed plugin make our tests fail. deactivate if installed | ||
epytest -p no:relaxed || die "Tests failed with ${EPYTHON}" | ||
} | ||
|
||
python_install() { | ||
python_doheader src/libImaging/*.h | ||
distutils-r1_python_install | ||
} | ||
|
||
python_install_all() { | ||
if use examples ; then | ||
docinto example | ||
dodoc docs/example/* | ||
docompress -x /usr/share/doc/${PF}/example | ||
fi | ||
distutils-r1_python_install_all | ||
} |