dnl 
dnl configure.ac for mkelfImage
dnl 
dnl 

dnl ---Required
AC_INIT(kexec-tools, 2.0.2)
AC_CONFIG_AUX_DIR(./config)
AC_CONFIG_HEADERS([include/config.h])
AC_LANG(C)

AC_DEFINE_UNQUOTED(PACKAGE_DATE, "`date '+%d %B %Y'`",
		[Define to the release date of this package])


dnl -- Compilation platform configuration
dnl -- the host specifices the host machine for the kexec binary, the
dnl -- the target specifies the architecture of the kernel to be kexeced.
AC_CANONICAL_HOST
AC_CANONICAL_TARGET

dnl Compute ARCH from target cpu info
case $target_cpu in
	i?86 )
		ARCH="i386"
		;;
	powerpc )
		ARCH="ppc"
		;;
	powerpc64 )
		ARCH="ppc64"
		;;
	arm* )
		ARCH="arm"
		;;
	s390x|s390 )
		ARCH="s390"
		;;
	sh4|sh4a|sh3|sh )
		ARCH="sh"
		;;
	mips* )
		ARCH="mips"
		;;
	cris|crisv32 )
		ARCH="cris"
		;;
	ia64|x86_64|alpha )
		ARCH="$target_cpu"
		;;
	* )
		AC_MSG_ERROR([unsupported architecture $target_cpu])
		;;
esac

dnl ---Options

OBJDIR=`pwd`/objdir
if test "${host_alias}" ; then
	OBJDIR="$OBJDIR-${host_alias}"
fi

if test "x$BUILD_CFLAGS" = "x" ; then
	BUILD_CFLAGS='-O2 -Wall'
fi

if test "x$TARGET_CFLAGS" = "x" ; then
	TARGET_CFLAGS='-O2 -Wall'
fi

AC_ARG_WITH([objdir], AC_HELP_STRING([--with-objdir=<dir>],[select directory for object files]),
	[ OBJDIR="$withval" ], [ OBJDIR="$OBJDIR" ])

AC_ARG_WITH([gamecube],
		AC_HELP_STRING([--with-gamecube],[enable gamecube support]),
		AC_DEFINE(WITH_GAMECUBE, 1,
			[Define to include gamecube support]))

AC_ARG_WITH([zlib], AC_HELP_STRING([--without-zlib],[disable zlib support]),
	[ with_zlib="$withval"], [ with_zlib=yes ] )

AC_ARG_WITH([lzma], AC_HELP_STRING([--without-lzma],[disable lzma support]),
	[ with_lzma="$withval"], [ with_lzma=yes ] )

AC_ARG_WITH([xen], AC_HELP_STRING([--without-xen],
	[disable extended xen support]), [ with_xen="$withval"], [ with_xen=yes ] )

dnl ---Programs
dnl To specify a different compiler, just 'export CC=/path/to/compiler'

AC_PROG_CC

if test "${build}" != "${host}" ; then
	AC_CHECK_PROGS(BUILD_CC, [${build_alias}-gcc ${build}-gcc gcc])
else
	BUILD_CC="$CC"
fi

dnl Find the compiler tool chain
AC_PROG_CPP
AC_CHECK_TOOL([LD], ld, "no", $PATH)
AC_CHECK_TOOL([AS], as, "no", $PATH)
AC_CHECK_TOOL([OBJCOPY], objcopy, "no", $PATH)
AC_CHECK_TOOL([AR], ar, "", $PATH)

dnl Find compiler for target
if test "${target}" != "${host}" ; then
	AC_CHECK_PROGS(TARGET_CC, [${target_alias}-gcc ${target}-gcc gcc])
	AC_CHECK_PROGS(TARGET_LD, [${target_alias}-ld ${target}-ld ld])
else
	TARGET_CC="$CC"
	TARGET_LD="$LD"
fi

AC_MSG_CHECKING([whether $TARGET_CC accepts -fno-zero-initialized-in-bss])
saved_CFLAGS="$CFLAGS"
saved_CC="$CC"
CC="$TARGET_CC"
CFLAGS="$CFLAGS -fno-zero-initialized-in-bss"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,,)],
		  PURGATORY_EXTRA_CFLAGS="-fno-zero-initialized-in-bss"
		  AC_MSG_RESULT([Yes]), AC_MSG_RESULT([No]))
