You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
3.5 KiB
146 lines
3.5 KiB
#!/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"${TARGET:+-$TARGET}" ${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${TARGET:+-$TARGET}" $i || EXIT=1
|
|
else
|
|
rm -f $i || EXIT=1
|
|
fi
|
|
done
|
|
|
|
[ -z "$AIRLOCK" ] && exit $EXIT
|
|
|
|
# --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="dd diff expr ftpd less tr vi wget awk sh sha512sum sha256sum unxz xzcat bc bison flex make nm ar gzip"
|
|
|
|
# "gcc" should go away for llvm, but some things still hardwire it
|
|
TOOLCHAIN="as cc ld gcc objdump"
|
|
|
|
# Tools needed to build packages
|
|
for i in $TOOLCHAIN $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
|
|
[ -z "$PEDANTIC" ] || EXIT=1
|
|
fi
|
|
fi
|
|
done
|
|
|
|
exit $EXIT
|