bf39d97e9d
Trying to install busybox with hardlinks and a custom PREFIX will fail for applets not in the /bin directory, because relative pathnames are used. applets/install.sh is *supposed to* use the absolute pathname for hardlinks but it fails to do so because the wrong check is used in the if statement. While fixing it, shore up other sloppy coding in applets/install.sh Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
136 lines
3.1 KiB
Bash
Executable File
136 lines
3.1 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
export LC_ALL=POSIX
|
|
export LC_CTYPE=POSIX
|
|
|
|
prefix=$1
|
|
if [ -z "$prefix" ]; then
|
|
echo "usage: applets/install.sh DESTINATION [--symlinks/--hardlinks/--binaries/--scriptwrapper]"
|
|
exit 1
|
|
fi
|
|
shift # Keep only remaining options
|
|
|
|
# Source the configuration
|
|
. ./.config
|
|
|
|
h=`sort busybox.links | uniq`
|
|
|
|
sharedlib_dir="0_lib"
|
|
|
|
linkopts=""
|
|
scriptwrapper="n"
|
|
binaries="n"
|
|
cleanup="0"
|
|
noclobber="0"
|
|
while [ ${#} -gt 0 ]; do
|
|
case "$1" in
|
|
--hardlinks) linkopts="-f";;
|
|
--symlinks) linkopts="-fs";;
|
|
--binaries) binaries="y";;
|
|
--scriptwrapper) scriptwrapper="y"; swrapall="y";;
|
|
--sw-sh-hard) scriptwrapper="y"; linkopts="-f";;
|
|
--sw-sh-sym) scriptwrapper="y"; linkopts="-fs";;
|
|
--cleanup) cleanup="1";;
|
|
--noclobber) noclobber="1";;
|
|
"") h="";;
|
|
*) echo "Unknown install option: $1"; exit 1;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
if [ -n "$DO_INSTALL_LIBS" ] && [ x"$DO_INSTALL_LIBS" != x"n" ]; then
|
|
# get the target dir for the libs
|
|
# assume it starts with lib
|
|
libdir=$($CC -print-file-name=libc.so | \
|
|
sed -n 's%^.*\(/lib[^\/]*\)/libc.so%\1%p')
|
|
if test -z "$libdir"; then
|
|
libdir=/lib
|
|
fi
|
|
|
|
mkdir -p "$prefix/$libdir" || exit 1
|
|
for i in $DO_INSTALL_LIBS; do
|
|
rm -f "$prefix/$libdir/$i" || exit 1
|
|
if [ -f "$i" ]; then
|
|
echo " Installing $i to the target at $prefix/$libdir/"
|
|
cp -pPR "$i" "$prefix/$libdir/" || exit 1
|
|
chmod 0644 "$prefix/$libdir/`basename $i`" || exit 1
|
|
fi
|
|
done
|
|
fi
|
|
|
|
if [ x"$cleanup" = x"1" ] && [ -e "$prefix/bin/busybox" ]; then
|
|
inode=`ls -i "$prefix/bin/busybox" | awk '{print $1}'`
|
|
sub_shell_it=`
|
|
cd "$prefix"
|
|
for d in usr/sbin usr/bin sbin bin; do
|
|
pd=$PWD
|
|
if [ -d "$d" ]; then
|
|
cd "$d"
|
|
ls -iL . | grep "^ *$inode" | awk '{print $2}' | env -i xargs rm -f
|
|
fi
|
|
cd "$pd"
|
|
done
|
|
`
|
|
exit 0
|
|
fi
|
|
|
|
rm -f "$prefix/bin/busybox" || exit 1
|
|
mkdir -p "$prefix/bin" || exit 1
|
|
install -m 755 busybox "$prefix/bin/busybox" || exit 1
|
|
|
|
for i in $h; do
|
|
appdir=`dirname "$i"`
|
|
app=`basename "$i"`
|
|
if [ x"$noclobber" = x"1" ] && [ -e "$prefix/$i" ]; then
|
|
echo " $prefix/$i already exists"
|
|
continue
|
|
fi
|
|
mkdir -p "$prefix/$appdir" || exit 1
|
|
if [ x"$scriptwrapper" = x"y" ]; then
|
|
if [ x"$swrapall" != x"y" ] && [ x"$i" = x"/bin/sh" ]; then
|
|
ln $linkopts busybox "$prefix/$i" || exit 1
|
|
else
|
|
rm -f "$prefix/$i"
|
|
echo "#!/bin/busybox" >"$prefix/$i"
|
|
chmod +x "$prefix/$i"
|
|
fi
|
|
echo " $prefix/$i"
|
|
elif [ x"$binaries" = x"y" ]; then
|
|
# Copy the binary over rather
|
|
if [ -e "$sharedlib_dir/$app" ]; then
|
|
echo " Copying $sharedlib_dir/$app to $prefix/$i"
|
|
cp -pPR "$sharedlib_dir/$app" "$prefix/$i" || exit 1
|
|
else
|
|
echo "Error: Could not find $sharedlib_dir/$app"
|
|
exit 1
|
|
fi
|
|
else
|
|
if [ x"$linkopts" = x"-f" ]; then
|
|
bb_path="$prefix/bin/busybox"
|
|
else
|
|
case "$appdir" in
|
|
/)
|
|
bb_path="bin/busybox"
|
|
;;
|
|
/bin)
|
|
bb_path="busybox"
|
|
;;
|
|
/sbin)
|
|
bb_path="../bin/busybox"
|
|
;;
|
|
/usr/bin | /usr/sbin)
|
|
bb_path="../../bin/busybox"
|
|
;;
|
|
*)
|
|
echo "Unknown installation directory: $appdir"
|
|
exit 1
|
|
;;
|
|
esac
|
|
fi
|
|
echo " $prefix/$i -> $bb_path"
|
|
ln $linkopts "$bb_path" "$prefix/$i" || exit 1
|
|
fi
|
|
done
|
|
|
|
exit 0
|