xref: /aosp_15_r20/external/toybox/scripts/install.sh (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
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