#!/bin/sh
#
# This is the configuration script for the lkcdutils package.
# 

# Set some default values.
#
if [ -z $ARCH ] ;
then
	ARCH=`uname -m | sed -e s/i.86/i386/`
fi
SYS_VER=`/bin/uname -r | awk -F. '{ print $1"."$2}'`

LKCDUTILS_DIR=`pwd`
outfile=.config
CC_LOC=/usr/bin/
mandir=/usr/share/man

# Loop over all args

while :
do

# Get the first arg, and shuffle
	case $# in
		0)
		break
		;;
		esac

# Get the first arg, and shuffle
	option=$1
	shift

# Make all options have two hyphens
	orig_option=$option # Save original for error messages
	case $option in
		--*) ;;
		-*) option=-$option ;;
		esac

# Split out the argument for options that take them
	case $option in
	--*=*)
		optarg=`echo $option | sed -e 's/^[^=]*=//'`
		arguments="$arguments $option"
		;;
	esac

# Now, process the options. Note that there are a number of unused
# options (e.g., --prefix) that have to be here to so that configure
# runs properly via rpm -ba.
	case $option in

	--arch*)
		ARCH=$optarg
		;;

	--cflags*)
		CFLAGS=$optarg
		;;

	--lflags*)
		LFLAGS=$optarg
		;;

	--outfile*)
		outfile=$optarg
		;;

	--help | --he*)
		fatal=yes
		;;

	--prefix*)
		ROOT=$optarg
		;;

# 	--exec-prefix*)
# 		exec-prefix=$optarg
# 		;;

# 	--bindir*)
# 		bindir=$optarg
# 		;;

# 	--sbindir*)
# 		sbindir=$optarg
# 		;;

# 	--sysconfdir*)
# 		sysconfdir=$optarg
# 		;;

# 	--datadir*)
# 		datadir=$optarg
# 		;;

# 	--includedir*)
# 		includedir=$optarg
# 		;;

# 	--libdir*)
# 		libdir=$optarg
# 		;;

# 	--libexecdir*)
# 		libexecdir=$optarg
# 		;;

# 	--localstatedir*)
# 		localstatedir=$optarg
# 		;;

# 	--sharedstatedir*)
# 		sharedstatedir=$optarg
# 		;;

	--mandir*)
		mandir=$optarg
		;;

# 	--infodir*)
# 		infodir=$optarg
# 		;;

	--bfd-version*)
		BFD_VERSION=$optarg
		;;

	--target-arch*)
		TARGET_ARCH=$optarg
		;;

	--cleanup)
		clean=1
		;;

	--*)
        	echo "configure: Unrecognized option: \"$orig_option\"; use --help for usage." >&2
		exit 1
		;;
	esac
done

if [ $clean ] ;
then
	# First, clean up the workarea
	echo "configure: cleaning up workarea"
	echo "configure: make clobber"
	echo
	make clobber
	( cd utilities/netdump ; make clobber )
	( cd lcrash ; ./configure --cleanup )
	if [ -f $outfile ] ;
	then
		echo "configure: removing $outfile"
		rm -f $outfile
	fi
	if [ -x dwarf ] ;
	then
		echo "configure: removing dwarf"
		rm -rf dwarf
	fi
	exit 0
fi

# Make sure ARCH is defined and that ARCH is an supported architecture
# 

if [ -z $ARCH ] ;
then
        echo
        echo configure: ARCH is undefined!
        fatal=yes
else
    case $ARCH in
    alpha)  ;;
    arm)    ;;
    i386)   ;;
    ia64)   ;;
    s390)   ;;
    s390x)  ;;
    x86_64) ;; 
    xscale) ARCH=arm;;
    ppc64)  # Also check/fix GFLAGS since stabs don't make sense in 64-bit
	case "$GFLAGS" in
		*stabs*)  GFLAGS=-g ;;
	esac
	cat `$CC_LOC"gcc" -v 2>&1 | head -1 | awk '{print $NF}'` | grep __PPC64__ > /dev/null
	if [ $? -eq 0 ] ;
	then
		PPC64_GCC=1
	else
		PPC64_GCC=0
	fi
	;;
    *)
	echo
	echo configure: $ARCH is not a supported architecture!
	fatal=yes
	;;
    esac
