mirror of
https://git.busybox.net/busybox.git
synced 2024-11-24 06:03:27 +08:00
3d07446cef
Symlinks in a subdirectory that is to become target rootfs are sometimes dangling because they link to canonical file names that are not present on the host, but are present relative to the target rootfs root. Don't copy over dangling symlinks when noclobber is enabled The -e test treats dangling symlinks as non-existent files. Add -h test that returns true for all symlinks. Cc: Yann E. MORIN <yann.morin.1998@free.fr> Signed-off-by: Baruch Siach <baruch@tkos.co.il> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
138 lines
3.2 KiB
Bash
Executable File
138 lines
3.2 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 TYPE [OPTS ...]"
|
|
echo " TYPE is one of: --symlinks --hardlinks --binaries --scriptwrapper --none"
|
|
echo " OPTS is one or more of: --cleanup --noclobber"
|
|
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";;
|
|
--none) 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" ] || [ -h "$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
|