"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>
102 lines
2.3 KiB
Bash
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
|