#!/bin/sh
# Install/build cmucl cores. 
# David Axmark (davida@isil.detron.se) 
# Rewritten 940501.
# This script was suppled by David Axmark.  It rebuilds CMU CL from sources.
# It uses his build-and-install script, and may contain sun dependencies. 
#

# Try to avoid depending on locally installed stuff.
PATH=/bin:$PATH
export PATH

sed_fix ()
{
	(
	file=$1; shift
	if test ! -f $file.before-sed
	then
		sedscript=/tmp/sedscript-$$
		> $sedscript
		while test -n "$1"
		do
			# Dont fail for args begginging with -n
			/usr/5bin/echo "$1" >> $sedscript
			shift
		done
		mv $file $file.before-sed
		echo "Applying sed fixes to $file"
		sed -f $sedscript $file.before-sed > $file
		rm -f $sedscript
	fi
	)
}

mkdir_if_needed () { if test ! -d "$1"; then mkdir "$1"; fi }

usage ()
{
	echo "Usage:$0 cmucl_version [build_options]"
	echo "Example: $0 17e -all"
	exit 1
}

if test -z "$1"; then usage; fi

ver=$1; shift
if expr "$ver" : "[0-9]\{1,3\}[a-z]\{1,\}" > /dev/null
then
	dummy=t
else
	echo "The version $ver seems funny to me. Expected somthing like 17e."
	exit 1
fi

# Set a lot of variables.
sys=sunos
base=${MY_BASEDIR:-/my}/cmucl
local_dir=$base/own-builds
CMUCL_ROOT=$base
CMUCL_EMPTYFILE=/var/tmp/empty
subdir=$ver
src=$base/src/$ver
tooldir=$src/tools
build_dir=$base/build
dest=$build_dir/$sys/$subdir
lisp=variant-lisp
safe_lisp="variant-lisp -version $ver"
logfile=$build_dir/build-$ver-log-`date +%H%M%S`
report_memory_layout=\
'(format t "read-only ~X~%static ~X~%dynamic ~X~%"
 sparc:target-read-only-space-start sparc:target-static-space-start
 sparc:target-dynamic-space-start)'
export ver tooldir build_dir CMUCL_ROOT CMUCL_EMPTYFILE sys subdir dest src lisp

if test -z "$1"; then usage; fi

# We need this for the log file
mkdir_if_needed $build_dir
(
while test -n "$1"
do
echo "Doing: $1"
case "$1"
in
	-all-build-steps)
	# All steps
	echo "Doing all steps nesessariy to build a cmucl core."
	set - -all \
        -setup -genesis -compile-c-code -compile-lisp-code -worldbuild -mk-lisp
    	;;

	-remove-old-installation)
	rm -rf $base/release-$ver
	;;

	-remove-build-directory)
	# We leave $base/build since we want to keep the log files.
	rm -rf $dest
	;;

	-install-distribution)
	cd $base
	if test -d release-$ver
	then
		echo "Release $ver already installed"
		exit 1
	fi
	vername=sunos
	mkdir release-$ver
	cd release-$ver
	any_cat $base/distributions/$ver-$vername.tar* | gtar xf -
	any_cat $base/distributions/$ver-extra-$vername.tar* | gtar xf -
	mkdir src; cd src
	any_cat $base/distributions/$ver-source.tar.* | gtar xf -
	cd $base/src
	ln -s ../release-$ver/src $ver
	;;

	-config)
	# Configure a default kernel with CLX
	cd $base/release-$ver/lib
	conf=`/usr/5bin/echo -e "4\n6\n"`
	echo "$conf" | CMUCL_VERSION=$ver ./config
	;;

	-clean-up)
	# Remove or compress some files that are not strictly needed
	rm -rf *.BAK subsystems
	cd ../doc
	gzip --best *.ps *.doc *.txt
	echo "Done"
	;;

	-apply-patch)
	name=$2; shift
	echo "Applying patch: $name"
	if test ! -f  $src/patch-$name-applied
	then
		patch --directory $src --strip=1 < $local_dir/$ver-$name-patch
		touch $src/patch-$name-applied
	fi
	;;

	-add-local-c-code)
	# Make sure that we link again
	rm -f $dest/lisp/lisp  
	ml=$MY_BASEDIR_VERSION/lib
	clm_lib=$MY_BASEDIR_VERSION/wlisp/gina/clm/lib.sun4
	local_src=17e-extra-c-code.c
	local_libs="-L$ml -lreg -lpisam -lhash -lmisam \
		 -lmerge -lnisam -lheap -linput -lmycurses -lpcurses -lmysys \
		 -ldbug -lstrings $ml/rx.o $ml/replace-many.o \
		  $clm_lib/unixsocket.o $clm_lib/io.o"
	;;

	-clean-c-code)
	cd $dest/lisp
	gmake -f $src/lisp/GNUmakefile clean
	;;

	-setup)
        # Fix makefile so we can use the VPATH feature.
	if test ! -f  $src/lisp/patch-GNUmakefile-applied
	then
		patch --directory $src/lisp \
    	    	    < $local_dir/$ver-GNUmakefile-patch
		touch $src/lisp/patch-GNUmakefile-applied
	fi
	# Create build directory stucture
	mkdir_if_needed $build_dir/$sys
	mkdir_if_needed $build_dir/$sys/$subdir
	# Create directory structure if needed.
	if test ! -d $build_dir/$sys/$subdir/lisp
	then
		cd $src
		# Suns find will not do a $var/{} substitution.
		# So we do this instead.
		find . -type d -print | while read dir; do mkdir $dest/$dir; done
	fi
	# Create Config & Depends
	cd $dest/lisp
	# Create Config file.
		cat > Config << EOF
	CPPFLAGS = -I. -I/usr/include/X11 -DSUNOS # -DDEBUG
	CC = gcc # -Wall -Wstrict-prototypes -Wmissing-prototypes
	CPP = /lib/cpp
	CFLAGS = -O
	ASFLAGS = -O
	NM = nm -gp
	ASSEM_SRC = sparc-assem.S
	ARCH_SRC = sparc-arch.c
	OS_SRC = sunos-os.c os-common.c $local_src
	OS_LINK_FLAGS=-static
	OS_LIBS=$local_libs
	VPATH=$src/lisp:$local_dir
