#! /bin/sh
#
# shobj-conf -- output a series of variable assignments to be substituted
#		into a Makefile by configure which specify system-dependent
#		information for creating shared objects that may be loaded
#		into bash with `enable -f'
#
# usage: shobj-conf [-C compiler] -c host_cpu -o host_os -v host_vendor
#
# Chet Ramey
# chet@po.cwru.edu

#
# defaults
#
SHOBJ_STATUS=supported
SHLIB_STATUS=supported

SHOBJ_CC=cc
SHOBJ_CFLAGS=
SHOBJ_LD=
SHOBJ_LDFLAGS=
SHOBJ_XLDFLAGS=
SHOBJ_LIBS=

SHLIB_XLDFLAGS=
SHLIB_LIBS=
SHLIB_LIBSUFF='so'

SHLIB_LIBVERSION='$(SHLIB_LIBSUFF)'

PROGNAME=`basename $0`
USAGE="$PROGNAME [-C compiler] -c host_cpu -o host_os -v host_vendor"

while [ $# -gt 0 ]; do
	case "$1" in
	-C)	shift; SHOBJ_CC="$1"; shift ;;
	-c)	shift; host_cpu="$1"; shift ;;
	-o)	shift; host_os="$1"; shift ;;
	-v)	shift; host_vendor="$1"; shift ;;
	*)	echo "$USAGE" >&2 ; exit 2;;
	esac
done

case "${host_os}-${SHOBJ_CC}" in
sunos4*-gcc*)
	SHOBJ_CFLAGS=-fpic
	SHOBJ_LD=/usr/bin/ld
	SHOBJ_LDFLAGS='-assert pure-text'

	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)'
	;;

sunos4*)
	SHOBJ_CFLAGS=-pic
	SHOBJ_LD=/usr/bin/ld
	SHOBJ_LDFLAGS='-assert pure-text'

	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)'
	;;

sunos5*-gcc*|solaris2*-gcc*)
	SHOBJ_CFLAGS=-fpic
	SHOBJ_LD='${CC}'
	SHOBJ_LDFLAGS='-shared -Wl,-i -Wl,-h,$@'

#	SHLIB_XLDFLAGS='-R $(libdir)'
	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
	;;

sunos5*|solaris2*)
	SHOBJ_CFLAGS='-K pic'
	SHOBJ_LD=/usr/ccs/bin/ld
	SHOBJ_LDFLAGS='-G -dy -z text -i -h $@'

#	SHLIB_XLDFLAGS='-R $(libdir)'
	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
	;;

freebsd2* | netbsd* | openbsd*)
	SHOBJ_CFLAGS=-fpic
	SHOBJ_LD=ld
	SHOBJ_LDFLAGS='-x -Bshareable'

	SHLIB_XLDFLAGS='-R$(libdir)'
	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)'
	;;

# FreeBSD-3.x can have either a.out or ELF object files
#freebsd3*)
#	SHOBJ_CFLAGS=-fpic
#	SHOBJ_LD='${CC}'
#	SHOBJ_LDFLAGS='-shared'
#
#	SHLIB_XLDFLAGS='-R$(libdir)'
#	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)'
#	;;

# FreeBSD-3.x ELF
freebsd3*)
	SHOBJ_CFLAGS=-fpic
	SHOBJ_LD='${CC}'

	if [ -x /usr/bin/objformat ] && [ "`/usr/bin/objformat`" = "elf" ]; then
		SHOBJ_LDFLAGS='-shared -Wl,-soname,$@'

		SHLIB_XLDFLAGS='-Wl,-rpath,$(libdir)'
		SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
	else
		SHOBJ_LDFLAGS='-shared'

		SHLIB_XLDFLAGS='-R$(libdir)'
		SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)'
	fi
	;;

linux*)
	SHOBJ_CFLAGS=-fPIC
	SHOBJ_LD='${CC}'
	SHOBJ_LDFLAGS='-shared -Wl,-soname,$@'

	SHLIB_XLDFLAGS='-Wl,-rpath,$(libdir)'
	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)'
	;;

