Skip to content

Commit 8070fe1

Browse files
committed
pass build config before setuptools command; add build_editable to custom build backend
1 parent ded2c8b commit 8070fe1

4 files changed

Lines changed: 54 additions & 41 deletions

File tree

.github/workflows/wheels.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ on:
55
paths:
66
- ".ci/requirements-cibw.txt"
77
- ".github/workflows/wheel*"
8+
- "setup.py"
89
- "wheels/*"
910
- "winbuild/build_prepare.py"
1011
- "winbuild/fribidi.cmake"
@@ -14,6 +15,7 @@ on:
1415
paths:
1516
- ".ci/requirements-cibw.txt"
1617
- ".github/workflows/wheel*"
18+
- "setup.py"
1719
- "wheels/*"
1820
- "winbuild/build_prepare.py"
1921
- "winbuild/fribidi.cmake"

_custom_build/backend.py

Lines changed: 21 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -11,41 +11,16 @@
1111
class _CustomBuildMetaBackend(backend_class):
1212
def run_setup(self, setup_script="setup.py"):
1313
if self.config_settings:
14-
15-
def config_has(key, value):
16-
settings = self.config_settings.get(key)
17-
if settings:
18-
if not isinstance(settings, list):
19-
settings = [settings]
20-
return value in settings
21-
22-
flags = []
23-
for dependency in (
24-
"zlib",
25-
"jpeg",
26-
"tiff",
27-
"freetype",
28-
"raqm",
29-
"lcms",
30-
"webp",
31-
"webpmux",
32-
"jpeg2000",
33-
"imagequant",
34-
"xcb",
35-
):
36-
if config_has(dependency, "enable"):
37-
flags.append("--enable-" + dependency)
38-
elif config_has(dependency, "disable"):
39-
flags.append("--disable-" + dependency)
40-
for dependency in ("raqm", "fribidi"):
41-
if config_has(dependency, "vendor"):
42-
flags.append("--vendor-" + dependency)
43-
if self.config_settings.get("platform-guessing") == "disable":
44-
flags.append("--disable-platform-guessing")
45-
if self.config_settings.get("debug") == "true":
46-
flags.append("--debug")
47-
if flags:
48-
sys.argv = sys.argv[:1] + ["build_ext"] + flags + sys.argv[1:]
14+
params = []
15+
for k, v in self.config_settings.items():
16+
if isinstance(v, list):
17+
msg = "Conflicting options: " + ", ".join(
18+
f"'--config-setting {k}={v_}'" for v_ in v
19+
)
20+
raise ValueError(msg)
21+
params.append(f"--pillow-configuration={k}={v}")
22+
23+
sys.argv = sys.argv[:1] + params + sys.argv[1:]
4924
return super().run_setup(setup_script)
5025

5126
def build_wheel(
@@ -54,5 +29,15 @@ def build_wheel(
5429
self.config_settings = config_settings
5530
return super().build_wheel(wheel_directory, config_settings, metadata_directory)
5631

32+
def build_editable(
33+
self, wheel_directory, config_settings=None, metadata_directory=None
34+
):
35+
self.config_settings = config_settings
36+
return super().build_editable(
37+
wheel_directory, config_settings, metadata_directory
38+
)
39+
5740

58-
build_wheel = _CustomBuildMetaBackend().build_wheel
41+
_backend = _CustomBuildMetaBackend()
42+
build_wheel = _backend.build_wheel
43+
build_editable = _backend.build_editable

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ version = {attr = "PIL.__version__"}
9292
[tool.cibuildwheel]
9393
before-all = ".github/workflows/wheels-dependencies.sh"
9494
build-verbosity = 1
95-
config-settings = "raqm=enable raqm=vendor fribidi=vendor imagequant=disable"
95+
config-settings = "raqm=vendor fribidi=vendor imagequant=disable"
9696
test-command = "cd {project} && .github/workflows/wheels-test.sh"
9797
test-extras = "tests"
9898

setup.py

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ def get_version():
2828
return locals()["__version__"]
2929

3030

31+
configuration = {}
32+
33+
3134
PILLOW_VERSION = get_version()
3235
FREETYPE_ROOT = None
3336
HARFBUZZ_ROOT = None
@@ -334,15 +337,24 @@ def __iter__(self):
334337
+ [("add-imaging-libs=", None, "Add libs to _imaging build")]
335338
)
336339

340+
@staticmethod
341+
def check_configuration(option, value):
342+
return True if configuration.get(option) == value else None
343+
337344
def initialize_options(self):
338-
self.disable_platform_guessing = None
345+
self.disable_platform_guessing = self.check_configuration(
346+
"platform-guessing", "disable"
347+
)
339348
self.add_imaging_libs = ""
340349
build_ext.initialize_options(self)
341350
for x in self.feature:
342-
setattr(self, f"disable_{x}", None)
343-
setattr(self, f"enable_{x}", None)
351+
setattr(self, f"disable_{x}", self.check_configuration(x, "disable"))
352+
setattr(self, f"enable_{x}", self.check_configuration(x, "enable"))
344353
for x in ("raqm", "fribidi"):
345-
setattr(self, f"vendor_{x}", None)
354+
setattr(self, f"vendor_{x}", self.check_configuration(x, "vendor"))
355+
if self.check_configuration("debug", "true"):
356+
self.debug = True
357+
self.parallel = configuration.get("parallel")
346358

347359
def finalize_options(self):
348360
build_ext.finalize_options(self)
@@ -390,6 +402,9 @@ def finalize_options(self):
390402
raise ValueError(msg)
391403
_dbg("Using vendored version of %s", x)
392404
self.feature.vendor.add(x)
405+
if x == "raqm":
406+
_dbg("--vendor-raqm implies --enable-raqm")
407+
self.feature.required.add(x)
393408

394409
def _update_extension(self, name, libraries, define_macros=None, sources=None):
395410
for extension in self.extensions:
@@ -985,6 +1000,17 @@ def debug_build():
9851000
Extension("PIL._imagingmorph", ["src/_imagingmorph.c"]),
9861001
]
9871002

1003+
1004+
# parse configuration from _custom_build/backend.py
1005+
while len(sys.argv[1]) >= 2 and sys.argv[1].startswith("--pillow-configuration="):
1006+
_, key, value = sys.argv[1].split("=", 2)
1007+
old = configuration.get(key)
1008+
if old is not None:
1009+
msg = f"Conflicting options: '-C {key}={old}' and '-C {key}={value}'"
1010+
raise ValueError(msg)
1011+
configuration[key] = value
1012+
del sys.argv[1]
1013+
9881014
try:
9891015
setup(
9901016
cmdclass={"build_ext": pil_build_ext},

0 commit comments

Comments
 (0)