fi

#
# select dump arch support
#
init_target_arch()
{
    TARGET_ARCH_ALPHA=n
    TARGET_ARCH_ARM=n
    TARGET_ARCH_I386=n
    TARGET_ARCH_IA64=n
    TARGET_ARCH_S390=n
    TARGET_ARCH_S390X=n
    TARGET_ARCH_XSCALE=n
    TARGET_ARCH_PPC64=n
    TARGET_ARCH_X86_64=n
}

set_target_arch()
{
    case $1 in
    alpha) TARGET_ARCH_ALPHA=y;;
    arm)   TARGET_ARCH_ARM=y;;
    i386)  TARGET_ARCH_I386=y;;
    ia64)  TARGET_ARCH_IA64=y;;
    s390)  TARGET_ARCH_S390=y;;
    s390x) TARGET_ARCH_S390X=y;;
    xscale) TARGET_ARCH_XSCALE=y;;
    ppc64) TARGET_ARCH_PPC64=y;;
    x86_64) TARGET_ARCH_X86_64=y;; 	
    all)
	TARGET_ARCH_ARM=y 
	TARGET_ARCH_I386=y
	TARGET_ARCH_IA64=y
	TARGET_ARCH_S390=y
	TARGET_ARCH_S390X=y
	TARGET_ARCH_PPC64=y
	TARGET_ARCH_X86_64=y
	;;
    everything)
	TARGET_ARCH_ALPHA=y
	TARGET_ARCH_ARM=y
	TARGET_ARCH_I386=y
	TARGET_ARCH_IA64=y
	TARGET_ARCH_S390=y
	TARGET_ARCH_S390X=y
	TARGET_ARCH_XSCALE=y
	TARGET_ARCH_PPC64=y
	TARGET_ARCH_X86_64=y
	;;
    *)
	echo
	echo configure: $i is not a supported architecture!
	fatal=yes
	;;
    esac
}

init_target_arch
if [ -z $TARGET_ARCH ] ;
then
	echo
        echo "configure: TARGET_ARCH is undefined"
	echo "configure: setting TARGET_ARCH=$ARCH"
    set_target_arch $ARCH
else
    OLD_IFS=$IFS
    IFS=,
    for i in $TARGET_ARCH
    do
	set_target_arch $i
    done
    IFS=$OLD_IFS
fi

#
# determine version of bfd (binutils)
#
if [ -z $BFD_VERSION ] ;
then
	echo configure: determine bfd version ...
	$CC_LOC"gcc" -Wall $CFLAGS SOURCES/get_bfd_version.c -o get_bfd_version
	if [ $? -eq 0 ] ;
	then
		BFD_VERSION_NUMBER=`./get_bfd_version`
		if [ $? -ne 0 ] ;
		then
			echo
			echo configure: Could not determine BFD_VERSION_NUMBER!
			fatal=yes
		else
			echo configure: BFD_VERSION_NUMBER=$BFD_VERSION_NUMBER
		fi
	fi
else
	echo configure: configure bfd version ...
	$CC_LOC"gcc" -Wall SOURCES/get_bfd_version.c -o get_bfd_version -DBFD_VERSION=$BFD_VERSION
	if [ $? -eq 0 ] ;
	then
		BFD_VERSION_NUMBER=`./get_bfd_version`
		if [ $? -ne 0 ] ;
		then
			echo
			echo configure: Could not configure BFD_VERSION_NUMBER!
			fatal=yes
		else
			echo configure: BFD_VERSION_NUMBER=$BFD_VERSION_NUMBER
		fi
	fi
fi
    
