From 810e916342d1315ed68404bc8995fc4a0db17bb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Fri, 31 May 2013 00:04:34 +0200 Subject: [PATCH 1/3] Support --disable-* switches to disable features. For example, --disable-jpeg unconditionally disables both checks jpeg support and checks for libjpeg. --- setup.py | 142 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 87 insertions(+), 55 deletions(-) diff --git a/setup.py b/setup.py index 3686c5adb..dd14f592e 100644 --- a/setup.py +++ b/setup.py @@ -94,6 +94,32 @@ LCMS_ROOT = None class pil_build_ext(build_ext): + class feature: + zlib = jpeg = tiff = freetype = tcl = tk = lcms = webp = None + + def __iter__(self): + for x in dir(self): + if x[1] != '_': + yield x + + feature = feature() + + user_options = build_ext.user_options + [ + ('disable-%s' % x, None, 'Disable support for %s' % x) + for x in feature + ] + + def initialize_options(self): + build_ext.initialize_options(self) + for x in self.feature: + setattr(self, 'disable_%s' % x, None) + + def finalize_options(self): + build_ext.finalize_options(self) + for x in self.feature: + if getattr(self, 'disable_%s' % x): + setattr(self.feature, x, False) + def build_extensions(self): global TCL_ROOT @@ -223,72 +249,78 @@ class pil_build_ext(build_ext): # # look for available libraries - class feature: - zlib = jpeg = tiff = freetype = tcl = tk = lcms = webp = None - feature = feature() + feature = self.feature - if _find_include_file(self, "zlib.h"): - if _find_library_file(self, "z"): - feature.zlib = "z" - elif sys.platform == "win32" and _find_library_file(self, "zlib"): - feature.zlib = "zlib" # alternative name + if feature.zlib is None: + if _find_include_file(self, "zlib.h"): + if _find_library_file(self, "z"): + feature.zlib = "z" + elif sys.platform == "win32" and _find_library_file(self, "zlib"): + feature.zlib = "zlib" # alternative name - if _find_include_file(self, "jpeglib.h"): - if _find_library_file(self, "jpeg"): - feature.jpeg = "jpeg" - elif ( - sys.platform == "win32" and - _find_library_file(self, "libjpeg")): - feature.jpeg = "libjpeg" # alternative name + if feature.jpeg is None: + if _find_include_file(self, "jpeglib.h"): + if _find_library_file(self, "jpeg"): + feature.jpeg = "jpeg" + elif ( + sys.platform == "win32" and + _find_library_file(self, "libjpeg")): + feature.jpeg = "libjpeg" # alternative name - if _find_library_file(self, "tiff"): - feature.tiff = "tiff" - if sys.platform == "win32" and _find_library_file(self, "libtiff"): - feature.tiff = "libtiff" - if sys.platform == "darwin" and _find_library_file(self, "libtiff"): - feature.tiff = "libtiff" + if feature.tiff is None: + if _find_library_file(self, "tiff"): + feature.tiff = "tiff" + if sys.platform == "win32" and _find_library_file(self, "libtiff"): + feature.tiff = "libtiff" + if sys.platform == "darwin" and _find_library_file(self, "libtiff"): + feature.tiff = "libtiff" - if _find_library_file(self, "freetype"): - # look for freetype2 include files - freetype_version = 0 - for dir in self.compiler.include_dirs: - if os.path.isfile(os.path.join(dir, "ft2build.h")): - freetype_version = 21 + if feature.freetype is None: + if _find_library_file(self, "freetype"): + # look for freetype2 include files + freetype_version = 0 + for dir in self.compiler.include_dirs: + if os.path.isfile(os.path.join(dir, "ft2build.h")): + freetype_version = 21 + dir = os.path.join(dir, "freetype2") + break dir = os.path.join(dir, "freetype2") - break - dir = os.path.join(dir, "freetype2") - if os.path.isfile(os.path.join(dir, "ft2build.h")): - freetype_version = 21 - break - if os.path.isdir(os.path.join(dir, "freetype")): - freetype_version = 20 - break - if freetype_version: - feature.freetype = "freetype" - feature.freetype_version = freetype_version - if dir: - _add_directory(self.compiler.include_dirs, dir, 0) + if os.path.isfile(os.path.join(dir, "ft2build.h")): + freetype_version = 21 + break + if os.path.isdir(os.path.join(dir, "freetype")): + freetype_version = 20 + break + if freetype_version: + feature.freetype = "freetype" + feature.freetype_version = freetype_version + if dir: + _add_directory(self.compiler.include_dirs, dir, 0) - if _find_include_file(self, "lcms.h"): - if _find_library_file(self, "lcms"): - feature.lcms = "lcms" + if feature.lcms is None: + if _find_include_file(self, "lcms.h"): + if _find_library_file(self, "lcms"): + feature.lcms = "lcms" if _tkinter and _find_include_file(self, "tk.h"): # the library names may vary somewhat (e.g. tcl84 or tcl8.4) version = TCL_VERSION[0] + TCL_VERSION[2] - if _find_library_file(self, "tcl" + version): - feature.tcl = "tcl" + version - elif _find_library_file(self, "tcl" + TCL_VERSION): - feature.tcl = "tcl" + TCL_VERSION - if _find_library_file(self, "tk" + version): - feature.tk = "tk" + version - elif _find_library_file(self, "tk" + TCL_VERSION): - feature.tk = "tk" + TCL_VERSION + if feature.tcl is None: + if _find_library_file(self, "tcl" + version): + feature.tcl = "tcl" + version + elif _find_library_file(self, "tcl" + TCL_VERSION): + feature.tcl = "tcl" + TCL_VERSION + if feature.tk is None: + if _find_library_file(self, "tk" + version): + feature.tk = "tk" + version + elif _find_library_file(self, "tk" + TCL_VERSION): + feature.tk = "tk" + TCL_VERSION - if (_find_include_file(self, "webp/encode.h") and - _find_include_file(self, "webp/decode.h")): - if _find_library_file(self, "webp"): # in googles precompiled zip it is call "libwebp" - feature.webp = "webp" + if feature.webp is None: + if (_find_include_file(self, "webp/encode.h") and + _find_include_file(self, "webp/decode.h")): + if _find_library_file(self, "webp"): # in googles precompiled zip it is call "libwebp" + feature.webp = "webp" # # core library From 570c2adeaf90d286ca54e3603c5720142d67867d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Sat, 8 Jun 2013 08:14:44 +0200 Subject: [PATCH 2/3] Introduce abstraction over --disable-feature. --- setup.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/setup.py b/setup.py index dd14f592e..a150cf480 100644 --- a/setup.py +++ b/setup.py @@ -97,6 +97,9 @@ class pil_build_ext(build_ext): class feature: zlib = jpeg = tiff = freetype = tcl = tk = lcms = webp = None + def want(self, feat): + return getattr(self, feat) is None + def __iter__(self): for x in dir(self): if x[1] != '_': @@ -251,14 +254,14 @@ class pil_build_ext(build_ext): feature = self.feature - if feature.zlib is None: + if feature.want('zlib'): if _find_include_file(self, "zlib.h"): if _find_library_file(self, "z"): feature.zlib = "z" elif sys.platform == "win32" and _find_library_file(self, "zlib"): feature.zlib = "zlib" # alternative name - if feature.jpeg is None: + if feature.want('jpeg'): if _find_include_file(self, "jpeglib.h"): if _find_library_file(self, "jpeg"): feature.jpeg = "jpeg" @@ -267,7 +270,7 @@ class pil_build_ext(build_ext): _find_library_file(self, "libjpeg")): feature.jpeg = "libjpeg" # alternative name - if feature.tiff is None: + if feature.want('tiff'): if _find_library_file(self, "tiff"): feature.tiff = "tiff" if sys.platform == "win32" and _find_library_file(self, "libtiff"): @@ -275,7 +278,7 @@ class pil_build_ext(build_ext): if sys.platform == "darwin" and _find_library_file(self, "libtiff"): feature.tiff = "libtiff" - if feature.freetype is None: + if feature.want('freetype'): if _find_library_file(self, "freetype"): # look for freetype2 include files freetype_version = 0 @@ -297,7 +300,7 @@ class pil_build_ext(build_ext): if dir: _add_directory(self.compiler.include_dirs, dir, 0) - if feature.lcms is None: + if feature.want('lcms'): if _find_include_file(self, "lcms.h"): if _find_library_file(self, "lcms"): feature.lcms = "lcms" @@ -305,18 +308,18 @@ class pil_build_ext(build_ext): if _tkinter and _find_include_file(self, "tk.h"): # the library names may vary somewhat (e.g. tcl84 or tcl8.4) version = TCL_VERSION[0] + TCL_VERSION[2] - if feature.tcl is None: + if feature.want('tcl'): if _find_library_file(self, "tcl" + version): feature.tcl = "tcl" + version elif _find_library_file(self, "tcl" + TCL_VERSION): feature.tcl = "tcl" + TCL_VERSION - if feature.tk is None: + if feature.want('tk'): if _find_library_file(self, "tk" + version): feature.tk = "tk" + version elif _find_library_file(self, "tk" + TCL_VERSION): feature.tk = "tk" + TCL_VERSION - if feature.webp is None: + if feature.want('webp'): if (_find_include_file(self, "webp/encode.h") and _find_include_file(self, "webp/decode.h")): if _find_library_file(self, "webp"): # in googles precompiled zip it is call "libwebp" From e09580e12c7b7ad0b9ddca0ac4129f0bfb1020a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Fri, 31 May 2013 00:08:04 +0200 Subject: [PATCH 3/3] Introduce --enable-x and fail if it is given and x is not available. --- setup.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/setup.py b/setup.py index a150cf480..e2783c039 100644 --- a/setup.py +++ b/setup.py @@ -96,7 +96,10 @@ class pil_build_ext(build_ext): class feature: zlib = jpeg = tiff = freetype = tcl = tk = lcms = webp = None + required = [] + def require(self, feat): + return feat in self.required def want(self, feat): return getattr(self, feat) is None @@ -110,18 +113,28 @@ class pil_build_ext(build_ext): user_options = build_ext.user_options + [ ('disable-%s' % x, None, 'Disable support for %s' % x) for x in feature + ] + [ + ('enable-%s' % x, None, 'Enable support for %s' % x) + for x in feature ] def initialize_options(self): build_ext.initialize_options(self) for x in self.feature: setattr(self, 'disable_%s' % x, None) + setattr(self, 'enable_%s' % x, None) def finalize_options(self): build_ext.finalize_options(self) for x in self.feature: if getattr(self, 'disable_%s' % x): setattr(self.feature, x, False) + if getattr(self, 'enable_%s' % x): + raise ValueError( + 'Conflicting options: --enable-%s and --disable-%s' + % (x, x)) + if getattr(self, 'enable_%s' % x): + self.feature.required.append(x) def build_extensions(self): @@ -325,6 +338,12 @@ class pil_build_ext(build_ext): if _find_library_file(self, "webp"): # in googles precompiled zip it is call "libwebp" feature.webp = "webp" + for f in feature: + if not getattr(feature, f) and feature.require(f): + raise ValueError( + '--enable-%s requested but %s not found, aborting.' + % (f, f)) + # # core library