[Image-SIG] Install script for PIL

Bernhard Herzog herzog@online.de
13 Mar 1999 20:08:56 +0100


I asked for it, so I wrote it: an install script for PIL.

I've only tested this on Linux, but I expect it to work on other
Unix(-like) systems as well.

See the usage message in the script for what it actually does and how to
invoke it.


#! /usr/bin/env python

#
# Install script for the Python Imaging Library
#

import sys, os
import glob
import compileall
import shutil

from string import split, join


class DefaultOptions:

    #
    # Directories
    #

    # The directory prefix
    prefix = sys.prefix

    # The python library directory.
    libdir = None

    # The site-packages directory
    sitepackagedir = None

    # The include file directory for python's header files
    includedir = None
    
    # The include file directory for extension header files
    extensionincludedir = None

    #
    # Other options
    #

    # if true, just print messages about what the script would be doing
    # but don't actually do anything.
    noop = 0 

    # Print lots of messages
    verbose = 1

    #
    help = 0

    #
    # Some methods
    #

    def print_messages(self):
        return self.verbose or self.noop

    def fix_directories(self):
        pyverdir = 'python' + sys.version[:3]
        if self.libdir is None:
            self.libdir = os.path.join(self.prefix, 'lib', pyverdir)
        if self.sitepackagedir is None:
            self.sitepackagedir = os.path.join(self.libdir, 'site-packages')
        if self.includedir is None:
            self.includedir = os.path.join(self.prefix, 'include', pyverdir)
        if self.extensionincludedir is None:
            self.extensionincludedir = os.path.join(self.includedir,
                                                    'extensions')


options = DefaultOptions()



def create_directory(dir):
    '''Create the directory dir and its parent directories if necessary'''
    if os.path.isdir(dir):
	return
    parent, base = os.path.split(dir)
    create_directory(parent)
    try:
        if options.print_messages():
            print 'create directory %s' % dir
        if not options.noop:
            os.mkdir(dir, 0777)
    except os.error, exc:
        sys.stderr.write("can't create directory %s:%s\n" % (dir, exc))


def install_file(srcfile, dest, **flags):
    '''Copy the file srcfile, into the directory dest.

       If srcfile is a relative filename and the optional keyword
       argument recursive is true, preserve the leading directory
       components of the source filename and create the appropriate
       subdirectories in dest.
    '''
    srcdir, basename = os.path.split(srcfile)
    if flags.get('recursive') and not os.path.isabs(srcdir):
        destdir = os.path.join(dest, srcdir)
    else:
        destdir = dest
    create_directory(destdir)
    destfile = os.path.join(destdir, basename)
    if options.print_messages():
        print 'copying %s to %s' % (srcfile, destfile)
    if not options.noop:
        shutil.copy(srcfile, destfile)
        
def bytecompile(dir):
    '''Bytecompile all python source files in dir recursively'''
    if options.noop:
        print 'Bytecompile all python source files under %s' % dir
    else:
        compileall.compile_dir(os.path.join(os.getcwd(), dir))

def install(pattern, dest, **flags):
    '''Install the files described by pattern pattern into the directory dest.
       The shell pattern is expanded by the glob module.

       An optional keyword argument recursive, if true, means to
       preserve the leading directory components of the source filenames
       if they are relative filenames and create the appropriate
       subdirectories in dest.
    '''
    files = glob.glob(pattern)
    if not files:
        sys.stderr.write('No files matching %s\n' % pattern)
    for file in files:
        apply(install_file, (file, dest), flags)



def check_option(option, value):
    if value is None:
        sys.stderr.write('Value required for option %s\n' % option)
        sys.exit(1)

def parse_cmd_line():
    argv = sys.argv[1:]
    for arg in argv:
        if '=' in arg:
            arg, value = split(arg, '=', 1)
        else:
            value = None
        if arg in ('-h', '--help'):
            options.help = 1
        elif arg == '--prefix':
            options.prefix = os.path.expanduser(value)
        elif arg == '--install-dir':
            check_option('--prefix', value)
            options.sitepackagedir = os.path.expanduser(value)
        elif arg == '--include-dir':
            check_option('--include-dir', value)
            options.extensionincludedir = os.path.expanduser(value)
        elif arg == '--noop':
            options.noop = 1
        else:
            sys.stderr.write('Unknown option %s\n' % arg)


def print_help():
    opt = DefaultOptions()
    opt.fix_directories()
    dict = opt.__class__.__dict__.copy()
    dict.update(opt.__dict__)
    dict['pyversion'] = sys.version[:3]
    print help_message % dict
    
help_message = """\
usage:
install.py [options...]

install.py install the Python Imaging Library and its headerfiles.
Normally the PIL is installed in the site-packages directory and the
headerfiles in a subdirectory under the directory containing Python's
headerfiles. You can change these directories with the options listed
below.

Options:

        -h, --help

                Print this help message. Do nothing else

        --noop

                Do nothing. Just print messages about what would be
                done.

        --prefix=DIR

                Install PIL files in DIR/lib/python-%(pyversion)s/site-packages/PIL
                Default is %(prefix)s

        --install-dir=DIR

                Install PIL in DIR. Default is %(sitepackagedir)s

        --include-dir=DIR

                Install the PIL header file in DIR.
                Default is %(extensionincludedir)s
"""



def main():
    parse_cmd_line()
    if options.help:
        print_help()
    else:
        options.fix_directories()
        pildir = os.path.join(options.sitepackagedir, 'PIL')
        install('PIL/*.py', options.sitepackagedir, recursive = 1)
        install('_imaging.so', pildir, recursive = 1)
        install('PIL.pth', options.sitepackagedir, recursive = 1)
        for file in ('Imaging.h', 'ImConfig.h', 'ImPlatform.h'):
            install(os.path.join('libImaging', file),
                    options.extensionincludedir)
        bytecompile(pildir)


if __name__ == '__main__':
    main()