bsdi2*)
	SHOBJ_CC=shlicc2
	SHOBJ_CFLAGS=
	SHOBJ_LD=ld
	SHOBJ_LDFLAGS=-r
	SHOBJ_LIBS=-lc_s.2.1.0

	# BSD/OS 2.x and 3.x `shared libraries' are too much of a pain in
	# the ass -- they require changing {/usr/lib,etc}/shlib.map on
	# each system, and the library creation process is byzantine
	SHLIB_STATUS=unsupported
	;;

bsdi3*)
	SHOBJ_CC=shlicc2
	SHOBJ_CFLAGS=
	SHOBJ_LD=ld
	SHOBJ_LDFLAGS=-r
	SHOBJ_LIBS=-lc_s.3.0.0

	# BSD/OS 2.x and 3.x `shared libraries' are too much of a pain in
	# the ass -- they require changing {/usr/lib,etc}/shlib.map on
	# each system, and the library creation process is byzantine
	SHLIB_STATUS=unsupported
	;;

bsdi4*)
	# BSD/OS 4.x now supports ELF and SunOS-style dynamically-linked
	# shared libraries.  gcc 2.x is the standard compiler, and the
	# `normal' gcc options should work as they do in Linux.

	SHOBJ_CFLAGS=-fPIC
	SHOBJ_LD='${CC}'
	SHOBJ_LDFLAGS='-shared -Wl,-soname,$@'

	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)'
	;;

osf*-gcc*)
	# Fix to use gcc linker driver from bfischer@TechFak.Uni-Bielefeld.DE
	SHOBJ_LD='${CC}'
	SHOBJ_LDFLAGS='-shared -Wl,-soname,$@'

	SHLIB_XLDFLAGS='-rpath $(libdir)'
	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
	;;

osf*)
	SHOBJ_LD=ld
	SHOBJ_LDFLAGS='-shared -soname $@ -expect_unresolved "*"'

	SHLIB_XLDFLAGS='-rpath $(libdir)'
	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
	;;

aix4.[2-9]*-gcc*)		# lightly tested by jik@cisco.com
	SHOBJ_CFLAGS=-fpic
	SHOBJ_LD='ld'
	SHOBJ_LDFLAGS='-bdynamic -bnoentry -bexpall'
	SHOBJ_XLDFLAGS='-G'

	SHLIB_XLDFLAGS='-bM:SRE'
	SHLIB_LIBS='-lcurses -lc'
	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
	;;

aix4.[2-9]*)
	SHOBJ_CFLAGS=-K
	SHOBJ_LD='ld'
	SHOBJ_LDFLAGS='-bdynamic -bnoentry -bexpall'
	SHOBJ_XLDFLAGS='-G'

	SHLIB_XLDFLAGS='-bM:SRE'
	SHLIB_LIBS='-lcurses -lc'
	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
	;;

#
# THE FOLLOWING ARE UNTESTED -- and some may not support the dlopen interface
#
irix[56]*-gcc*)
	SHOBJ_CFLAGS='-fpic'
	SHOBJ_LD='${CC}'
	SHOBJ_LDFLAGS='-shared -Wl,-soname,$@'

	SHLIB_XLDFLAGS='-Wl,-rpath,$(libdir)'
	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
	;;

irix[56]*)
	SHOBJ_CFLAGS='-K PIC'
	SHOBJ_LD=ld
#	SHOBJ_LDFLAGS='-call_shared -hidden_symbol -no_unresolved -soname $@'
#	Change from David Kaelbling <drk@sgi.com>
	SHOBJ_LDFLAGS='-shared -no_unresolved -soname $@'

	SHLIB_XLDFLAGS='-rpath $(libdir)'
	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
	;;

hpux9*-gcc*)
	# must use gcc; the bundled cc cannot compile PIC code
	SHOBJ_CFLAGS='-fpic'
	SHOBJ_LD='${CC}'
	SHOBJ_LDFLAGS='-shared -Wl,-b -Wl,+s'

	SHLIB_XLDFLAGS='-Wl,+b,$(libdir)'
	SHLIB_LIBSUFF='sl'
	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
	;;

hpux9*)
	SHOBJ_STATUS=unsupported
	SHLIB_STATUS=unsupported
	;;

hpux10*-gcc*)
	# must use gcc; the bundled cc cannot compile PIC code
	SHOBJ_CFLAGS='-fpic'
	SHOBJ_LD='${CC}'
	SHOBJ_LDFLAGS='-shared -Wl,-b -Wl,+s'

	SHLIB_XLDFLAGS='-Wl,+h,$@ -Wl,+b,$(libdir)'
	SHLIB_LIBSUFF='sl'
	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
	;;