# print usage of configure script
if [ $fatal ] ;
then
	echo
	echo usage: configure [OPTIONS]
	echo
	echo Options:
	echo ' --cleanup          Clean up the build area (remove lc_config.h, .config, etc.)'
	echo ' --help             Print this message'
	echo ' --arch=ARCH        Target system architecture'
	echo ' --cflags=CFLAGS    global compile options in quotation marks'
	echo ' --lflags=LFLAGS    global linker options in quotation marks'
	echo ' --outfile=OUTFILE  Output file name'
	echo ' --bfd-version=BFD_VERSION'
	echo '                    version of libbfd (should be same as binutils version)'
	echo ' --prefix=PREFIX    prefix for installation directories (default "/")'
	echo ' --target-arch=TARGET_ARCH'
	echo '                    supported dump architectures'
	echo '                    one or more (comma separated) of "alpha",'
	echo '                    "arm", "i386", "ia64", "s390", "s390x", "xscale", "ppc64"'
	echo '                    "all" or "everything"'
	echo '                    ("all" stands for all targets except "alpha",'
	echo '                     "everything" stands for all above targets)'
	exit 0
fi

# Make sure we have a clean workarea to begin with
echo "configure: make clobber"
echo
make clobber

# check to see if libelf library is present
#
if [ ! -f /usr/lib/libelf.a -a ! -f /usr/lib/libelf.so \
	-a ! -f /usr/local/lib/libelf.a -a ! -f /usr/local/lib/libelf.so ]
then
	echo
	echo "*************************************************"
	echo "WARNING: Could not find libelf library!"
	echo "*************************************************"
	echo
fi

# Check to see if libelf.h header file exists. If it doesn't, then 
# we aren't going to be able to build libdwarf. Print out a message
# and bail...
if [ ! -f /usr/include/libelf.h -a ! -f /usr/include/libelf/libelf.h \
	-a ! -f /usr/local/include/libelf.h ]
then
	echo
	echo "*************************************************"
	echo "WARNING: Could not find libelf.h"
	echo "*************************************************"
	echo
	exit 1
fi

# If we found libelf.h then install libdwarf, apply patches, and configure. 
#
if [ -f SOURCES/libdwarf*.tar.gz ]
then
	# If there is already a dwarf directory there, then remove it
	# first
	if [ -x dwarf ]
	then
		rm -rf dwarf
	fi
	tar xvzf SOURCES/libdwarf*.tar.gz

	# rename directory to 'dwarf' to make it easier to clean 
	# up later

	mv dwarf* dwarf
	cd dwarf
	patch -p1 < ../PATCHES/dwarf-rela.patch
	patch -p1 < ../PATCHES/dwarf-lkcd.patch
	cd libdwarf
	./configure
	cd ../..

	# Add the pointer to the libdwarf directory so that we
	# can pick up what we need from there for the build
	CFLAGS="-I$LKCDUTILS_DIR/dwarf/libdwarf $CFLAGS"
	LFLAGS="-L$LKCDUTILS_DIR/dwarf/libdwarf $LFLAGS"
fi

# Make sure to configure lcrash
( cd lcrash ; ./configure --arch=$ARCH --bfd-version=$BFD_VERSION_NUMBER )

#
# generate .config file, used by Makefiles
#
init_config()
{
    echo "# This file is automaticly generated by the lkcdutils configure script." >$outfile
    echo "# Do not edit by hand!" >> $outfile
    echo "# " >> $outfile
}
append_var_to_config()
{
    eval echo $1=\$$1 >> $outfile
}

init_config
append_var_to_config LKCDUTILS_DIR
append_var_to_config ARCH
append_var_to_config CFLAGS
append_var_to_config LFLAGS
append_var_to_config TARGET_ARCH_ALPHA
append_var_to_config TARGET_ARCH_ARM
append_var_to_config TARGET_ARCH_I386
append_var_to_config TARGET_ARCH_IA64
append_var_to_config TARGET_ARCH_S390
append_var_to_config TARGET_ARCH_S390X
append_var_to_config TARGET_ARCH_XSCALE
append_var_to_config TARGET_ARCH_PPC64
append_var_to_config TARGET_ARCH_X86_64
append_var_to_config ROOT
append_var_to_config SYS_VER
append_var_to_config mandir
if [ $ARCH = "ppc64" ] ;
then
	append_var_to_config PPC64_GCC
fi