CFLAGS="$saved_CFLAGS"
CC="$saved_CC"

AC_SUBST(PURGATORY_EXTRA_CFLAGS, [$PURGATORY_EXTRA_CFLAGS])

dnl Find the helper functions
AC_PROG_INSTALL
AC_CHECK_PROG([MKDIR],    mkdir,    mkdir,    "no", [$PATH])
AC_CHECK_PROG([RM],       rm,       rm,       "no", [$PATH])
AC_CHECK_PROG([CP],       cp,       cp,       "no", [$PATH])
AC_CHECK_PROG([LN],       ln,       ln,       "no", [$PATH])
AC_CHECK_PROG([TAR],      tar,      tar,      "no", [$PATH])
AC_CHECK_PROG([RPMBUILD], rpmbuild, rpmbuild, "no", [$PATH])
AC_CHECK_PROG([SED],      sed,      sed,      "no", [$PATH])
AC_CHECK_PROG([FIND],     find,     find,     "no", [$PATH])
AC_CHECK_PROG([XARGS],    xargs,    xargs,    "no", [$PATH])
AC_CHECK_PROG([DIRNAME],  dirname,  dirname,  "no", [$PATH])

dnl See if I have a usable copy of zlib available
if test "$with_zlib" = yes ; then
	AC_CHECK_HEADER(zlib.h,
		AC_CHECK_LIB(z, inflateInit_, ,
		AC_MSG_NOTICE([zlib support disabled])))
fi

dnl See if I have a usable copy of lzma available
if test "$with_lzma" = yes ; then
	AC_CHECK_HEADER(lzma.h,
		AC_CHECK_LIB(lzma, lzma_code, ,
		AC_MSG_NOTICE([lzma support disabled])))
fi

dnl find Xen control stack libraries
if test "$with_xen" = yes ; then
	AC_CHECK_HEADER(xenctrl.h,
		AC_CHECK_LIB(xenctrl, xc_version, ,
		AC_MSG_NOTICE([Xen support disabled])))
fi

dnl new toolchains
if test "$ARCH" = ppc; then
AC_ARG_WITH([oldtoolchain],
		AC_HELP_STRING([--with-oldtoolchain],[compile without crt.S
			required for new toolchains]),
		AC_DEFINE(PPC_OLDTOOLCHAIN, 1,
			[Define to compile with old toolchains]))
fi

dnl ---Sanity checks
if test "$CC"      = "no"; then AC_MSG_ERROR([cc not found]); fi
if test "$CPP"     = "no"; then AC_MSG_ERROR([cpp not found]); fi
if test "$LD"      = "no"; then AC_MSG_ERROR([ld not found]); fi
if test "$AS"      = "no"; then AC_MSG_ERROR([as not found]); fi
if test "$OBJCOPY" = "no"; then	AC_MSG_ERROR([objcopy not found]); fi
if test "$AR"      = "no"; then	AC_MSG_ERROR([ar not found]); fi

if test "$MKDIR"   = "no"; then AC_MSG_ERROR([ mkdir not found]); fi
if test "$RM"      = "no"; then AC_MSG_ERROR([ rm not found]); fi
if test "$CP"      = "no"; then AC_MSG_ERROR([ cp not found]); fi
if test "$LN"      = "no"; then AC_MSG_ERROR([ ln not found]); fi
if test "$TAR"     = "no"; then AC_MSG_ERROR([ tar not found]); fi
if test "$RPM"     = "no"; then AC_MSG_ERROR([ rpm not found]); fi
if test "$SED"     = "no"; then AC_MSG_ERROR([ sed not found]); fi
if test "$FIND"    = "no"; then AC_MSG_ERROR([ find not found]); fi
if test "$XARGS"   = "no"; then AC_MSG_ERROR([ xargs not found]); fi
if test "$DIRNAME" = "no"; then AC_MSG_ERROR([ dirname not found]); fi

dnl ---Output variables...
AC_SUBST([BUILD_CC])
AC_SUBST([BUILD_CFLAGS])
AC_SUBST([TARGET_CC])
AC_SUBST([TARGET_LD])
AC_SUBST([TARGET_CFLAGS])
AC_SUBST([ASFLAGS])

AC_SUBST([ARCH])
AC_SUBST([OBJDIR])
AC_SUBST([INSTALL])

dnl ---Output
AC_OUTPUT([Makefile])