hpux10*)
	SHOBJ_STATUS=unsupported
	SHLIB_STATUS=unsupported
	;;

hpux11*-gcc*)
	# must use gcc; the bundled cc cannot compile PIC code
	SHOBJ_CFLAGS='-fpic'
	SHOBJ_LD='${CC}'
#	SHOBJ_LDFLAGS='-shared -Wl,-b -Wl,-B,symbolic -Wl,+s -Wl,+std -Wl,+h,$@'
	SHOBJ_LDFLAGS='-shared -Wl,-b -Wl,+s -Wl,+h,$@'

	SHLIB_XLDFLAGS='-Wl,+b,$(libdir)'
	SHLIB_LIBSUFF='sl'
	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
	;;

hpux11*)
	SHOBJ_STATUS=unsupported
	SHLIB_STATUS=unsupported
	;;

sysv4*-gcc*)
	SHOBJ_CFLAGS=-shared
	SHOBJ_LDFLAGS='-shared -h $@'
	SHOBJ_LD='${CC}'

	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
	;;

sysv4*)
	SHOBJ_CFLAGS='-K PIC'
	SHOBJ_LD=ld
	SHOBJ_LDFLAGS='-dy -z text -G -h $@'

	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
	;;

sco3.2v5*-gcc*)
	SHOBJ_CFLAGS='-fpic'		# DEFAULTS TO ELF
	SHOBJ_LD='${CC}'
	SHOBJ_LDFLAGS='-shared'

	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
	;;

sco3.2v5*)
	SHOBJ_CFLAGS='-K pic -b elf'
	SHOBJ_LD=ld
	SHOBJ_LDFLAGS='-G -b elf -dy -z text -h $@'

	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
	;;

sysv5uw7*-gcc*)
	SHOBJ_CFLAGS='-fpic'
	SHOBJ_LD='${CC}'
	SHOBJ_LDFLAGS='-shared'

	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
	;;

sysv5uw7*)
	SHOBJ_CFLAGS='-K PIC'
	SHOBJ_LD=ld
	SHOBJ_LDFLAGS='-G -dy -z text -h $@'

	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
	;;
	
dgux*-gcc*)
	SHOBJ_CFLAGS=-fpic
	SHOBJ_LD='${CC}'
	SHOBJ_LDFLAGS='-shared'

	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
	;;

dgux*)
	SHOBJ_CFLAGS='-K pic'
	SHOBJ_LD=ld
	SHOBJ_LDFLAGS='-G -dy -h $@'

	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
	;;

msdos*)
	SHOBJ_STATUS=unsupported
	SHLIB_STATUS=unsupported
	;;

#
# Rely on correct gcc configuration for everything else
#
*-gcc*)
	SHOBJ_CFLAGS=-fpic
	SHOBJ_LD='${CC}'
	SHOBJ_LDFLAGS='-shared'

	SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
	;;

*)
	SHOBJ_STATUS=unsupported
	SHLIB_STATUS=unsupported
	;;

esac

echo SHOBJ_CC=\'"$SHOBJ_CC"\'
echo SHOBJ_CFLAGS=\'"$SHOBJ_CFLAGS"\'
echo SHOBJ_LD=\'"$SHOBJ_LD"\'
echo SHOBJ_LDFLAGS=\'"$SHOBJ_LDFLAGS"\'
echo SHOBJ_XLDFLAGS=\'"$SHOBJ_XLDFLAGS"\'
echo SHOBJ_LIBS=\'"$SHOBJ_LIBS"\'

echo SHLIB_XLDFLAGS=\'"$SHLIB_XLDFLAGS"\'
echo SHLIB_LIBS=\'"$SHLIB_LIBS"\'
echo SHLIB_LIBSUFF=\'"$SHLIB_LIBSUFF"\'
echo SHLIB_LIBVERSION=\'"$SHLIB_LIBVERSION"\'

echo SHOBJ_STATUS=\'"$SHOBJ_STATUS"\'
echo SHLIB_STATUS=\'"$SHLIB_STATUS"\'

exit 0
