56caab882c23141be2518e249bc372bfc168782e
[platform/upstream/bash.git] / support / mkclone
1 #! /bin/bash
2 #
3 # mkclone - symlink every file appearing in $src/MANIFEST to a corresponding
4 #           file in the target directory ($1).  Directories specified in
5 #           MANIFEST are created in the target directory
6 #
7 prog=`basename $0`
8
9 SRCDIR=src
10
11 USAGE="usage: $prog [-m manifest] [-s srcdir] [-v] [-d] [-h] target"
12 while getopts dhm:s:v opt
13 do
14         case "$opt" in
15         m)      MANIFEST=$OPTARG ;;
16         s)      SRCDIR=$OPTARG ;;
17         v)      verbose=y ;;
18         d)      ECHO=echo debug=y ;;
19         h)      hardlinks=y ;;
20         ?)      echo $USAGE >&2
21                 exit 2;;
22         esac
23 done
24
25 : ${MANIFEST:=${SRCDIR}/MANIFEST}
26
27 [ -n "$debug" ] && verbose=
28
29 shift $(( $OPTIND - 1 ))
30
31 if [ $# -lt 1 ]; then
32         echo $USAGE >&2
33         exit 2
34 fi
35
36 if [ ! -f $MANIFEST ]; then
37         echo "$prog: $MANIFEST: no such file or directory" >&2
38         echo "$prog: must be run with valid -s argument or from source directory" >&2
39         exit 1
40 fi
41
42 rm_ltmp=false
43 LINKTEMP=`mktemp -t linktmp.XXXXXXXX 2>/dev/null`
44 if [ -z "$LINKTEMP" ]; then
45         : ${TMPDIR:=/tmp}
46         LINKTEMP=${TMPDIR}/linktmp.$$
47         rm_ltmp=true
48 fi
49
50 $rm_ltmp && rm -f ${LINKTEMP}
51 # if the user specified hard links, then do that.  otherwise, try to use
52 # symlinks if they're present
53 if [ -n "$hardlinks" ]; then
54         LN=ln
55 elif (ln -s /dev/null ${LINKTEMP}) >/dev/null 2>&1; then
56         LN="ln -s"
57 else
58         LN=ln
59 fi
60 rm -f ${LINKTEMP}
61
62 TARGET=$1
63
64 if [ ! -d "$TARGET" ]; then
65         mkdir "$TARGET"
66 fi
67
68 echo "${prog}: creating clone of bash source tree (from $SRCDIR) in $TARGET"
69
70 cd "$TARGET" || { echo "${prog}: cannot cd to $TARGET" >&2 ; exit 1; }
71
72 while read fname type mode
73 do
74         [ -z "$fname" ] && continue
75
76         case "$fname" in
77         \#*)    continue ;;
78         esac
79
80         case "$type" in
81         d)      [ -n "$verbose" ] && echo mkdir $fname
82                 $ECHO mkdir $fname ;;           # already in $TARGET
83         f)      fn=${fname##*/}
84                 case "$fname" in
85                 */*)    dn=${fname%/*} ;;
86                 *)      dn=. ;;
87                 esac
88                 if [ -n "$verbose" ] || [ -n "$debug" ]; then
89                         echo "( cd $dn && $LN $SRCDIR/$fname $fn )"
90                 fi
91                 [ -z "$debug" ] && ( cd $dn && $LN $SRCDIR/$fname $fn )
92                 ;;
93         *)      echo "${prog}: ${fname}: unknown file type $type" 1>&2 ;;
94         esac
95 done < $MANIFEST
96
97 # special
98 SPECIAL="parser-built y.tab.c y.tab.h"
99
100 rm -f $SPECIAL
101 for sf in $SPECIAL
102 do
103         [ -n "$verbose" ] && echo cp -p $SRCDIR/$sf $TARGET
104         $ECHO cp -p $SRCDIR/$sf $TARGET
105 done
106
107 exit 0