core/pkgs/by-name/te/texlive/make-bin-containers.sh
2024-05-13 11:34:52 -04:00

61 lines
1.8 KiB
Bash

# load realpath
loadables="$(command -v bash)"
loadables="${loadables%/bin/bash}/lib/bash"
enable -f "$loadables/realpath" realpath
mkdir -p "$out/bin"
# find interpreters
export interpPerl="$(PATH="$HOST_PATH" command -v perl)"
export interpJava="$(PATH="$HOST_PATH" command -v java || :)"
export interpWish="$(PATH="$HOST_PATH" command -v wish || :)"
# prepare sed script
substituteAll "$patchScripts" patch-scripts.sed
for binname in $binfiles ; do
# binlinks to be created last, after the other binaries are in place
if [[ " $binlinks " == *" $binname "* ]] ; then
continue
fi
output="$out/bin/$binname"
# look for existing binary from bin.*
target="$(PATH="$HOST_PATH" command -v "$binname" || :)"
if [[ -n "$target" && -x "$target" ]] ; then
ln -s "$(realpath "$target")" "$output"
continue
fi
# look for scripts
# the explicit list of extensions avoid non-scripts such as $binname.cmd, $binname.jar, $binname.pm
# the order is relevant: $binname.sh is preferred to other $binname.*
for folder in $scriptsFolder ; do
for script in "$folder/$binname"{,.sh,.lua,.pl,.py,.rb,.sno,.tcl,.texlua,.tlu}; do
if [[ -f "$script" ]] ; then
sed -f patch-scripts.sed \
-e 's/^scriptname=`basename "\$0"`$/'"scriptname='$(basename "$binname")'/" \
-e 's/^scriptname=`basename "\$0" .sh`$'"/scriptname='$(basename "$binname" .sh)'/" \
"$script" > "$output"
chmod +x "$output"
continue 3
fi
done
done
echo "error: could not find source for 'bin/$binname'" >&2
exit 1
done
# patch shebangs
patchShebangs "$out/bin"
# generate links
# we canonicalise the source to avoid symlink chains, and to check that it exists
cd "$out"/bin
for alias in $binlinks ; do
target="${bintargets%% *}"
bintargets="${bintargets#* }"
ln -s "$(realpath "$target")" "$out/bin/$alias"
done