1*cf5a6c84SAndroid Build Coastguard Worker#!/bin/bash 2*cf5a6c84SAndroid Build Coastguard Worker 3*cf5a6c84SAndroid Build Coastguard Worker# Grab default values for $CFLAGS and such. 4*cf5a6c84SAndroid Build Coastguard Worker 5*cf5a6c84SAndroid Build Coastguard Workersource scripts/portability.sh 6*cf5a6c84SAndroid Build Coastguard Worker 7*cf5a6c84SAndroid Build Coastguard Worker[ -z "$PREFIX" ] && PREFIX="$PWD/install" 8*cf5a6c84SAndroid Build Coastguard Worker 9*cf5a6c84SAndroid Build Coastguard Worker# Parse command line arguments. 10*cf5a6c84SAndroid Build Coastguard Worker 11*cf5a6c84SAndroid Build Coastguard WorkerLONG_PATH="" 12*cf5a6c84SAndroid Build Coastguard Workerwhile [ ! -z "$1" ] 13*cf5a6c84SAndroid Build Coastguard Workerdo 14*cf5a6c84SAndroid Build Coastguard Worker # Create symlinks instead of hardlinks? 15*cf5a6c84SAndroid Build Coastguard Worker [ "$1" == "--symlink" ] && LINK_TYPE="-s" 16*cf5a6c84SAndroid Build Coastguard Worker 17*cf5a6c84SAndroid Build Coastguard Worker # Uninstall? 18*cf5a6c84SAndroid Build Coastguard Worker [ "$1" == "--uninstall" ] && UNINSTALL=Uninstall 19*cf5a6c84SAndroid Build Coastguard Worker 20*cf5a6c84SAndroid Build Coastguard Worker # Delete destination command if it exists? 21*cf5a6c84SAndroid Build Coastguard Worker [ "$1" == "--force" ] && DO_FORCE="-f" 22*cf5a6c84SAndroid Build Coastguard Worker 23*cf5a6c84SAndroid Build Coastguard Worker # Use {,usr}/{bin,sbin} paths instead of all files in one directory? 24*cf5a6c84SAndroid Build Coastguard Worker [ "$1" == "--long" ] && LONG_PATH="bin/" 25*cf5a6c84SAndroid Build Coastguard Worker 26*cf5a6c84SAndroid Build Coastguard Worker # Symlink host toolchain binaries to destination to create cross compile $PATH 27*cf5a6c84SAndroid Build Coastguard Worker [ "$1" == "--airlock" ] && AIRLOCK=1 28*cf5a6c84SAndroid Build Coastguard Worker 29*cf5a6c84SAndroid Build Coastguard Worker shift 30*cf5a6c84SAndroid Build Coastguard Workerdone 31*cf5a6c84SAndroid Build Coastguard Worker 32*cf5a6c84SAndroid Build Coastguard Workerecho "Compile instlist..." 33*cf5a6c84SAndroid Build Coastguard Worker 34*cf5a6c84SAndroid Build Coastguard Worker$DEBUG $HOSTCC -I . scripts/install.c -o "$UNSTRIPPED"/instlist || exit 1 35*cf5a6c84SAndroid Build Coastguard WorkerCOMMANDS="$("$UNSTRIPPED"/instlist $LONG_PATH)" 36*cf5a6c84SAndroid Build Coastguard Worker 37*cf5a6c84SAndroid Build Coastguard Workerecho "${UNINSTALL:-Install} commands..." 38*cf5a6c84SAndroid Build Coastguard Worker 39*cf5a6c84SAndroid Build Coastguard Worker# Copy toybox itself 40*cf5a6c84SAndroid Build Coastguard Worker 41*cf5a6c84SAndroid Build Coastguard Workerif [ -z "$UNINSTALL" ] 42*cf5a6c84SAndroid Build Coastguard Workerthen 43*cf5a6c84SAndroid Build Coastguard Worker mkdir -p "${PREFIX}/${LONG_PATH}" && 44*cf5a6c84SAndroid Build Coastguard Worker rm -f "${PREFIX}/${LONG_PATH}/toybox" && 45*cf5a6c84SAndroid Build Coastguard Worker cp toybox"${TARGET:+-$TARGET}" ${PREFIX}/${LONG_PATH} || exit 1 46*cf5a6c84SAndroid Build Coastguard Workerelse 47*cf5a6c84SAndroid Build Coastguard Worker rm -f "${PREFIX}/${LONG_PATH}/toybox" 2>/dev/null 48*cf5a6c84SAndroid Build Coastguard Workerfi 49*cf5a6c84SAndroid Build Coastguard Workercd "$PREFIX" || exit 1 50*cf5a6c84SAndroid Build Coastguard Worker 51*cf5a6c84SAndroid Build Coastguard Worker# Make links to toybox 52*cf5a6c84SAndroid Build Coastguard Worker 53*cf5a6c84SAndroid Build Coastguard WorkerEXIT=0 54*cf5a6c84SAndroid Build Coastguard Worker 55*cf5a6c84SAndroid Build Coastguard Workerfor i in $COMMANDS 56*cf5a6c84SAndroid Build Coastguard Workerdo 57*cf5a6c84SAndroid Build Coastguard Worker # Figure out target of link 58*cf5a6c84SAndroid Build Coastguard Worker 59*cf5a6c84SAndroid Build Coastguard Worker if [ -z "$LONG_PATH" ] 60*cf5a6c84SAndroid Build Coastguard Worker then 61*cf5a6c84SAndroid Build Coastguard Worker DOTPATH="" 62*cf5a6c84SAndroid Build Coastguard Worker else 63*cf5a6c84SAndroid Build Coastguard Worker # Create subdirectory for command to go in (if necessary) 64*cf5a6c84SAndroid Build Coastguard Worker 65*cf5a6c84SAndroid Build Coastguard Worker DOTPATH="$(dirname "$i")"/ 66*cf5a6c84SAndroid Build Coastguard Worker if [ -z "$UNINSTALL" ] 67*cf5a6c84SAndroid Build Coastguard Worker then 68*cf5a6c84SAndroid Build Coastguard Worker mkdir -p "$DOTPATH" || exit 1 69*cf5a6c84SAndroid Build Coastguard Worker fi 70*cf5a6c84SAndroid Build Coastguard Worker 71*cf5a6c84SAndroid Build Coastguard Worker if [ -z "$LINK_TYPE" ] 72*cf5a6c84SAndroid Build Coastguard Worker then 73*cf5a6c84SAndroid Build Coastguard Worker DOTPATH="bin/" 74*cf5a6c84SAndroid Build Coastguard Worker else 75*cf5a6c84SAndroid Build Coastguard Worker if [ "$DOTPATH" != "$LONG_PATH" ] 76*cf5a6c84SAndroid Build Coastguard Worker then 77*cf5a6c84SAndroid Build Coastguard Worker # For symlinks we need ../../bin style relative paths 78*cf5a6c84SAndroid Build Coastguard Worker DOTPATH="$(echo $DOTPATH | sed -e 's@[^/]*/@../@g')"$LONG_PATH 79*cf5a6c84SAndroid Build Coastguard Worker else 80*cf5a6c84SAndroid Build Coastguard Worker DOTPATH="" 81*cf5a6c84SAndroid Build Coastguard Worker fi 82*cf5a6c84SAndroid Build Coastguard Worker fi 83*cf5a6c84SAndroid Build Coastguard Worker fi 84*cf5a6c84SAndroid Build Coastguard Worker 85*cf5a6c84SAndroid Build Coastguard Worker # Create link 86*cf5a6c84SAndroid Build Coastguard Worker if [ -z "$UNINSTALL" ] 87*cf5a6c84SAndroid Build Coastguard Worker then 88*cf5a6c84SAndroid Build Coastguard Worker ln $DO_FORCE $LINK_TYPE ${DOTPATH}"toybox${TARGET:+-$TARGET}" $i || EXIT=1 89*cf5a6c84SAndroid Build Coastguard Worker else 90*cf5a6c84SAndroid Build Coastguard Worker rm -f $i || EXIT=1 91*cf5a6c84SAndroid Build Coastguard Worker fi 92*cf5a6c84SAndroid Build Coastguard Workerdone 93*cf5a6c84SAndroid Build Coastguard Worker 94*cf5a6c84SAndroid Build Coastguard Worker[ -z "$AIRLOCK" ] && exit $EXIT 95*cf5a6c84SAndroid Build Coastguard Worker 96*cf5a6c84SAndroid Build Coastguard Worker# --airlock creates a single directory you can point the $PATH to for cross 97*cf5a6c84SAndroid Build Coastguard Worker# compiling, which contains just toybox and symlinks to toolchain binaries. 98*cf5a6c84SAndroid Build Coastguard Worker 99*cf5a6c84SAndroid Build Coastguard Worker# This not only means you're building with a known set of tools (insulated from 100*cf5a6c84SAndroid Build Coastguard Worker# variations in the host distro), but that everything else is NOT in your PATH 101*cf5a6c84SAndroid Build Coastguard Worker# and thus various configure stages won't find things on thie host that won't 102*cf5a6c84SAndroid Build Coastguard Worker# be there on the target (such as the distcc build noticing the host has 103*cf5a6c84SAndroid Build Coastguard Worker# python and deciding to #include Python.h). 104*cf5a6c84SAndroid Build Coastguard Worker 105*cf5a6c84SAndroid Build Coastguard Worker# The following are commands toybox should provide, but doesn't yet. 106*cf5a6c84SAndroid Build Coastguard Worker# For now symlink the host version. This list must go away by 1.0. 107*cf5a6c84SAndroid Build Coastguard Worker 108*cf5a6c84SAndroid Build Coastguard WorkerPENDING="expr git tr bash sh gzip awk bison flex make ar" 109*cf5a6c84SAndroid Build Coastguard WorkerTOOLCHAIN+=" as cc ld objdump bc gcc" 110*cf5a6c84SAndroid Build Coastguard Worker 111*cf5a6c84SAndroid Build Coastguard Worker# Tools needed to build packages 112*cf5a6c84SAndroid Build Coastguard Workerfor i in $TOOLCHAIN $PENDING $HOST_EXTRA 113*cf5a6c84SAndroid Build Coastguard Workerdo 114*cf5a6c84SAndroid Build Coastguard Worker if [ ! -f "$i" ] 115*cf5a6c84SAndroid Build Coastguard Worker then 116*cf5a6c84SAndroid Build Coastguard Worker # Loop through each instance, populating fallback directories (used by 117*cf5a6c84SAndroid Build Coastguard Worker # things like distcc, which require multiple instances of the same binary 118*cf5a6c84SAndroid Build Coastguard Worker # in a known order in the $PATH). 119*cf5a6c84SAndroid Build Coastguard Worker 120*cf5a6c84SAndroid Build Coastguard Worker X=0 121*cf5a6c84SAndroid Build Coastguard Worker FALLBACK="$PREFIX" 122*cf5a6c84SAndroid Build Coastguard Worker which -a "$i" | while read j 123*cf5a6c84SAndroid Build Coastguard Worker do 124*cf5a6c84SAndroid Build Coastguard Worker if [ ! -e "$FALLBACK/$i" ] 125*cf5a6c84SAndroid Build Coastguard Worker then 126*cf5a6c84SAndroid Build Coastguard Worker mkdir -p "$FALLBACK" && 127*cf5a6c84SAndroid Build Coastguard Worker ln -sf "$j" "$FALLBACK/$i" || exit 1 128*cf5a6c84SAndroid Build Coastguard Worker fi 129*cf5a6c84SAndroid Build Coastguard Worker 130*cf5a6c84SAndroid Build Coastguard Worker X=$[$X+1] 131*cf5a6c84SAndroid Build Coastguard Worker FALLBACK="$PREFIX/fallback-$X" 132*cf5a6c84SAndroid Build Coastguard Worker done 133*cf5a6c84SAndroid Build Coastguard Worker 134*cf5a6c84SAndroid Build Coastguard Worker if [ ! -f "$PREFIX/$i" ] 135*cf5a6c84SAndroid Build Coastguard Worker then 136*cf5a6c84SAndroid Build Coastguard Worker echo "Toolchain component missing: $i" >&2 137*cf5a6c84SAndroid Build Coastguard Worker [ -z "$PEDANTIC" ] || EXIT=1 138*cf5a6c84SAndroid Build Coastguard Worker fi 139*cf5a6c84SAndroid Build Coastguard Worker fi 140*cf5a6c84SAndroid Build Coastguard Workerdone 141*cf5a6c84SAndroid Build Coastguard Worker 142*cf5a6c84SAndroid Build Coastguard Workerexit $EXIT 143