EOF
	# Create a Depends file
	if test ! -f Depends
	then
		> Depends
		# Create fake internals.h so make depend works.
		> internals.h
	        gmake -f $src/lisp/GNUmakefile depend
		rm -f internals.h
	fi
	;;

	-genesis)
	echo "Map file for ldb version 0" > $dest/lisp/lisp.map
	$safe_lisp -noinit << EOF 
	(setf (ext:search-list "target:") '("$dest/"))
	(setf (ext:search-list "src:") '("$base/src/$ver/"))
	(load "src:compiler/sparc/parms")
	(load "src:compiler/generic/new-genesis")
    	$report_memory_layout
	(in-package :lisp)
	(setf *genesis-core-name* "target:lisp/kernel.core")
	(setf *genesis-c-header-name* t)
	(setf *genesis-symbol-table* "target:lisp/lisp.map")
	(setf *genesis-map-name* t)
	(setf *target-page-size* 8192)
	(genesis nil)
	(ext:quit)
EOF
	;;

	-compile-c-code)
	cd $dest/lisp
	gmake -f $src/lisp/GNUmakefile all
	;;

	-compile-lisp-code)
	sed_fix $tooldir/compile-all \
		"s;/afs/cs/project/clisp/build/;$base/build/;" \
		"s;/afs/cs/project/clisp/;$base/;"
	chmod a+x $tooldir/compile-all
	cd $build_dir
	echo "Starting compile of all lisp code. This takes a long time."
	LISP=$safe_lisp \
	$tooldir/compile-all -target sunos -release $ver -lisp $base/release-$ver \
        		     -noupdate -nocompile hemlock 
	;;
	-worldbuild)
	cd $build
	$safe_lisp -noinit << EOF
	(setf (search-list "target:") '("$dest/" "$src/"))
	(load "target:compiler/sparc/parms")
	$report_memory_layout
	(load "target:bootstrap" :if-does-not-exist nil)
	(load "target:tools/setup")
	(load "target:compiler/generic/new-genesis" :if-source-newer :compile)
	(load "target:tools/worldbuild" :if-source-newer :compile)
        $report_memory_layout
	(quit)
EOF
	;;

	-mk-lisp)
	sed_fix $tooldir/mk-lisp "s;/@sys/;/\$sys/;"
	chmod a+x $tooldir/mk-lisp
	cd $dest
	$tooldir/mk-lisp -now $ver :no-hemlock
	;;

	-install-as)
	new_ver=$2; shift
	if test "$ver" = "$new_ver"
	then 
		echo "buildver $ver can not be equal to installver $new_ver"
		exit 1
	fi
	echo "Inststalling new core as version $new_ver"
	mkdir_if_needed $base/release-$new_ver
	mkdir_if_needed $base/release-$new_ver/bin
	mkdir_if_needed $base/release-$new_ver/lib
	# Make symlinks to original version.
	cd $base/release-$new_ver
	rm -f doc man src
	ln -s ../release-$ver/doc ../release-$ver/man ../release-$ver/src .
	cd $base/release-$new_ver/lib
	for file in `echo ../../release-$ver/lib/*`
	do
		rm -f ./`basename $file`; ln -s $file .
	done
	rm -f $base/release-$new_ver/bin/lisp $base/release-$new_ver/lib/lisp.core
	cp $dest/lisp/lisp $base/release-$new_ver/bin/lisp
	cp $dest/lisp.core $base/release-$new_ver/lib/lisp.core
	;;

	-make-default)
	# Change symlink so this becomes the default version
	new_ver=$2; shift
	cd $base
	rm -f release; ln -s release-$new_ver release
	;;

	*)
		echo "No such function: $1"
		exit 1
	;;
esac
shift
done
) 2>&1 | tee $logfile
