xref: /aosp_15_r20/external/cronet/third_party/libxml/src/py-compile (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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