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