Repository: python-pillow/Pillow

Issue:
--global-option is deprecated
https://github.com/python-pillow/Pillow/actions/runs/4999985216/jobs/8956875899#step:7:23
> DEPRECATION: --build-option and --global-option are deprecated. pip 23.3 will enforce this behaviour change. A possible replacement is to use --config-settings. Discussion can be found at https://github.com/pypa/pip/issues/11859

While we could possibly just remove `make inplace`
https://github.com/python-pillow/Pillow/blob/599979caae111c22bd15f0103320bf74eb53d963/Makefile#L58-L59

and `--global-option="build_ext"`, we do still need something to replace our [build options](https://pillow.readthedocs.io/en/stable/installation.html#build-options).

The possible replacement of [`--config-settings`](https://peps.python.org/pep-0517/#config-settings) would involve switching from setuptools to build.

pip releases a new version [every 3 months](https://pip.pypa.io/en/stable/development/release-process/), so pip 23.3 is due out in October, [possibly before](https://github.com/pypa/pip/releases/tag/21.3) our scheduled October 15 release for Pillow 10.1. So it would be ideal to figure this out for Pillow 10.


Discussion:
> would involve switching from setuptools to build.

Sounds like a good idea. I expect this would also unblock switching from setup.cfg/setup.py to pyproject.toml, even if that can be a follow up.



> pip releases a new version [every 3 months](https://pip.pypa.io/en/stable/development/release-process/), so pip 23.3 is due out in October, [possibly before](https://github.com/pypa/pip/releases/tag/21.3) our scheduled October 15 release for Pillow 10.1. So it would be ideal to figure this out for Pillow 10.

👍 

Resolving patch:
diff --git a/_custom_build/backend.py b/_custom_build/backend.py
new file mode 100755
--- /dev/null
+++ b/_custom_build/backend.py
@@ -0,0 +1,56 @@
+import sys
+
+from setuptools.build_meta import *  # noqa: F401, F403
+from setuptools.build_meta import build_wheel
+
+backend_class = build_wheel.__self__.__class__
+
+
+class _CustomBuildMetaBackend(backend_class):
+    def run_setup(self, setup_script="setup.py"):
+        if self.config_settings:
+
+            def config_has(key, value):
+                settings = self.config_settings.get(key)
+                if settings:
+                    if not isinstance(settings, list):
+                        settings = [settings]
+                    return value in settings
+
+            flags = []
+            for dependency in (
+                "zlib",
+                "jpeg",
+                "tiff",
+                "freetype",
+                "raqm",
+                "lcms",
+                "webp",
+                "webpmux",
+                "jpeg2000",
+                "imagequant",
+                "xcb",
+            ):
+                if config_has(dependency, "enable"):
+                    flags.append("--enable-" + dependency)
+                elif config_has(dependency, "disable"):
+                    flags.append("--disable-" + dependency)
+            for dependency in ("raqm", "fribidi"):
+                if config_has(dependency, "vendor"):
+                    flags.append("--vendor-" + dependency)
+            if self.config_settings.get("platform-guessing") == "disable":
+                flags.append("--disable-platform-guessing")
+            if self.config_settings.get("debug") == "true":
+                flags.append("--debug")
+            if flags:
+                sys.argv = sys.argv[:1] + ["build_ext"] + flags + sys.argv[1:]
+        return super().run_setup(setup_script)
+
+    def build_wheel(
+        self, wheel_directory, config_settings=None, metadata_directory=None
+    ):
+        self.config_settings = config_settings
+        return super().build_wheel(wheel_directory, config_settings, metadata_directory)
+
+
+build_wheel = _CustomBuildMetaBackend().build_wheel


Test patch: