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# Copyright (C) 1996-2002 Free Software Foundation, Inc. 8# 9# This program is free software; you can redistribute it and/or modify 10# it under the terms of the GNU General Public License as published by 11# the Free Software Foundation; either version 2, or (at your option) 12# any later version. 13# 14# This program is distributed in the hope that it will be useful, 15# but WITHOUT ANY WARRANTY; without even the implied warranty of 16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17# GNU General Public License for more details. 18# 19# You should have received a copy of the GNU General Public License 20# along with this program; if not, write to the Free Software 21# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. 22# 23prog=`basename $0` 24 25SRCDIR=src 26 27USAGE="usage: $prog [-m manifest] [-s srcdir] [-v] [-d] [-h] target" 28while getopts dhm:s:v opt 29do 30 case "$opt" in 31 m) MANIFEST=$OPTARG ;; 32 s) SRCDIR=$OPTARG ;; 33 v) verbose=y ;; 34 d) ECHO=echo debug=y ;; 35 h) hardlinks=y ;; 36 ?) echo $USAGE >&2 37 exit 2;; 38 esac 39done 40 41: ${MANIFEST:=${SRCDIR}/MANIFEST} 42 43[ -n "$debug" ] && verbose= 44 45shift $(( $OPTIND - 1 )) 46 47if [ $# -lt 1 ]; then 48 echo $USAGE >&2 49 exit 2 50fi 51 52if [ ! -f $MANIFEST ]; then 53 echo "$prog: $MANIFEST: no such file or directory" >&2 54 echo "$prog: must be run with valid -s argument or from source directory" >&2 55 exit 1 56fi 57 58rm_ltmp=false 59LINKTEMP=`mktemp -t linktmp.XXXXXXXX 2>/dev/null` 60if [ -z "$LINKTEMP" ]; then 61 : ${TMPDIR:=/tmp} 62 LINKTEMP=${TMPDIR}/linktmp.$$ 63 rm_ltmp=true 64fi 65 66$rm_ltmp && rm -f ${LINKTEMP} 67# if the user specified hard links, then do that. otherwise, try to use 68# symlinks if they're present 69if [ -n "$hardlinks" ]; then 70 LN=ln 71elif (ln -s /dev/null ${LINKTEMP}) >/dev/null 2>&1; then 72 LN="ln -s" 73else 74 LN=ln 75fi 76rm -f ${LINKTEMP} 77 78TARGET=$1 79 80if [ ! -d "$TARGET" ]; then 81 mkdir "$TARGET" 82fi 83 84echo "${prog}: creating clone of bash source tree (from $SRCDIR) in $TARGET" 85 86cd "$TARGET" || { echo "${prog}: cannot cd to $TARGET" >&2 ; exit 1; } 87 88while read fname type mode 89do 90 [ -z "$fname" ] && continue 91 92 case "$fname" in 93 \#*) continue ;; 94 esac 95 96 case "$type" in 97 d) [ -n "$verbose" ] && echo mkdir $fname 98 $ECHO mkdir $fname ;; # already in $TARGET 99 f) fn=${fname##*/} 100 case "$fname" in 101 */*) dn=${fname%/*} ;; 102 *) dn=. ;; 103 esac 104 if [ -n "$verbose" ] || [ -n "$debug" ]; then 105 echo "( cd $dn && $LN $SRCDIR/$fname $fn )" 106 fi 107 [ -z "$debug" ] && ( cd $dn && $LN $SRCDIR/$fname $fn ) 108 ;; 109 *) echo "${prog}: ${fname}: unknown file type $type" 1>&2 ;; 110 esac 111done < $MANIFEST 112 113# special 114SPECIAL="parser-built y.tab.c y.tab.h" 115 116rm -f $SPECIAL 117for sf in $SPECIAL 118do 119 [ -n "$verbose" ] && echo cp -p $SRCDIR/$sf $TARGET 120 $ECHO cp -p $SRCDIR/$sf $TARGET 121done 122 123exit 0 124