android_external_toybox/scripts/install.sh
Rob Landley 6c3188cf0e Add install_airlock target for hermetic build environment setup, and rebuild
headers during install to make other install targets robust against single
command builds between "make" and "make install" of multiplexer version.
2016-10-02 22:41:55 -05:00

153 lines
3.5 KiB
Bash
Executable File

#!/bin/bash
# Grab default values for $CFLAGS and such.
source ./configure
[ -z "$PREFIX" ] && PREFIX="/usr/toybox"
# Parse command line arguments.
LONG_PATH=""
while [ ! -z "$1" ]
do
# Create symlinks instead of hardlinks?
[ "$1" == "--symlink" ] && LINK_TYPE="-s"
# Uninstall?
[ "$1" == "--uninstall" ] && UNINSTALL=Uninstall
# Delete destination command if it exists?
[ "$1" == "--force" ] && DO_FORCE="-f"
# Use {,usr}/{bin,sbin} paths instead of all files in one directory?
[ "$1" == "--long" ] && LONG_PATH="bin/"
# Symlink host toolchain binaries to destination to create cross compile $PATH
[ "$1" == "--airlock" ] && AIRLOCK=1
shift
done
echo "Compile instlist..."
NOBUILD=1 scripts/make.sh
$DEBUG $HOSTCC -I . scripts/install.c -o generated/instlist || exit 1
COMMANDS="$(generated/instlist $LONG_PATH)"
echo "${UNINSTALL:-Install} commands..."
# Copy toybox itself
if [ -z "$UNINSTALL" ]
then
mkdir -p "${PREFIX}/${LONG_PATH}" &&
rm -f "${PREFIX}/${LONG_PATH}/toybox" &&
cp toybox ${PREFIX}/${LONG_PATH} || exit 1
else
rm -f "${PREFIX}/${LONG_PATH}/toybox" 2>/dev/null
fi
cd "$PREFIX" || exit 1
# Make links to toybox
EXIT=0
for i in $COMMANDS
do
# Figure out target of link
if [ -z "$LONG_PATH" ]
then
DOTPATH=""
else
# Create subdirectory for command to go in (if necessary)
DOTPATH="$(dirname "$i")"/
if [ -z "$UNINSTALL" ]
then
mkdir -p "$DOTPATH" || exit 1
fi
if [ -z "$LINK_TYPE" ]
then
DOTPATH="bin/"
else
if [ "$DOTPATH" != "$LONG_PATH" ]
then
# For symlinks we need ../../bin style relative paths
DOTPATH="$(echo $DOTPATH | sed -e 's@[^/]*/@../@g')"$LONG_PATH
else
DOTPATH=""
fi
fi
fi
# Create link
if [ -z "$UNINSTALL" ]
then
ln $DO_FORCE $LINK_TYPE ${DOTPATH}toybox $i || EXIT=1
else
rm -f $i || EXIT=1
fi
done
[ -z "$AIRLOCK" ] && exit 0
# --airlock creates a single directory you can point the $PATH to for cross
# compiling, which contains just toybox and symlinks to toolchain binaries.
# This not only means you're building with a known set of tools (insulated from
# variations in the host distro), but that everything else is NOT in your PATH
# and thus various configure stages won't find things on thie host that won't
# be there on the target (such as the distcc build noticing the host has
# python and deciding to #include Python.h).
# The following are commands toybox should provide, but doesn't yet.
# For now symlink the host version. This list must go away by 1.0.
PENDING="bunzip2 bzcat dd diff expr ftpd ftpget ftpput gunzip less ping route tar test tr vi wget zcat awk bzip2 fdisk gzip sh sha512sum unxz xzcat"
# "gcc" should go away for llvm, but some things still hardwire it
TOOLCHAIN="ar as nm cc make ld gcc objdump"
if [ ! -z "$AIRLOCK" ]
then
# Tools needed to build packages
for i in ar as nm cc make ld gcc objdump $PENDING $HOST_EXTRA
do
if [ ! -f "$i" ]
then
# Loop through each instance, populating fallback directories (used by
# things like distcc, which require multiple instances of the same binary
# in a known order in the $PATH).
X=0
FALLBACK="$PREFIX"
which -a "$i" | while read j
do
if [ ! -e "$FALLBACK/$i" ]
then
mkdir -p "$FALLBACK" &&
ln -sf "$j" "$FALLBACK/$i" || exit 1
fi
X=$[$X+1]
FALLBACK="$PREFIX/fallback-$X"
done
if [ ! -f "$PREFIX/$i" ]
then
echo "Toolchain component missing: $i" >&2
EXIT=1
fi
fi
done
fi
exit $EXIT