11d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich#!/bin/sh
21d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# py-compile - Compile a Python program
31d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
41d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichscriptversion=2011-06-08.12; # UTC
51d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
61d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# Copyright (C) 2000, 2001, 2003, 2004, 2005, 2008, 2009, 2011 Free
71d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# Software Foundation, Inc.
81d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
91d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# This program is free software; you can redistribute it and/or modify
101d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# it under the terms of the GNU General Public License as published by
111d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# the Free Software Foundation; either version 2, or (at your option)
121d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# any later version.
131d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
141d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# This program is distributed in the hope that it will be useful,
151d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# but WITHOUT ANY WARRANTY; without even the implied warranty of
161d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
171d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# GNU General Public License for more details.
181d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
191d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# You should have received a copy of the GNU General Public License
201d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# along with this program.  If not, see <http://www.gnu.org/licenses/>.
211d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
221d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# As a special exception to the GNU General Public License, if you
231d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# distribute this file as part of a program that contains a
241d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# configuration script generated by Autoconf, you may include it under
251d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# the same distribution terms that you use for the rest of that program.
261d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
271d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# This file is maintained in Automake, please report
281d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# bugs to <bug-automake@gnu.org> or send patches to
291d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# <automake-patches@gnu.org>.
301d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
311d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichif [ -z "$PYTHON" ]; then
321d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  PYTHON=python
331d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichfi
341d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
351d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichme=py-compile
361d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
371d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichusage_error ()
381d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich{
391d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  echo "$me: $*" >&2
401d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  echo "Try \`$me --help' for more information." >&2
411d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  exit 1
421d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich}
431d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
441d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichbasedir=
451d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichdestdir=
461d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichwhile test $# -ne 0; do
471d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  case "$1" in
481d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    --basedir)
491d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      if test $# -lt 2; then
501d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich        usage_error "option '--basedir' requires an argument"
511d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      else
521d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich        basedir=$2
531d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      fi
541d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      shift
551d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      ;;
561d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    --destdir)
571d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      if test $# -lt 2; then
581d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich        usage_error "option '--destdir' requires an argument"
591d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      else
601d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich        destdir=$2
611d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      fi
621d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      shift
631d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      ;;
641d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    -h|--help)
651d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      cat <<\EOF
661d1011a3c5049a7f9eef99d22f3704e4367579ccNick KralevichUsage: py-compile [--help] [--version] [--basedir DIR] [--destdir DIR] FILES..."
671d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
681d1011a3c5049a7f9eef99d22f3704e4367579ccNick KralevichByte compile some python scripts FILES.  Use --destdir to specify any
691d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichleading directory path to the FILES that you don't want to include in the
701d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichbyte compiled file.  Specify --basedir for any additional path information you
711d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichdo want to be shown in the byte compiled file.
721d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
731d1011a3c5049a7f9eef99d22f3704e4367579ccNick KralevichExample:
741d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  py-compile --destdir /tmp/pkg-root --basedir /usr/share/test test.py test2.py
751d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
761d1011a3c5049a7f9eef99d22f3704e4367579ccNick KralevichReport bugs to <bug-automake@gnu.org>.
771d1011a3c5049a7f9eef99d22f3704e4367579ccNick KralevichEOF
781d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      exit $?
791d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      ;;
801d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    -v|--version)
811d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      echo "$me $scriptversion"
821d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      exit $?
831d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      ;;
841d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    --)
851d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      shift
861d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      break
871d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      ;;
881d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    -*)
891d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      usage_error "unrecognized option '$1'"
901d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      ;;
911d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    *)
921d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      break
931d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich      ;;
941d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  esac
951d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich  shift
961d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichdone
971d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
981d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichfiles=$*
991d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichif test -z "$files"; then
1001d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    usage_error "no files given"
1011d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichfi
1021d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1031d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# if basedir was given, then it should be prepended to filenames before
1041d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# byte compilation.
1051d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichif [ -z "$basedir" ]; then
1061d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    pathtrans="path = file"
1071d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichelse
1081d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    pathtrans="path = os.path.join('$basedir', file)"
1091d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichfi
1101d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1111d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# if destdir was given, then it needs to be prepended to the filename to
1121d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# byte compile but not go into the compiled file.
1131d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichif [ -z "$destdir" ]; then
1141d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    filetrans="filepath = path"
1151d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichelse
1161d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    filetrans="filepath = os.path.normpath('$destdir' + os.sep + path)"
1171d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichfi
1181d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1191d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich$PYTHON -c "
1201d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichimport sys, os, py_compile
1211d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1221d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichfiles = '''$files'''
1231d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1241d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichsys.stdout.write('Byte-compiling python modules...\n')
1251d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichfor file in files.split():
1261d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    $pathtrans
1271d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    $filetrans
1281d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    if not os.path.exists(filepath) or not (len(filepath) >= 3
1291d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich                                            and filepath[-3:] == '.py'):
1301d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	    continue
1311d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    sys.stdout.write(file)
1321d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    sys.stdout.flush()
1331d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    py_compile.compile(filepath, filepath + 'c', path)
1341d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichsys.stdout.write('\n')" || exit $?
1351d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1361d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# this will fail for python < 1.5, but that doesn't matter ...
1371d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich$PYTHON -O -c "
1381d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichimport sys, os, py_compile
1391d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1401d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichfiles = '''$files'''
1411d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichsys.stdout.write('Byte-compiling python modules (optimized versions) ...\n')
1421d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichfor file in files.split():
1431d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    $pathtrans
1441d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    $filetrans
1451d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    if not os.path.exists(filepath) or not (len(filepath) >= 3
1461d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich                                            and filepath[-3:] == '.py'):
1471d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich	    continue
1481d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    sys.stdout.write(file)
1491d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    sys.stdout.flush()
1501d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich    py_compile.compile(filepath, filepath + 'o', path)
1511d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevichsys.stdout.write('\n')" 2>/dev/null || :
1521d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich
1531d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# Local Variables:
1541d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# mode: shell-script
1551d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# sh-indentation: 2
1561d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# eval: (add-hook 'write-file-hooks 'time-stamp)
1571d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# time-stamp-start: "scriptversion="
1581d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# time-stamp-format: "%:y-%02m-%02d.%02H"
1591d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# time-stamp-time-zone: "UTC"
1601d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# time-stamp-end: "; # UTC"
1611d1011a3c5049a7f9eef99d22f3704e4367579ccNick Kralevich# End:
162