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