#!/bin/bash # mkbuildtree # # Creates symbolic links in for the sparse tree # in the current directory. # Script to determine the relative path between two directories. # Copyright (c) D. J. Hawkey Jr. 2002 # Fixed for Xen project by K. Fraser in 2003. abs_to_rel () { local CWD SRCPATH if [ "$1" != "/" -a "${1##*[^/]}" = "/" ]; then SRCPATH=${1%?} else SRCPATH=$1 fi if [ "$2" != "/" -a "${2##*[^/]}" = "/" ]; then DESTPATH=${2%?} else DESTPATH=$2 fi CWD=$PWD [ "${1%%[^/]*}" != "/" ] && cd $1 && SRCPATH=$PWD [ "${2%%[^/]*}" != "/" ] && cd $2 && DESTPATH=$PWD [ "$CWD" != "$PWD" ] && cd $CWD BASEPATH=$SRCPATH [ "$SRCPATH" = "$DESTPATH" ] && DESTPATH="." && return [ "$SRCPATH" = "/" ] && DESTPATH=${DESTPATH#?} && return while [ "$BASEPATH/" != "${DESTPATH%${DESTPATH#$BASEPATH/}}" ]; do BASEPATH=${BASEPATH%/*} done SRCPATH=${SRCPATH#$BASEPATH} DESTPATH=${DESTPATH#$BASEPATH} DESTPATH=${DESTPATH#?} while [ -n "$SRCPATH" ]; do SRCPATH=${SRCPATH%/*} DESTPATH="../$DESTPATH" done [ -z "$BASEPATH" ] && BASEPATH="/" [ "${DESTPATH##*[^/]}" = "/" ] && DESTPATH=${DESTPATH%?} } # relative_lndir # Creates a tree of symlinks in the current working directory that mirror # real files in . should be relative to the current # working directory. Symlinks in are ignored. Source-control files # are ignored. relative_lndir () { local SYMLINK_DIR REAL_DIR pref i j SYMLINK_DIR=$PWD REAL_DIR=$1 ( cd $REAL_DIR for i in `find . -type d | grep -v SCCS`; do [ -d $SYMLINK_DIR/$i ] || mkdir -p $SYMLINK_DIR/$i ( cd $i pref=`echo $i | sed -e 's#/[^/]*#../#g' -e 's#^\.##'` for j in `find . -maxdepth 1 -type f -o -type l`; do ln -sf ${pref}${REAL_DIR}/$i/$j ${SYMLINK_DIR}/$i/$j done ) done ) } [ "$1" == "" ] && { echo "Syntax: $0 "; exit 1; } # Get absolute path to the destination directory pushd . >/dev/null cd ${1} || { echo "cannot cd to ${1}"; exit 1; } AD=$PWD popd >/dev/null # Get absolute path to the source directory AS=`pwd` # Get path to source, relative to destination abs_to_rel ${AD} ${AS} RS=$DESTPATH # Arch-specific pre-processing if [ -e arch/${LINUX_ARCH}/xen-mkbuildtree-pre ]; then bash arch/${LINUX_ARCH}/xen-mkbuildtree-pre fi # Remove old copies of files and directories at the destination for i in `find . -type f -o -type l` ; do rm -f ${AD}/${i#./} ; done # We now work from the destination directory cd ${AD} || { echo "cannot cd to ${AD}"; exit 1; } # Remove old symlinks for i in `find . -type l`; do rm -f $i; done # Create symlinks of files and directories which exist in the sparse source relative_lndir ${RS} rm -f mkbuildtree # Create links to the shared definitions of the Xen interfaces. rm -rf ${AD}/include/xen/interface mkdir ${AD}/include/xen/interface cd ${AD}/include/xen/interface relative_lndir ../../../${RS}/../xen/include/public # Arch-specific post-processing cd ${AD} if [ -e arch/${LINUX_ARCH}/xen-mkbuildtree-post ]; then bash arch/${LINUX_ARCH}/xen-mkbuildtree-post fi