love-linux-builder/tarball/build.sh

84 lines
1.8 KiB
Bash
Executable File

#!/bin/bash
DEST="$(pwd)/dest"
declare -a libpaths=()
getdeps()
{
ldd "$1" | awk '{print $3}'
}
systemlib()
{
case "$(basename "$1")" in
libc.so* | \
libm.so* | \
libdl.so* | \
librt.so* | \
libpthread.so* | \
libstdc++.so* )
return 0
;;
*)
return 1
;;
esac
}
copy()
{
# Skip system libraries
if ! test -f "$1" || systemlib "$1"; then
echo "Skipping $1"
return
fi
# Copy files to their paths, with $DEST as prefix (so /usr/lib -> $DEST/usr/lib)
echo "Copying $1"
mkdir -p "$DEST/$(dirname "$1")"
cp "$1" "$DEST/$1"
libpaths+=("$(dirname "$1")")
}
main()
{
local appbin="$(which "$1")"
local appname="$(basename "$appbin")"
# Now copy all binaries and libraries
copy "$appbin"
for dep in $(getdeps "$appbin"); do
copy "$dep"
done
# Copy libstdc++ into its own location
echo "Copying libstdc++"
mkdir -p "$DEST/libstdc++/"
cp "/usr/lib/x86_64-linux-gnu/libstdc++.so.6" "$DEST/libstdc++/" # TODO: find libstdc++ on host
# Build LD_LIBRARY_PATH string
local libpath=""
while read path; do
if [[ "$libpath" != "" ]]; then
libpath="$libpath:"
fi
libpath="${libpath}\${LOVE_LAUNCHER_LOCATION}$path" # TODO
done <<< "$(printf '%s\n' "${libpaths[@]}" | sort -u)"
# Generate wrapper
(
printf '#!/bin/sh\n'
printf 'export LOVE_LAUNCHER_LOCATION="$(dirname "$(which "$0")")"\n'
printf 'export LD_LIBRARY_PATH="%s:$LD_LIBRARY_PATH"\n' "$libpath"
printf 'ldconfig -p | grep -q libstdc++ || export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${LOVE_LAUNCHER_LOCATION}/libstdc++/"\n'
printf 'exec ${LOVE_BIN_WRAPPER} "${LOVE_LAUNCHER_LOCATION}%s" "$@"\n' "$appbin"
) > "$DEST/$appname"
chmod +x "$DEST/$appname"
# Add our icon and prototype desktop file
cp "$appname.desktop.in" "$DEST"
cp "$appname.svg" "$DEST"
}
main love