#!/bin/sh

# mkbuildtree <build tree>
#
# Creates symbolic links in <build tree> 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%?}
}


[ "$1" == "" ] && { echo "Syntax: $0 <linux tree to xenify>"; exit 1; }

# Get absolute path to the destination directory
pushd . >/dev/null
cd ${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

# 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}

# Create symlinks of files and directories which exist in the sparse source
${AS}/lndir-rel -silent ${RS}
rm -f mkbuildtree lndir-rel

## There are a whole bunch of special symlinks, mostly for files
## which are identical in the i386 and xeno-i386 architecture-dependent
## subdirectories.

# This first symlink is special: it links to shared files in Xen's source tree
rm -rf ${AD}/include/asm-xeno/hypervisor-ifs
mkdir  ${AD}/include/asm-xeno/hypervisor-ifs
cd     ${AD}/include/asm-xeno/hypervisor-ifs
${AS}/lndir-rel -silent ../../../${RS}/../xen/include/hypervisor-ifs

# The remainder are the i386 -> xeno-i386 links
cd ..
ln -sf ../asm-i386/a.out.h 
ln -sf ../asm-i386/apicdef.h 
ln -sf ../asm-i386/apic.h 
ln -sf ../asm-i386/atomic.h 
ln -sf ../asm-i386/bitops.h 
ln -sf ../asm-i386/boot.h 
ln -sf ../asm-i386/byteorder.h 
ln -sf ../asm-i386/cache.h 
ln -sf ../asm-i386/checksum.h 
ln -sf ../asm-i386/cpufeature.h 
ln -sf ../asm-i386/current.h 
ln -sf ../asm-i386/debugreg.h 
ln -sf ../asm-i386/delay.h 
ln -sf ../asm-i386/div64.h 
ln -sf ../asm-i386/dma.h 
ln -sf ../asm-i386/elf.h 
ln -sf ../asm-i386/errno.h 
ln -sf ../asm-i386/fcntl.h 
ln -sf ../asm-i386/floppy.h 
ln -sf ../asm-i386/hardirq.h 
ln -sf ../asm-i386/hdreg.h 
ln -sf ../asm-i386/i387.h 
ln -sf ../asm-i386/ide.h 
ln -sf ../asm-i386/init.h 
ln -sf ../asm-i386/io.h
ln -sf ../asm-i386/io_apic.h
ln -sf ../asm-i386/ioctl.h
ln -sf ../asm-i386/ioctls.h
ln -sf ../asm-i386/ipcbuf.h
ln -sf ../asm-i386/ipc.h 
ln -sf ../asm-i386/kmap_types.h
ln -sf ../asm-i386/ldt.h 
ln -sf ../asm-i386/linux_logo.h
ln -sf ../asm-i386/locks.h 
ln -sf ../asm-i386/math_emu.h
ln -sf ../asm-i386/mc146818rtc.h
ln -sf ../asm-i386/mca_dma.h 
ln -sf ../asm-i386/mman.h 
ln -sf ../asm-i386/mmu.h 
ln -sf ../asm-i386/mmx.h 
ln -sf ../asm-i386/module.h 
ln -sf ../asm-i386/mpspec.h 
ln -sf ../asm-i386/msgbuf.h 
ln -sf ../asm-i386/mtrr.h 
ln -sf ../asm-i386/namei.h 
ln -sf ../asm-i386/param.h 
ln -sf ../asm-i386/parport.h 
ln -sf ../asm-i386/pci.h
ln -sf ../asm-i386/pgtable-3level.h 
ln -sf ../asm-i386/poll.h 
ln -sf ../asm-i386/posix_types.h 
ln -sf ../asm-i386/resource.h 
ln -sf ../asm-i386/rwlock.h 
ln -sf ../asm-i386/rwsem.h 
ln -sf ../asm-i386/scatterlist.h
ln -sf ../asm-i386/semaphore.h 
ln -sf ../asm-i386/sembuf.h 
ln -sf ../asm-i386/serial.h 
ln -sf ../asm-i386/setup.h 
ln -sf ../asm-i386/shmbuf.h 
ln -sf ../asm-i386/shmparam.h 
ln -sf ../asm-i386/sigcontext.h 
ln -sf ../asm-i386/siginfo.h 
ln -sf ../asm-i386/signal.h 
ln -sf ../asm-i386/smplock.h 
ln -sf ../asm-i386/socket.h 
ln -sf ../asm-i386/sockios.h 
ln -sf ../asm-i386/softirq.h 
ln -sf ../asm-i386/spinlock.h 
ln -sf ../asm-i386/statfs.h 
ln -sf ../asm-i386/stat.h 
ln -sf ../asm-i386/string-486.h 
ln -sf ../asm-i386/string.h 
ln -sf ../asm-i386/termbits.h 
ln -sf ../asm-i386/termios.h 
ln -sf ../asm-i386/timex.h 
ln -sf ../asm-i386/tlb.h 
ln -sf ../asm-i386/types.h 
ln -sf ../asm-i386/uaccess.h 
ln -sf ../asm-i386/ucontext.h 
ln -sf ../asm-i386/unaligned.h
ln -sf ../asm-i386/unistd.h 
ln -sf ../asm-i386/user.h 
ln -sf ../asm-i386/xor.h 

cd ../../arch/xeno/kernel
ln -sf ../../i386/kernel/i387.c
ln -sf ../../i386/kernel/init_task.c
ln -sf ../../i386/kernel/ptrace.c
ln -sf ../../i386/kernel/semaphore.c 
ln -sf ../../i386/kernel/sys_i386.c 
cd ../lib
ln -sf ../../i386/lib/checksum.S 
ln -sf ../../i386/lib/dec_and_lock.c 
ln -sf ../../i386/lib/getuser.S 
ln -sf ../../i386/lib/iodebug.c 
ln -sf ../../i386/lib/memcpy.c 
ln -sf ../../i386/lib/mmx.c
ln -sf ../../i386/lib/old-checksum.c 
ln -sf ../../i386/lib/strstr.c 
ln -sf ../../i386/lib/usercopy.c 
cd ../mm
ln -sf ../../i386/mm/extable.c 
ln -sf ../../i386/mm/pageattr.c 
