Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/Imaging/setup.py
diff options
context:
space:
mode:
Diffstat (limited to 'Imaging/setup.py')
-rw-r--r--Imaging/setup.py457
1 files changed, 457 insertions, 0 deletions
diff --git a/Imaging/setup.py b/Imaging/setup.py
new file mode 100644
index 0000000..aee3d2d
--- /dev/null
+++ b/Imaging/setup.py
@@ -0,0 +1,457 @@
+#!/usr/bin/env python
+#
+# Setup script for PIL 1.1.5 and later
+# $Id: setup.py 2582 2005-11-11 21:54:00Z fredrik $
+#
+# Usage: python setup.py install
+#
+
+import glob, os, re, struct, string, sys
+
+# make it possible to run the setup script from another directory
+try:
+ os.chdir(os.path.dirname(sys.argv[0]))
+except OSError:
+ pass
+
+def libinclude(root):
+ # map root to (root/lib, root/include)
+ return os.path.join(root, "lib"), os.path.join(root, "include")
+
+# --------------------------------------------------------------------
+# Library pointers.
+#
+# Use None to look for the libraries in well-known library locations.
+# Use a string to specify a single directory, for both the library and
+# the include files. Use a tuple to specify separate directories:
+# (libpath, includepath). Examples:
+#
+# JPEG_ROOT = "/home/libraries/jpeg-6b"
+# TIFF_ROOT = "/opt/tiff/lib", "/opt/tiff/include"
+#
+# If you have "lib" and "include" directories under a common parent,
+# you can use the "libinclude" helper:
+#
+# TIFF_ROOT = libinclude("/opt/tiff")
+
+FREETYPE_ROOT = None
+JPEG_ROOT = None
+TIFF_ROOT = None
+ZLIB_ROOT = None
+TCL_ROOT = None
+
+# FIXME: add mechanism to explicitly *disable* the use of a library
+
+# --------------------------------------------------------------------
+# Identification
+
+NAME = "PIL"
+DESCRIPTION = "Python Imaging Library"
+AUTHOR = "Secret Labs AB (PythonWare)", "info@pythonware.com"
+HOMEPAGE = "http://www.pythonware.com/products/pil"
+
+# --------------------------------------------------------------------
+# Core library
+
+IMAGING = [
+ "decode", "encode", "map", "display", "outline", "path",
+ ]
+
+LIBIMAGING = [
+ "Access", "Antialias", "Bands", "BitDecode", "Blend", "Chops",
+ "Convert", "ConvertYCbCr", "Copy", "Crc32", "Crop", "Dib", "Draw",
+ "Effects", "EpsEncode", "File", "Fill", "Filter", "FliDecode",
+ "Geometry", "GetBBox", "GifDecode", "GifEncode", "HexDecode",
+ "Histo", "JpegDecode", "JpegEncode", "LzwDecode", "Matrix",
+ "ModeFilter", "MspDecode", "Negative", "Offset", "Pack",
+ "PackDecode", "Palette", "Paste", "Quant", "QuantHash",
+ "QuantHeap", "PcdDecode", "PcxDecode", "PcxEncode", "Point",
+ "RankFilter", "RawDecode", "RawEncode", "Storage", "SunRleDecode",
+ "TgaRleDecode", "Unpack", "UnpackYCC", "XbmDecode", "XbmEncode",
+ "ZipDecode", "ZipEncode"
+ ]
+
+# --------------------------------------------------------------------
+# Override settings
+
+try:
+ from setup_site import *
+except ImportError:
+ pass
+
+# --------------------------------------------------------------------
+
+from distutils import sysconfig
+from distutils.core import Extension, setup
+from distutils.command.build_ext import build_ext
+
+try:
+ import _tkinter
+except ImportError:
+ _tkinter = None
+
+def add_directory(path, dir, where=None):
+ if dir and os.path.isdir(dir) and dir not in path:
+ if where is None:
+ path.append(dir)
+ else:
+ path.insert(where, dir)
+
+def find_library_file(self, library):
+ return self.compiler.find_library_file(self.compiler.library_dirs, library)
+
+def find_version(filename):
+ for line in open(filename).readlines():
+ m = re.search("VERSION\s*=\s*\"([^\"]+)\"", line)
+ if m:
+ return m.group(1)
+ return None
+
+VERSION = find_version("PIL/Image.py")
+
+class pil_build_ext(build_ext):
+
+ def build_extensions(self):
+
+ global TCL_ROOT
+
+ library_dirs = []
+ include_dirs = []
+
+ add_directory(include_dirs, "libImaging")
+
+ #
+ # add platform directories
+
+ if sys.platform == "cygwin":
+ # pythonX.Y.dll.a is in the /usr/lib/pythonX.Y/config directory
+ add_directory(library_dirs, os.path.join(
+ "/usr/lib", "python%s" % sys.version[:3], "config"
+ ))
+
+ elif sys.platform == "darwin":
+ # attempt to make sure we pick freetype2 over other versions
+ add_directory(include_dirs, "/sw/include/freetype2")
+ add_directory(include_dirs, "/sw/lib/freetype2/include")
+ # fink installation directories
+ add_directory(library_dirs, "/sw/lib")
+ add_directory(include_dirs, "/sw/include")
+ # darwin ports installation directories
+ add_directory(library_dirs, "/opt/local/lib")
+ add_directory(include_dirs, "/opt/local/include")
+
+ add_directory(library_dirs, "/usr/local/lib")
+ # FIXME: check /opt/stuff directories here?
+
+ prefix = sysconfig.get_config_var("prefix")
+ if prefix:
+ add_directory(library_dirs, os.path.join(prefix, "lib"))
+ add_directory(include_dirs, os.path.join(prefix, "include"))
+
+ #
+ # locate tkinter libraries
+
+ if _tkinter:
+ TCL_VERSION = _tkinter.TCL_VERSION[:3]
+
+ if _tkinter and not TCL_ROOT:
+ # we have Tkinter but the TCL_ROOT variable was not set;
+ # try to locate appropriate Tcl/Tk libraries
+ PYVERSION = sys.version[0] + sys.version[2]
+ TCLVERSION = TCL_VERSION[0] + TCL_VERSION[2]
+ roots = [
+ # common installation directories, mostly for Windows
+ # (for Unix-style platforms, we'll check in well-known
+ # locations later)
+ os.path.join("/py" + PYVERSION, "Tcl"),
+ os.path.join("/python" + PYVERSION, "Tcl"),
+ "/Tcl", "/Tcl" + TCLVERSION, "/Tcl" + TCL_VERSION,
+ os.path.join(os.environ.get("ProgramFiles", ""), "Tcl"),
+ ]
+ for TCL_ROOT in roots:
+ TCL_ROOT = os.path.abspath(TCL_ROOT)
+ if os.path.isfile(os.path.join(TCL_ROOT, "include", "tk.h")):
+ # FIXME: use distutils logging (?)
+ print "--- using Tcl/Tk libraries at", TCL_ROOT
+ print "--- using Tcl/Tk version", TCL_VERSION
+ TCL_ROOT = libinclude(TCL_ROOT)
+ break
+ else:
+ TCL_ROOT = None
+
+ #
+ # add configured kits
+
+ for root in [FREETYPE_ROOT, JPEG_ROOT, TCL_ROOT, TIFF_ROOT, ZLIB_ROOT]:
+ if isinstance(root, type(())):
+ lib_root, include_root = root
+ else:
+ lib_root = include_root = root
+ add_directory(library_dirs, lib_root)
+ add_directory(include_dirs, include_root)
+
+ #
+ # add standard directories
+
+ add_directory(library_dirs, "/usr/local/lib")
+ add_directory(include_dirs, "/usr/local/include")
+
+ add_directory(library_dirs, "/usr/lib")
+ add_directory(include_dirs, "/usr/include")
+
+ #
+ # insert new dirs *before* default libs, to avoid conflicts
+ # between Python PYD stub libs and real libraries
+
+ self.compiler.library_dirs = library_dirs + self.compiler.library_dirs
+ self.compiler.include_dirs = include_dirs + self.compiler.include_dirs
+
+ #
+ # look for available libraries
+
+ class feature:
+ zlib = jpeg = tiff = freetype = tcl = tk = None
+ feature = feature()
+
+ 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_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 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")
+ 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 _tkinter:
+ # 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
+
+ #
+ # core library
+
+ files = ["_imaging.c"]
+ for file in IMAGING:
+ files.append(file + ".c")
+ for file in LIBIMAGING:
+ files.append(os.path.join("libImaging", file + ".c"))
+
+ libs = []
+ defs = []
+ if feature.jpeg:
+ libs.append(feature.jpeg)
+ defs.append(("HAVE_LIBJPEG", None))
+ if feature.zlib:
+ libs.append(feature.zlib)
+ defs.append(("HAVE_LIBZ", None))
+ if sys.platform == "win32":
+ libs.extend(["kernel32", "user32", "gdi32"])
+ if struct.unpack("h", "\0\1")[0] == 1:
+ defs.append(("WORDS_BIGENDIAN", None))
+
+ exts = [(Extension(
+ "_imaging", files, libraries=libs, define_macros=defs
+ ))]
+
+ #
+ # additional libraries
+
+ if feature.freetype:
+ defs = []
+ if feature.freetype_version == 20:
+ defs.append(("USE_FREETYPE_2_0", None))
+ exts.append(Extension(
+ "_imagingft", ["_imagingft.c"], libraries=["freetype"],
+ define_macros=defs
+ ))
+
+ if os.path.isfile("_imagingtiff.c") and feature.tiff:
+ exts.append(Extension(
+ "_imagingtiff", ["_imagingtiff.c"], libraries=["tiff"]
+ ))
+
+ if sys.platform == "darwin":
+ # locate Tcl/Tk frameworks
+ frameworks = []
+ framework_roots = [
+ "/Library/Frameworks",
+ "/System/Library/Frameworks"
+ ]
+ for root in framework_roots:
+ if (os.path.exists(os.path.join(root, "Tcl.framework")) and
+ os.path.exists(os.path.join(root, "Tk.framework"))):
+ print "--- using frameworks at", root
+ frameworks = ["-framework", "Tcl", "-framework", "Tk"]
+ dir = os.path.join(root, "Tcl.framework", "Headers")
+ add_directory(self.compiler.include_dirs, dir, 0)
+ dir = os.path.join(root, "Tk.framework", "Headers")
+ add_directory(self.compiler.include_dirs, dir, 1)
+ break
+ if frameworks:
+ exts.append(Extension(
+ "_imagingtk", ["_imagingtk.c", "Tk/tkImaging.c"],
+ extra_compile_args=frameworks, extra_link_args=frameworks
+ ))
+ feature.tcl = feature.tk = 1 # mark as present
+ elif feature.tcl and feature.tk:
+ exts.append(Extension(
+ "_imagingtk", ["_imagingtk.c", "Tk/tkImaging.c"],
+ libraries=[feature.tcl, feature.tk]
+ ))
+
+ if os.path.isfile("_imagingmath.c"):
+ exts.append(Extension("_imagingmath", ["_imagingmath.c"]))
+
+ self.extensions[:] = exts
+
+ build_ext.build_extensions(self)
+
+ #
+ # sanity and security checks
+
+ unsafe_zlib = None
+
+ if feature.zlib:
+ unsafe_zlib = self.check_zlib_version(self.compiler.include_dirs)
+
+ self.summary_report(feature, unsafe_zlib)
+
+ def summary_report(self, feature, unsafe_zlib):
+
+ print "-" * 68
+ print "PIL", VERSION, "BUILD SUMMARY"
+ print "-" * 68
+ print "version ", VERSION
+ v = string.split(sys.version, "[")
+ print "platform ", sys.platform, string.strip(v[0])
+ for v in v[1:]:
+ print " ", string.strip("[" + v)
+ print "-" * 68
+
+ options = [
+ (feature.tcl and feature.tk, "TKINTER"),
+ (feature.jpeg, "JPEG"),
+ (feature.zlib, "ZLIB (PNG/ZIP)"),
+ # (feature.tiff, "experimental TIFF G3/G4 read"),
+ (feature.freetype, "FREETYPE2"),
+ ]
+
+ all = 1
+ for option in options:
+ if option[0]:
+ print "---", option[1], "support ok"
+ else:
+ print "***", option[1], "support not available",
+ if option[1] == "TKINTER" and _tkinter:
+ version = _tkinter.TCL_VERSION
+ print "(Tcl/Tk %s libraries needed)" % version,
+ print
+ all = 0
+
+ if feature.zlib and unsafe_zlib:
+ print
+ print "*** Warning: zlib", unsafe_zlib,
+ print "may contain a security vulnerability."
+ print "*** Consider upgrading to zlib 1.2.3 or newer."
+ print "*** See: http://www.kb.cert.org/vuls/id/238678"
+ print " http://www.kb.cert.org/vuls/id/680620"
+ print " http://www.gzip.org/zlib/advisory-2002-03-11.txt"
+ print
+
+ print "-" * 68
+
+ if not all:
+ print "To add a missing option, make sure you have the required"
+ print "library, and set the corresponding ROOT variable in the"
+ print "setup.py script."
+ print
+
+ print "To check the build, run the selftest.py script."
+
+ def check_zlib_version(self, include_dirs):
+ # look for unsafe versions of zlib
+ for dir in include_dirs:
+ zlibfile = os.path.join(dir, "zlib.h")
+ if os.path.isfile(zlibfile):
+ break
+ else:
+ return
+ for line in open(zlibfile).readlines():
+ m = re.match('#define\s+ZLIB_VERSION\s+"([^"]*)"', line)
+ if not m:
+ continue
+ if m.group(1) < "1.2.3":
+ return m.group(1)
+
+#
+# build!
+
+if __name__ == "__main__":
+
+ try:
+ # add necessary to distutils (for backwards compatibility)
+ from distutils.dist import DistributionMetadata
+ DistributionMetadata.classifiers = None
+ DistributionMetadata.download_url = None
+ DistributionMetadata.platforms = None
+ except:
+ pass
+
+ setup(
+ author=AUTHOR[0], author_email=AUTHOR[1],
+ classifiers=[
+ "Development Status :: 6 - Mature",
+ "Topic :: Multimedia :: Graphics",
+ "Topic :: Multimedia :: Graphics :: Capture :: Digital Camera",
+ "Topic :: Multimedia :: Graphics :: Capture :: Scanners",
+ "Topic :: Multimedia :: Graphics :: Capture :: Screen Capture",
+ "Topic :: Multimedia :: Graphics :: Graphics Conversion",
+ "Topic :: Multimedia :: Graphics :: Viewers",
+ ],
+ cmdclass = {"build_ext": pil_build_ext},
+ description=DESCRIPTION,
+ download_url="http://effbot.org/zone/pil-changes-116.htm",
+ ext_modules = [Extension("_imaging", ["_imaging.c"])], # dummy
+ extra_path = "PIL",
+ license="Python (MIT style)",
+ long_description=DESCRIPTION,
+ name=NAME,
+ package_dir={"": "PIL"},
+ packages=[""],
+ platforms="Python 1.5.2 and later.",
+ scripts = glob.glob("Scripts/pil*.py"),
+ url=HOMEPAGE,
+ version=VERSION,
+ )