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