mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-02-04 21:50:54 +03:00
Merge pull request #8500 from nulano/zlib-ng
Use zlib-ng instead of zlib
This commit is contained in:
commit
a7338f8ce7
18
.github/workflows/wheels-dependencies.sh
vendored
18
.github/workflows/wheels-dependencies.sh
vendored
|
@ -50,11 +50,7 @@ if [[ -n "$IS_MACOS" ]]; then
|
||||||
else
|
else
|
||||||
GIFLIB_VERSION=5.2.1
|
GIFLIB_VERSION=5.2.1
|
||||||
fi
|
fi
|
||||||
if [[ -n "$IS_MACOS" ]] || [[ "$MB_ML_VER" != 2014 ]]; then
|
ZLIB_NG_VERSION=2.2.2
|
||||||
ZLIB_VERSION=1.3.1
|
|
||||||
else
|
|
||||||
ZLIB_VERSION=1.2.8
|
|
||||||
fi
|
|
||||||
LIBWEBP_VERSION=1.4.0
|
LIBWEBP_VERSION=1.4.0
|
||||||
BZIP2_VERSION=1.0.8
|
BZIP2_VERSION=1.0.8
|
||||||
LIBXCB_VERSION=1.17.0
|
LIBXCB_VERSION=1.17.0
|
||||||
|
@ -74,6 +70,16 @@ function build_pkg_config {
|
||||||
touch pkg-config-stamp
|
touch pkg-config-stamp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function build_zlib_ng {
|
||||||
|
if [ -e zlib-stamp ]; then return; fi
|
||||||
|
fetch_unpack https://github.com/zlib-ng/zlib-ng/archive/$ZLIB_NG_VERSION.tar.gz zlib-ng-$ZLIB_NG_VERSION.tar.gz
|
||||||
|
(cd zlib-ng-$ZLIB_NG_VERSION \
|
||||||
|
&& ./configure --prefix=$BUILD_PREFIX --zlib-compat \
|
||||||
|
&& make -j4 \
|
||||||
|
&& make install)
|
||||||
|
touch zlib-stamp
|
||||||
|
}
|
||||||
|
|
||||||
function build_brotli {
|
function build_brotli {
|
||||||
if [ -e brotli-stamp ]; then return; fi
|
if [ -e brotli-stamp ]; then return; fi
|
||||||
local out_dir=$(fetch_unpack https://github.com/google/brotli/archive/v$BROTLI_VERSION.tar.gz brotli-$BROTLI_VERSION.tar.gz)
|
local out_dir=$(fetch_unpack https://github.com/google/brotli/archive/v$BROTLI_VERSION.tar.gz brotli-$BROTLI_VERSION.tar.gz)
|
||||||
|
@ -100,7 +106,7 @@ function build {
|
||||||
if [ -z "$IS_ALPINE" ] && [ -z "$IS_MACOS" ]; then
|
if [ -z "$IS_ALPINE" ] && [ -z "$IS_MACOS" ]; then
|
||||||
yum remove -y zlib-devel
|
yum remove -y zlib-devel
|
||||||
fi
|
fi
|
||||||
build_new_zlib
|
build_zlib_ng
|
||||||
|
|
||||||
build_simple xcb-proto 1.17.0 https://xorg.freedesktop.org/archive/individual/proto
|
build_simple xcb-proto 1.17.0 https://xorg.freedesktop.org/archive/individual/proto
|
||||||
if [ -n "$IS_MACOS" ]; then
|
if [ -n "$IS_MACOS" ]; then
|
||||||
|
|
|
@ -34,6 +34,7 @@ def test_wheel_features() -> None:
|
||||||
"fribidi",
|
"fribidi",
|
||||||
"harfbuzz",
|
"harfbuzz",
|
||||||
"libjpeg_turbo",
|
"libjpeg_turbo",
|
||||||
|
"zlib_ng",
|
||||||
"xcb",
|
"xcb",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,9 +36,10 @@ def test_version() -> None:
|
||||||
else:
|
else:
|
||||||
assert function(name) == version
|
assert function(name) == version
|
||||||
if name != "PIL":
|
if name != "PIL":
|
||||||
if name == "zlib" and version is not None:
|
if version is not None:
|
||||||
|
if name == "zlib" and features.check_feature("zlib_ng"):
|
||||||
version = re.sub(".zlib-ng$", "", version)
|
version = re.sub(".zlib-ng$", "", version)
|
||||||
elif name == "libtiff" and version is not None:
|
elif name == "libtiff":
|
||||||
version = re.sub("t$", "", version)
|
version = re.sub("t$", "", version)
|
||||||
assert version is None or re.search(r"\d+(\.\d+)*$", version)
|
assert version is None or re.search(r"\d+(\.\d+)*$", version)
|
||||||
|
|
||||||
|
|
|
@ -54,6 +54,7 @@ Feature version numbers are available only where stated.
|
||||||
Support for the following features can be checked:
|
Support for the following features can be checked:
|
||||||
|
|
||||||
* ``libjpeg_turbo``: (compile time) Whether Pillow was compiled against the libjpeg-turbo version of libjpeg. Compile-time version number is available.
|
* ``libjpeg_turbo``: (compile time) Whether Pillow was compiled against the libjpeg-turbo version of libjpeg. Compile-time version number is available.
|
||||||
|
* ``zlib_ng``: (compile time) Whether Pillow was compiled against the zlib-ng version of zlib. Compile-time version number is available.
|
||||||
* ``raqm``: Raqm library, required for ``ImageFont.Layout.RAQM`` in :py:func:`PIL.ImageFont.truetype`. Run-time version number is available for Raqm 0.7.0 or newer.
|
* ``raqm``: Raqm library, required for ``ImageFont.Layout.RAQM`` in :py:func:`PIL.ImageFont.truetype`. Run-time version number is available for Raqm 0.7.0 or newer.
|
||||||
* ``libimagequant``: (compile time) ImageQuant quantization support in :py:func:`PIL.Image.Image.quantize`. Run-time version number is available.
|
* ``libimagequant``: (compile time) ImageQuant quantization support in :py:func:`PIL.Image.Image.quantize`. Run-time version number is available.
|
||||||
* ``xcb``: (compile time) Support for X11 in :py:func:`PIL.ImageGrab.grab` via the XCB library.
|
* ``xcb``: (compile time) Support for X11 in :py:func:`PIL.ImageGrab.grab` via the XCB library.
|
||||||
|
|
|
@ -104,6 +104,7 @@ test-extras = "tests"
|
||||||
|
|
||||||
[tool.cibuildwheel.macos.environment]
|
[tool.cibuildwheel.macos.environment]
|
||||||
PATH = "$(pwd)/build/deps/darwin/bin:$(dirname $(which python3)):/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin"
|
PATH = "$(pwd)/build/deps/darwin/bin:$(dirname $(which python3)):/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin"
|
||||||
|
DYLD_LIBRARY_PATH = "$(pwd)/build/deps/darwin/lib"
|
||||||
|
|
||||||
[tool.black]
|
[tool.black]
|
||||||
exclude = "wheels/multibuild"
|
exclude = "wheels/multibuild"
|
||||||
|
|
|
@ -127,6 +127,7 @@ features: dict[str, tuple[str, str | bool, str | None]] = {
|
||||||
"fribidi": ("PIL._imagingft", "HAVE_FRIBIDI", "fribidi_version"),
|
"fribidi": ("PIL._imagingft", "HAVE_FRIBIDI", "fribidi_version"),
|
||||||
"harfbuzz": ("PIL._imagingft", "HAVE_HARFBUZZ", "harfbuzz_version"),
|
"harfbuzz": ("PIL._imagingft", "HAVE_HARFBUZZ", "harfbuzz_version"),
|
||||||
"libjpeg_turbo": ("PIL._imaging", "HAVE_LIBJPEGTURBO", "libjpeg_turbo_version"),
|
"libjpeg_turbo": ("PIL._imaging", "HAVE_LIBJPEGTURBO", "libjpeg_turbo_version"),
|
||||||
|
"zlib_ng": ("PIL._imaging", "HAVE_ZLIBNG", "zlib_ng_version"),
|
||||||
"libimagequant": ("PIL._imaging", "HAVE_LIBIMAGEQUANT", "imagequant_version"),
|
"libimagequant": ("PIL._imaging", "HAVE_LIBIMAGEQUANT", "imagequant_version"),
|
||||||
"xcb": ("PIL._imaging", "HAVE_XCB", None),
|
"xcb": ("PIL._imaging", "HAVE_XCB", None),
|
||||||
}
|
}
|
||||||
|
@ -308,7 +309,11 @@ def pilinfo(out: IO[str] | None = None, supported_formats: bool = True) -> None:
|
||||||
# this check is also in src/_imagingcms.c:setup_module()
|
# this check is also in src/_imagingcms.c:setup_module()
|
||||||
version_static = tuple(int(x) for x in v.split(".")) < (2, 7)
|
version_static = tuple(int(x) for x in v.split(".")) < (2, 7)
|
||||||
t = "compiled for" if version_static else "loaded"
|
t = "compiled for" if version_static else "loaded"
|
||||||
if name == "raqm":
|
if name == "zlib":
|
||||||
|
zlib_ng_version = version_feature("zlib_ng")
|
||||||
|
if zlib_ng_version is not None:
|
||||||
|
v += ", compiled for zlib-ng " + zlib_ng_version
|
||||||
|
elif name == "raqm":
|
||||||
for f in ("fribidi", "harfbuzz"):
|
for f in ("fribidi", "harfbuzz"):
|
||||||
v2 = version_feature(f)
|
v2 = version_feature(f)
|
||||||
if v2 is not None:
|
if v2 is not None:
|
||||||
|
|
|
@ -4397,6 +4397,20 @@ setup_module(PyObject *m) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
PyObject *have_zlibng;
|
||||||
|
#ifdef ZLIBNG_VERSION
|
||||||
|
have_zlibng = Py_True;
|
||||||
|
{
|
||||||
|
PyObject *v = PyUnicode_FromString(ZLIBNG_VERSION);
|
||||||
|
PyDict_SetItemString(d, "zlib_ng_version", v ? v : Py_None);
|
||||||
|
Py_XDECREF(v);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
have_zlibng = Py_False;
|
||||||
|
#endif
|
||||||
|
Py_INCREF(have_zlibng);
|
||||||
|
PyModule_AddObject(m, "HAVE_ZLIBNG", have_zlibng);
|
||||||
|
|
||||||
#ifdef HAVE_LIBTIFF
|
#ifdef HAVE_LIBTIFF
|
||||||
{
|
{
|
||||||
extern const char *ImagingTiffVersion(void);
|
extern const char *ImagingTiffVersion(void);
|
||||||
|
|
|
@ -120,11 +120,10 @@ V = {
|
||||||
"OPENJPEG": "2.5.3",
|
"OPENJPEG": "2.5.3",
|
||||||
"TIFF": "4.6.0",
|
"TIFF": "4.6.0",
|
||||||
"XZ": "5.6.3",
|
"XZ": "5.6.3",
|
||||||
"ZLIB": "1.3.1",
|
"ZLIBNG": "2.2.2",
|
||||||
}
|
}
|
||||||
V["LIBPNG_DOTLESS"] = V["LIBPNG"].replace(".", "")
|
V["LIBPNG_DOTLESS"] = V["LIBPNG"].replace(".", "")
|
||||||
V["LIBPNG_XY"] = "".join(V["LIBPNG"].split(".")[:2])
|
V["LIBPNG_XY"] = "".join(V["LIBPNG"].split(".")[:2])
|
||||||
V["ZLIB_DOTLESS"] = V["ZLIB"].replace(".", "")
|
|
||||||
|
|
||||||
|
|
||||||
# dependencies, listed in order of compilation
|
# dependencies, listed in order of compilation
|
||||||
|
@ -160,18 +159,22 @@ DEPS: dict[str, dict[str, Any]] = {
|
||||||
"bins": ["cjpeg.exe", "djpeg.exe"],
|
"bins": ["cjpeg.exe", "djpeg.exe"],
|
||||||
},
|
},
|
||||||
"zlib": {
|
"zlib": {
|
||||||
"url": "https://zlib.net/FILENAME",
|
"url": f"https://github.com/zlib-ng/zlib-ng/archive/refs/tags/{V['ZLIBNG']}.zip",
|
||||||
"filename": f"zlib{V['ZLIB_DOTLESS']}.zip",
|
"filename": f"zlib-ng-{V['ZLIBNG']}.zip",
|
||||||
"dir": f"zlib-{V['ZLIB']}",
|
"dir": f"zlib-ng-{V['ZLIBNG']}",
|
||||||
"license": "README",
|
"license": "LICENSE.md",
|
||||||
"license_pattern": "Copyright notice:\n\n(.+)$",
|
"patch": {
|
||||||
|
r"CMakeLists.txt": {
|
||||||
|
"set_target_properties(zlib PROPERTIES OUTPUT_NAME zlibstatic${{SUFFIX}})": "set_target_properties(zlib PROPERTIES OUTPUT_NAME zlib)", # noqa: E501
|
||||||
|
},
|
||||||
|
},
|
||||||
"build": [
|
"build": [
|
||||||
cmd_nmake(r"win32\Makefile.msc", "clean"),
|
*cmds_cmake(
|
||||||
cmd_nmake(r"win32\Makefile.msc", "zlib.lib"),
|
"zlib", "-DBUILD_SHARED_LIBS:BOOL=OFF", "-DZLIB_COMPAT:BOOL=ON"
|
||||||
cmd_copy("zlib.lib", "z.lib"),
|
),
|
||||||
],
|
],
|
||||||
"headers": [r"z*.h"],
|
"headers": [r"z*.h"],
|
||||||
"libs": [r"*.lib"],
|
"libs": [r"zlib.lib"],
|
||||||
},
|
},
|
||||||
"xz": {
|
"xz": {
|
||||||
"url": f"https://github.com/tukaani-project/xz/releases/download/v{V['XZ']}/FILENAME",
|
"url": f"https://github.com/tukaani-project/xz/releases/download/v{V['XZ']}/FILENAME",
|
||||||
|
|
Loading…
Reference in New Issue
Block a user