diff --git a/_custom_build/backend.py b/_custom_build/backend.py index 44ec6efe5c6..e0b217a8233 100644 --- a/_custom_build/backend.py +++ b/_custom_build/backend.py @@ -17,7 +17,9 @@ def run_setup(self, setup_script="setup.py"): for value in values: sys.argv.append(f"--pillow-configuration={key}={value}") - return super().run_setup(setup_script) + import pillow_ext + + pillow_ext.run() def build_wheel( self, wheel_directory, config_settings=None, metadata_directory=None diff --git a/setup.py b/_custom_build/pillow_ext.py similarity index 94% rename from setup.py rename to _custom_build/pillow_ext.py index 6a6bffab6f9..ad4fec4f28f 100644 --- a/setup.py +++ b/_custom_build/pillow_ext.py @@ -27,14 +27,6 @@ configuration: dict[str, list[str]] = {} -# parse configuration from _custom_build/backend.py -while sys.argv[-1].startswith("--pillow-configuration="): - _, key, value = sys.argv.pop().split("=", 2) - configuration.setdefault(key, []).append(value) - -default = int(configuration.get("parallel", ["0"])[-1]) -ParallelCompile("MAX_CONCURRENCY", default).install() - def get_version() -> str: version_file = "src/PIL/_version.py" @@ -57,20 +49,6 @@ def get_version() -> str: ZLIB_ROOT = None FUZZING_BUILD = "LIB_FUZZING_ENGINE" in os.environ -if sys.platform == "win32" and sys.version_info >= (3, 16): - import atexit - - atexit.register( - lambda: warnings.warn( - f"Pillow {PILLOW_VERSION} does not support Python " - f"{sys.version_info.major}.{sys.version_info.minor} and does not provide " - "prebuilt Windows binaries. We do not recommend building from source on " - "Windows.", - RuntimeWarning, - ) - ) - - _IMAGING = ("decode", "encode", "map", "display", "outline", "path") _LIB_IMAGING = ( @@ -1073,40 +1051,62 @@ def debug_build() -> bool: return hasattr(sys, "gettotalrefcount") or FUZZING_BUILD -libraries: list[tuple[str, _BuildInfo]] = [ - ("pil_imaging_mode", {"sources": ["src/libImaging/Mode.c"]}), -] +def run() -> None: + global configuration + configuration = {} + while sys.argv and sys.argv[-1].startswith("--pillow-configuration="): + _, key, value = sys.argv.pop().split("=", 2) + configuration.setdefault(key, []).append(value) -files: list[str | os.PathLike[str]] = ["src/_imaging.c"] -files.extend("src/" + src_file + ".c" for src_file in _IMAGING) -files.extend( - os.path.join("src/libImaging", src_file + ".c") for src_file in _LIB_IMAGING -) -ext_modules = [ - Extension("PIL._imaging", files), - Extension("PIL._imagingft", ["src/_imagingft.c"]), - Extension("PIL._imagingcms", ["src/_imagingcms.c"]), - Extension("PIL._webp", ["src/_webp.c"]), - Extension("PIL._avif", ["src/_avif.c"]), - Extension("PIL._imagingtk", ["src/_imagingtk.c", "src/Tk/tkImaging.c"]), - Extension( - "PIL._imagingmath", - ["src/_imagingmath.c"], - libraries=None if sys.platform == "win32" else ["m"], - ), - Extension("PIL._imagingmorph", ["src/_imagingmorph.c"]), -] - - -try: - setup( - cmdclass={"build_ext": pil_build_ext}, - ext_modules=ext_modules, - libraries=libraries, - zip_safe=not (debug_build() or PLATFORM_MINGW), + default = int(configuration.get("parallel", ["0"])[-1]) + ParallelCompile("MAX_CONCURRENCY", default).install() + + if sys.platform == "win32" and sys.version_info >= (3, 16): + import atexit + + atexit.register( + lambda: warnings.warn( + f"Pillow {PILLOW_VERSION} does not support Python " + f"{sys.version_info.major}.{sys.version_info.minor} and does not provide " + "prebuilt Windows binaries. We do not recommend building from source on " + "Windows.", + RuntimeWarning, + ) + ) + + libraries: list[tuple[str, _BuildInfo]] = [ + ("pil_imaging_mode", {"sources": ["src/libImaging/Mode.c"]}), + ] + + files: list[str | os.PathLike[str]] = ["src/_imaging.c"] + files.extend("src/" + src_file + ".c" for src_file in _IMAGING) + files.extend( + os.path.join("src/libImaging", src_file + ".c") for src_file in _LIB_IMAGING ) -except RequiredDependencyException as err: - msg = f""" + ext_modules = [ + Extension("PIL._imaging", files), + Extension("PIL._imagingft", ["src/_imagingft.c"]), + Extension("PIL._imagingcms", ["src/_imagingcms.c"]), + Extension("PIL._webp", ["src/_webp.c"]), + Extension("PIL._avif", ["src/_avif.c"]), + Extension("PIL._imagingtk", ["src/_imagingtk.c", "src/Tk/tkImaging.c"]), + Extension( + "PIL._imagingmath", + ["src/_imagingmath.c"], + libraries=None if sys.platform == "win32" else ["m"], + ), + Extension("PIL._imagingmorph", ["src/_imagingmorph.c"]), + ] + + try: + setup( + cmdclass={"build_ext": pil_build_ext}, + ext_modules=ext_modules, + libraries=libraries, + zip_safe=not (debug_build() or PLATFORM_MINGW), + ) + except RequiredDependencyException as err: + msg = f""" The headers or library files could not be found for {str(err)}, a required dependency when compiling Pillow from source. @@ -1115,14 +1115,14 @@ def debug_build() -> bool: https://pillow.readthedocs.io/en/latest/installation/basic-installation.html """ - sys.stderr.write(msg) - raise RequiredDependencyException(msg) -except DependencyException as err: - msg = f""" + sys.stderr.write(msg) + raise RequiredDependencyException(msg) + except DependencyException as err: + msg = f""" The headers or library files could not be found for {str(err)}, which was requested by the option flag '-C {str(err)}=enable' """ - sys.stderr.write(msg) - raise DependencyException(msg) + sys.stderr.write(msg) + raise DependencyException(msg)