#!/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 for _ in $(seq 1 10) ; do find "$dst_dir/usr" -empty -type d -exec rmdir {} \; || continue break done rmdir "$dst_dir/usr" || true fi } ver="$1" src_dir="$2" dst_dir="$3" python="$4" mode="$5" filespec="$6" SED="${SED:-sed -e}" find "$src_dir" -name "*\.exe" -exec rm -f {} \; 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" -exec rm -f {} \; delete_empty_dirs "$dst_dir" exit 0 fi legacy= [ "$ver" == "3" ] && legacy="-b" # 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 $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" -exec rm -f {} \; delete_empty_dirs "$dst_dir" exit 0