#!/bin/sh
# py-compile - Compile a Python program

scriptversion=2005-05-14.22

# Copyright (C) 2000, 2001, 2003, 2004, 2005  Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.

# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.

# This file is maintained in Automake, please report
# bugs to <bug-automake@gnu.org> or send patches to
# <automake-patches@gnu.org>.

if [ -z "$PYTHON" ]; then
  PYTHON=python
fi

basedir=
destdir=
files=
while test $# -ne 0; do
  case "$1" in
    --basedir)
      basedir=$2
      if test -z "$basedir"; then
        echo "$0: Missing argument to --basedir." 1>&2
        exit 1
      fi
      shift
      ;;
    --destdir)
      destdir=$2
      if test -z "$destdir"; then
        echo "$0: Missing argument to --destdir." 1>&2
        exit 1
      fi
      shift
      ;;
    -h|--h*)
      cat <<\EOF
Usage: py-compile [--help] [--version] [--basedir DIR] [--destdir DIR] FILES..."

Byte compile some python scripts FILES.  Use --destdir to specify any
leading directory path to the FILES that you don't want to include in the
byte compiled file.  Specify --basedir for any additional path information you
do want to be shown in the byte compiled file.

Example:
  py-compile --destdir /tmp/pkg-root --basedir /usr/share/test test.py test2.py

Report bugs to <bug-automake@gnu.org>.
EOF
      exit $?
      ;;
    -v|--v*)
      echo "py-compile $scriptversion"
      exit $?
      ;;
    *)
      files="$files $1"
      ;;
  esac
  shift
done

if test -z "$files"; then
    echo "$0: No files given.  Try \`$0 --help' for more information." 1>&2
    exit 1
fi

# if basedir was given, then it should be prepended to filenames before
# byte compilation.
if [ -z "$basedir" ]; then
    pathtrans="path = file"
else
    pathtrans="path = os.path.join('$basedir', file)"
fi

# if destdir was given, then it needs to be prepended to the filename to
# byte compile but not go into the compiled file.
if [ -z "$destdir" ]; then
    filetrans="filepath = path"
else
    filetrans="filepath = os.path.normpath('$destdir' + os.sep + path)"
fi

$PYTHON -c "
import sys, os, string, py_compile

files = '''$files'''

print 'Byte-compiling python modules...'
for file in string.split(files):
    $pathtrans
    $filetrans
    if not os.path.exists(filepath) or not (len(filepath) >= 3
                                            and filepath[-3:] == '.py'):
	continue
    print file,
    sys.stdout.flush()
    py_compile.compile(filepath, filepath + 'c', path)
print" || exit $?

# this will fail for python < 1.5, but that doesn't matter ...
$PYTHON -O -c "
import sys, os, string, py_compile

files = '''$files'''
print 'Byte-compiling python modules (optimized versions) ...'
for file in string.split(files):
    $pathtrans
    $filetrans
    if not os.path.exists(filepath) or not (len(filepath) >= 3
                                            and filepath[-3:] == '.py'):
	continue
    print file,
    sys.stdout.flush()
    py_compile.compile(filepath, filepath + 'o', path)
print" 2>/dev/null || :

# Local Variables:
# mode: shell-script
# sh-indentation: 2
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-end: "$"
# End:
