1*6777b538SAndroid Build Coastguard Worker#!/bin/sh 2*6777b538SAndroid Build Coastguard Worker# py-compile - Compile a Python program 3*6777b538SAndroid Build Coastguard Worker 4*6777b538SAndroid Build Coastguard Workerscriptversion=2021-02-27.01; # UTC 5*6777b538SAndroid Build Coastguard Worker 6*6777b538SAndroid Build Coastguard Worker# Copyright (C) 2000-2021 Free Software Foundation, Inc. 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker# This program is free software; you can redistribute it and/or modify 9*6777b538SAndroid Build Coastguard Worker# it under the terms of the GNU General Public License as published by 10*6777b538SAndroid Build Coastguard Worker# the Free Software Foundation; either version 2, or (at your option) 11*6777b538SAndroid Build Coastguard Worker# any later version. 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker# This program is distributed in the hope that it will be useful, 14*6777b538SAndroid Build Coastguard Worker# but WITHOUT ANY WARRANTY; without even the implied warranty of 15*6777b538SAndroid Build Coastguard Worker# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16*6777b538SAndroid Build Coastguard Worker# GNU General Public License for more details. 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker# You should have received a copy of the GNU General Public License 19*6777b538SAndroid Build Coastguard Worker# along with this program. If not, see <https://www.gnu.org/licenses/>. 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker# As a special exception to the GNU General Public License, if you 22*6777b538SAndroid Build Coastguard Worker# distribute this file as part of a program that contains a 23*6777b538SAndroid Build Coastguard Worker# configuration script generated by Autoconf, you may include it under 24*6777b538SAndroid Build Coastguard Worker# the same distribution terms that you use for the rest of that program. 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker# This file is maintained in Automake, please report 27*6777b538SAndroid Build Coastguard Worker# bugs to <[email protected]> or send patches to 28*6777b538SAndroid Build Coastguard Worker# <[email protected]>. 29*6777b538SAndroid Build Coastguard Worker 30*6777b538SAndroid Build Coastguard Workerif test -z "$PYTHON"; then 31*6777b538SAndroid Build Coastguard Worker PYTHON=python 32*6777b538SAndroid Build Coastguard Workerfi 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard Workerme=py-compile 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Workerusage_error () 37*6777b538SAndroid Build Coastguard Worker{ 38*6777b538SAndroid Build Coastguard Worker echo "$me: $*" >&2 39*6777b538SAndroid Build Coastguard Worker echo "Try '$me --help' for more information." >&2 40*6777b538SAndroid Build Coastguard Worker exit 1 41*6777b538SAndroid Build Coastguard Worker} 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Workerbasedir= 44*6777b538SAndroid Build Coastguard Workerdestdir= 45*6777b538SAndroid Build Coastguard Workerwhile test $# -ne 0; do 46*6777b538SAndroid Build Coastguard Worker case "$1" in 47*6777b538SAndroid Build Coastguard Worker --basedir) 48*6777b538SAndroid Build Coastguard Worker if test $# -lt 2; then 49*6777b538SAndroid Build Coastguard Worker usage_error "option '--basedir' requires an argument" 50*6777b538SAndroid Build Coastguard Worker else 51*6777b538SAndroid Build Coastguard Worker basedir=$2 52*6777b538SAndroid Build Coastguard Worker fi 53*6777b538SAndroid Build Coastguard Worker shift 54*6777b538SAndroid Build Coastguard Worker ;; 55*6777b538SAndroid Build Coastguard Worker --destdir) 56*6777b538SAndroid Build Coastguard Worker if test $# -lt 2; then 57*6777b538SAndroid Build Coastguard Worker usage_error "option '--destdir' requires an argument" 58*6777b538SAndroid Build Coastguard Worker else 59*6777b538SAndroid Build Coastguard Worker destdir=$2 60*6777b538SAndroid Build Coastguard Worker fi 61*6777b538SAndroid Build Coastguard Worker shift 62*6777b538SAndroid Build Coastguard Worker ;; 63*6777b538SAndroid Build Coastguard Worker -h|--help) 64*6777b538SAndroid Build Coastguard Worker cat <<\EOF 65*6777b538SAndroid Build Coastguard WorkerUsage: py-compile [--help] [--version] [--basedir DIR] [--destdir DIR] FILES..." 66*6777b538SAndroid Build Coastguard Worker 67*6777b538SAndroid Build Coastguard WorkerByte compile some python scripts FILES. Use --destdir to specify any 68*6777b538SAndroid Build Coastguard Workerleading directory path to the FILES that you don't want to include in the 69*6777b538SAndroid Build Coastguard Workerbyte compiled file. Specify --basedir for any additional path information you 70*6777b538SAndroid Build Coastguard Workerdo want to be shown in the byte compiled file. 71*6777b538SAndroid Build Coastguard Worker 72*6777b538SAndroid Build Coastguard WorkerExample: 73*6777b538SAndroid Build Coastguard Worker py-compile --destdir /tmp/pkg-root --basedir /usr/share/test test.py test2.py 74*6777b538SAndroid Build Coastguard Worker 75*6777b538SAndroid Build Coastguard WorkerReport bugs to <[email protected]>. 76*6777b538SAndroid Build Coastguard WorkerEOF 77*6777b538SAndroid Build Coastguard Worker exit $? 78*6777b538SAndroid Build Coastguard Worker ;; 79*6777b538SAndroid Build Coastguard Worker -v|--version) 80*6777b538SAndroid Build Coastguard Worker echo "$me $scriptversion" 81*6777b538SAndroid Build Coastguard Worker exit $? 82*6777b538SAndroid Build Coastguard Worker ;; 83*6777b538SAndroid Build Coastguard Worker --) 84*6777b538SAndroid Build Coastguard Worker shift 85*6777b538SAndroid Build Coastguard Worker break 86*6777b538SAndroid Build Coastguard Worker ;; 87*6777b538SAndroid Build Coastguard Worker -*) 88*6777b538SAndroid Build Coastguard Worker usage_error "unrecognized option '$1'" 89*6777b538SAndroid Build Coastguard Worker ;; 90*6777b538SAndroid Build Coastguard Worker *) 91*6777b538SAndroid Build Coastguard Worker break 92*6777b538SAndroid Build Coastguard Worker ;; 93*6777b538SAndroid Build Coastguard Worker esac 94*6777b538SAndroid Build Coastguard Worker shift 95*6777b538SAndroid Build Coastguard Workerdone 96*6777b538SAndroid Build Coastguard Worker 97*6777b538SAndroid Build Coastguard Workerfiles=$* 98*6777b538SAndroid Build Coastguard Workerif test -z "$files"; then 99*6777b538SAndroid Build Coastguard Worker usage_error "no files given" 100*6777b538SAndroid Build Coastguard Workerfi 101*6777b538SAndroid Build Coastguard Worker 102*6777b538SAndroid Build Coastguard Worker# if basedir was given, then it should be prepended to filenames before 103*6777b538SAndroid Build Coastguard Worker# byte compilation. 104*6777b538SAndroid Build Coastguard Workerif test -z "$basedir"; then 105*6777b538SAndroid Build Coastguard Worker pathtrans="path = file" 106*6777b538SAndroid Build Coastguard Workerelse 107*6777b538SAndroid Build Coastguard Worker pathtrans="path = os.path.join('$basedir', file)" 108*6777b538SAndroid Build Coastguard Workerfi 109*6777b538SAndroid Build Coastguard Worker 110*6777b538SAndroid Build Coastguard Worker# if destdir was given, then it needs to be prepended to the filename to 111*6777b538SAndroid Build Coastguard Worker# byte compile but not go into the compiled file. 112*6777b538SAndroid Build Coastguard Workerif test -z "$destdir"; then 113*6777b538SAndroid Build Coastguard Worker filetrans="filepath = path" 114*6777b538SAndroid Build Coastguard Workerelse 115*6777b538SAndroid Build Coastguard Worker filetrans="filepath = os.path.normpath('$destdir' + os.sep + path)" 116*6777b538SAndroid Build Coastguard Workerfi 117*6777b538SAndroid Build Coastguard Worker 118*6777b538SAndroid Build Coastguard Workerpython_major=`$PYTHON -V 2>&1 | sed -e 's/.* //;s/\..*$//;1q'` 119*6777b538SAndroid Build Coastguard Workerif test -z "$python_major"; then 120*6777b538SAndroid Build Coastguard Worker echo "$me: could not determine $PYTHON major version, guessing 3" >&2 121*6777b538SAndroid Build Coastguard Worker python_major=3 122*6777b538SAndroid Build Coastguard Workerfi 123*6777b538SAndroid Build Coastguard Worker 124*6777b538SAndroid Build Coastguard Worker# The old way to import libraries was deprecated. 125*6777b538SAndroid Build Coastguard Workerif test "$python_major" -le 2; then 126*6777b538SAndroid Build Coastguard Worker import_lib=imp 127*6777b538SAndroid Build Coastguard Worker import_test="hasattr(imp, 'get_tag')" 128*6777b538SAndroid Build Coastguard Worker import_call=imp.cache_from_source 129*6777b538SAndroid Build Coastguard Worker import_arg2=', False' # needed in one call and not the other 130*6777b538SAndroid Build Coastguard Workerelse 131*6777b538SAndroid Build Coastguard Worker import_lib=importlib 132*6777b538SAndroid Build Coastguard Worker import_test="hasattr(sys.implementation, 'cache_tag')" 133*6777b538SAndroid Build Coastguard Worker import_call=importlib.util.cache_from_source 134*6777b538SAndroid Build Coastguard Worker import_arg2= 135*6777b538SAndroid Build Coastguard Workerfi 136*6777b538SAndroid Build Coastguard Worker 137*6777b538SAndroid Build Coastguard Worker$PYTHON -c " 138*6777b538SAndroid Build Coastguard Workerimport sys, os, py_compile, $import_lib 139*6777b538SAndroid Build Coastguard Worker 140*6777b538SAndroid Build Coastguard Workerfiles = '''$files''' 141*6777b538SAndroid Build Coastguard Worker 142*6777b538SAndroid Build Coastguard Workersys.stdout.write('Byte-compiling python modules...\n') 143*6777b538SAndroid Build Coastguard Workerfor file in files.split(): 144*6777b538SAndroid Build Coastguard Worker $pathtrans 145*6777b538SAndroid Build Coastguard Worker $filetrans 146*6777b538SAndroid Build Coastguard Worker if not os.path.exists(filepath) or not (len(filepath) >= 3 147*6777b538SAndroid Build Coastguard Worker and filepath[-3:] == '.py'): 148*6777b538SAndroid Build Coastguard Worker continue 149*6777b538SAndroid Build Coastguard Worker sys.stdout.write(file) 150*6777b538SAndroid Build Coastguard Worker sys.stdout.flush() 151*6777b538SAndroid Build Coastguard Worker if $import_test: 152*6777b538SAndroid Build Coastguard Worker py_compile.compile(filepath, $import_call(filepath), path) 153*6777b538SAndroid Build Coastguard Worker else: 154*6777b538SAndroid Build Coastguard Worker py_compile.compile(filepath, filepath + 'c', path) 155*6777b538SAndroid Build Coastguard Workersys.stdout.write('\n')" || exit $? 156*6777b538SAndroid Build Coastguard Worker 157*6777b538SAndroid Build Coastguard Worker# this will fail for python < 1.5, but that doesn't matter ... 158*6777b538SAndroid Build Coastguard Worker$PYTHON -O -c " 159*6777b538SAndroid Build Coastguard Workerimport sys, os, py_compile, $import_lib 160*6777b538SAndroid Build Coastguard Worker 161*6777b538SAndroid Build Coastguard Worker# pypy does not use .pyo optimization 162*6777b538SAndroid Build Coastguard Workerif hasattr(sys, 'pypy_translation_info'): 163*6777b538SAndroid Build Coastguard Worker sys.exit(0) 164*6777b538SAndroid Build Coastguard Worker 165*6777b538SAndroid Build Coastguard Workerfiles = '''$files''' 166*6777b538SAndroid Build Coastguard Workersys.stdout.write('Byte-compiling python modules (optimized versions) ...\n') 167*6777b538SAndroid Build Coastguard Workerfor file in files.split(): 168*6777b538SAndroid Build Coastguard Worker $pathtrans 169*6777b538SAndroid Build Coastguard Worker $filetrans 170*6777b538SAndroid Build Coastguard Worker if not os.path.exists(filepath) or not (len(filepath) >= 3 171*6777b538SAndroid Build Coastguard Worker and filepath[-3:] == '.py'): 172*6777b538SAndroid Build Coastguard Worker continue 173*6777b538SAndroid Build Coastguard Worker sys.stdout.write(file) 174*6777b538SAndroid Build Coastguard Worker sys.stdout.flush() 175*6777b538SAndroid Build Coastguard Worker if $import_test: 176*6777b538SAndroid Build Coastguard Worker py_compile.compile(filepath, $import_call(filepath$import_arg2), path) 177*6777b538SAndroid Build Coastguard Worker else: 178*6777b538SAndroid Build Coastguard Worker py_compile.compile(filepath, filepath + 'o', path) 179*6777b538SAndroid Build Coastguard Workersys.stdout.write('\n')" 2>/dev/null || exit $? 180*6777b538SAndroid Build Coastguard Worker 181*6777b538SAndroid Build Coastguard Worker# Local Variables: 182*6777b538SAndroid Build Coastguard Worker# mode: shell-script 183*6777b538SAndroid Build Coastguard Worker# sh-indentation: 2 184*6777b538SAndroid Build Coastguard Worker# eval: (add-hook 'before-save-hook 'time-stamp) 185*6777b538SAndroid Build Coastguard Worker# time-stamp-start: "scriptversion=" 186*6777b538SAndroid Build Coastguard Worker# time-stamp-format: "%:y-%02m-%02d.%02H" 187*6777b538SAndroid Build Coastguard Worker# time-stamp-time-zone: "UTC0" 188*6777b538SAndroid Build Coastguard Worker# time-stamp-end: "; # UTC" 189*6777b538SAndroid Build Coastguard Worker# End: 190