# Copyright 1999-2004 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/eclass/common-lisp-common.eclass,v 1.13 2009/09/18 15:35:50 hkbst Exp $
#
# Author Matthew Kennedy <mkennedy@gentoo.org>
#
# Sundry code common to many Common Lisp related ebuilds.

# Some handy constants

inherit eutils

CLFASLROOT=/usr/$(get_libdir)/common-lisp/
CLSOURCEROOT=/usr/share/common-lisp/source/
CLSYSTEMROOT=/usr/share/common-lisp/systems/

# Many of our Common Lisp ebuilds are either inspired by, or actually
# use packages and files from the Debian project's archives.

do-debian-credits() {
	docinto debian
	for i in copyright README.Debian changelog; do
		# be silent, since all files are not always present
		dodoc "${S}"/debian/${i} &>/dev/null || true
	done
	docinto .
}

# Most of the code below is from Debian's Common Lisp Controller
# package

register-common-lisp-implementation() {
	PROGNAME=$(basename $0)
	# first check if there is at least a compiler-name:
	if [ -z "$1"  ] ; then
		cat <<EOF
usage: $PROGNAME compiler-name

registers a Common Lisp compiler to the
Common-Lisp-Controller system.
EOF
		exit 1
	fi
	IMPL=$1
	FILE="/usr/$(get_libdir)/common-lisp/bin/$IMPL.sh"
	if [ ! -f "$FILE" ] ; then
		cat <<EOF
$PROGNAME: I cannot find the script $FILE for the implementation $IMPL
EOF
		exit 2
	fi
	if [ ! -r "$FILE" ] ; then
		cat <<EOF
$PROGNAME: I cannot read the script $FILE for the implementation $IMPL
EOF
		exit 2
	fi
	# install CLC into the lisp
	sh "$FILE" install-clc || (echo "Installation of CLC failed" >&2 ; exit 3)
	mkdir /usr/$(get_libdir)/common-lisp/$IMPL &>/dev/null || true
	chown cl-builder:cl-builder /usr/$(get_libdir)/common-lisp/$IMPL

	# now recompile the stuff
	for i  in /usr/share/common-lisp/systems/*.asd	; do
		if [ -f $i -a -r $i ] ; then
			i=${i%.asd}
			package=${i##*/}
			clc-autobuild-check $IMPL $package
			if [ $? = 0 ]; then
				echo recompiling package $package for implementation $IMPL
				/usr/bin/clc-send-command --quiet recompile $package $IMPL
			fi
		fi
	done
	for i  in /usr/share/common-lisp/systems/*.system  ; do
		if [ -f $i -a -r $i ] ; then
			i=${i%.system}
			package=${i##*/}
			clc-autobuild-check $IMPL $package
			if [ $? = 0 ]; then
				echo recompiling package $package for implementation $IMPL
				/usr/bin/clc-send-command --quiet recompile $package $IMPL
			fi
		fi
	done
	echo "$PROGNAME: Compiler $IMPL installed"
}

unregister-common-lisp-implementation() {
	PROGNAME=$(basename $0)
	if [ `id -u` != 0 ] ; then
		echo $PROGNAME: you need to be root to run this program
		exit 1
	fi
	if [ -z "$1" ] ; then
		cat <<EOF
usage: $PROGNAME compiler-name

un-registers a Common Lisp compiler to the
Common-Lisp-Controller system.
EOF
		exit 1
	fi
	IMPL=$1
	IMPL_BIN="/usr/$(get_libdir)/common-lisp/bin/$IMPL.sh"
	if [ ! -f "$IMPL_BIN" ] ; then
		cat <<EOF
$PROGNAME: No implementation of the name $IMPL is registered
Cannot find the file $IMPL_BIN

Maybe you already removed it?
EOF
		exit 0
	fi
	if [ ! -r "$IMPL_BIN" ] ; then
		cat <<EOF
$PROGNAME: No implementation of the name $IMPL is registered
Cannot read the file $IMPL_BIN

Maybe you already removed it?
EOF
		exit 0
	fi
	# Uninstall the CLC
	sh $IMPL_BIN remove-clc || echo "De-installation of CLC failed" >&2
	clc-autobuild-impl $IMPL inherit
	# Just remove the damn subtree
	(cd / ; rm -rf "/usr/$(get_libdir)/common-lisp/$IMPL/" ; true )
	echo "$PROGNAME: Common Lisp implementation $IMPL uninstalled"
}

reregister-all-common-lisp-implementations() {
	# Rebuilds all common lisp implementations
	# Written by Kevin Rosenberg <kmr@debian.org>
	# GPL-2 license
	local clc_bin_dir=/usr/$(get_libdir)/common-lisp/bin
	local opt=$(shopt nullglob); shopt -s nullglob
	cd $clc_bin_dir
	for impl_bin in *.sh; do
		impl=$(echo $impl_bin | sed 's/\(.*\).sh/\1/')
		unregister-common-lisp-implementation $impl
		register-common-lisp-implementation $impl
	done
	cd - >/dev/null
	[[ $opt = *off ]] && shopt -u nullglob
}

# BIG FAT HACK: Since the Portage emerge step kills file timestamp
# information, we need to compensate by ensuring all FASL files are
# more recent than their source files.

# The following `impl-*-timestamp-hack' functions SHOULD NOT be used
# outside of this eclass.

impl-save-timestamp-hack() {
	local impl=$1
	dodir /usr/share/${impl}
	tar cpjf "${D}"/usr/share/${impl}/portage-timestamp-compensate -C "${D}"/usr/$(get_libdir)/${impl} .
}

impl-restore-timestamp-hack() {
	local impl=$1
	tar xjpfo /usr/share/${impl}/portage-timestamp-compensate -C /usr/$(get_libdir)/${impl}
}

impl-remove-timestamp-hack() {
	local impl=$1
	rm -rf /usr/$(get_libdir)/${impl} &>/dev/null || true
}

test-in() {
	local symbol=$1
	shift
	for i in $@; do
		if [ $i == ${symbol} ]; then
			return 0			# true
		fi
	done
	false
}

standard-impl-postinst() {
	local impl=$1
	rm -rf /usr/$(get_libdir)/common-lisp/${impl}/* &>/dev/null || true
	chown cl-builder:cl-builder /usr/$(get_libdir)/common-lisp/${impl}
	if test-in ${impl} cmucl sbcl; then
		impl-restore-timestamp-hack ${impl}
	fi
	chown -R root:0 /usr/$(get_libdir)/${impl}
	/usr/bin/clc-autobuild-impl ${impl} yes
	register-common-lisp-implementation ${impl}
}

standard-impl-postrm() {
	local impl=$1 impl_binary=$2
	# Since we keep our own time stamps we must manually remove them
	# here.
	if [ ! -x ${impl_binary} ]; then
		if test-in ${impl} cmucl sbcl; then
			impl-remove-timestamp-hack ${impl}
		fi
		rm -rf /usr/$(get_libdir)/common-lisp/${impl}/*
	fi
}

# Local Variables: ***
# mode: shell-script ***
# tab-width: 4 ***
# End: ***
