packages/lang/python/python-package-install.sh
Jeffery To 85c805d0ad python,python3: Increase max recursion level when generating bytecode
"python -m compileall" has a default maximum recursion level of 10, i.e.
it will descend up to 10 levels of subdirectories when looking for
source files to compile. This is usually sufficient but there are
packages that include more than 10 levels (botocore,
https://github.com/openwrt/packages/pull/8214#discussion_r270056741).

This adds the "-r" command line option to the call to compileall to
increase the max recursion level (currently set to 20).

This also patches Python 2's compileall.py to add this max recursion
level option. (Python 3's compileall.py already supports this option.)

This also applies some related changes to python-package-install.sh:

* Use the "-delete" option with find instead of exec'ing rm / rmdir. For
  the case of removing empty directories (in delete_empty_dirs()), this
  has the added benefit of simplifying the code, as the "-delete" option
  implies "-depth", and thus find "does the right thing" (removing empty
  directories depth-first).

* Remove the backslash in "-name" patterns (for find), as they are not
  regular expression but glob patterns.

Signed-off-by: Jeffery To <jeffery.to@gmail.com>
2019-04-04 03:07:02 +08:00

102 lines
2.3 KiB
Bash

#!/bin/sh
set -e
[ -z "$SOURCE_DATE_EPOCH" ] || {
PYTHONHASHSEED="$SOURCE_DATE_EPOCH"
export PYTHONHASHSEED
}
process_filespec() {
local src_dir="$1"
local dst_dir="$2"
local filespec="$3"
echo "$filespec" | (
IFS='|'
while read fop fspec fperm; do
local fop=`echo "$fop" | tr -d ' \t\n'`
if [ "$fop" = "+" ]; then
if [ ! -e "${src_dir}${fspec}" ]; then
echo "File not found '${src_dir}${fspec}'"
exit 1
fi
dpath=`dirname "$fspec"`
if [ -z "$fperm" ]; then
dperm=`stat -c "%a" ${src_dir}${dpath}`
fi
mkdir -p -m$dperm ${dst_dir}${dpath}
echo "copying: '$fspec'"
cp -fpR ${src_dir}${fspec} ${dst_dir}${dpath}/
if [ -n "$fperm" ]; then
chmod -R $fperm ${dst_dir}${fspec}
fi
elif [ "$fop" = "-" ]; then
echo "removing: '$fspec'"
rm -fR ${dst_dir}${fspec}
elif [ "$fop" = "=" ]; then
echo "setting permissions: '$fperm' on '$fspec'"
chmod -R $fperm ${dst_dir}${fspec}
fi
done
)
}
delete_empty_dirs() {
local dst_dir="$1"
if [ -d "$dst_dir/usr" ] ; then
find "$dst_dir/usr" -empty -type d -delete
fi
}
ver="$1"
src_dir="$2"
dst_dir="$3"
python="$4"
mode="$5"
filespec="$6"
SED="${SED:-sed -e}"
find "$src_dir" -name "*.exe" -delete
process_filespec "$src_dir" "$dst_dir" "$filespec" || {
echo "process filespec error-ed"
exit 1
}
usr_bin_dir="$dst_dir/usr/bin"
if [ -d "$usr_bin_dir" ] ; then
$SED "1"'!'"b;s,^#"'!'".*python.*,#"'!'"/usr/bin/python${ver}," -i --follow-symlinks $usr_bin_dir/*
fi
if [ "$mode" == "sources" ] ; then
# Copy only python source files
find "$dst_dir" -not -type d -not -name "*.py" -delete
delete_empty_dirs "$dst_dir"
exit 0
fi
legacy=
[ "$ver" == "3" ] && legacy="-b"
# default max recursion is 10
max_recursion_level=20
# XXX [So that you won't goof as I did]
# Note: Yes, I tried to use the -O & -OO flags here.
# However the generated byte-codes were not portable.
# So, we just stuck to un-optimized byte-codes,
# which is still way better/faster than running
# Python sources all the time.
$python -m compileall -r "$max_recursion_level" $legacy -d '/' "$dst_dir" || {
echo "python -m compileall err-ed"
exit 1
}
# Delete source files and pyc [ un-optimized bytecode files ]
# We may want to make this optimization thing configurable later, but not sure atm
find "$dst_dir" -type f -name "*.py" -delete
delete_empty_dirs "$dst_dir"
exit 0