dnl 
dnl configure.ac for kexec-tools
dnl 
dnl 

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


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"
		SUBARCH="BE"
		;;
	powerpc64 )
		ARCH="ppc64"
		SUBARCH="BE"
		;;
	powerpc64le )
		ARCH="ppc64"
		SUBARCH="LE"
		;;
	aarch64* )
		ARCH="arm64"
		;;
	arm* )
		ARCH="arm"
		;;
	s390x|s390 )
		ARCH="s390"
		;;
	sh4|sh4a|sh3|sh )
		ARCH="sh"
		;;
	mips* )
		ARCH="mips"
		;;
	cris|crisv32 )
		ARCH="cris"
		;;
	ia64|x86_64|alpha|m68k )
		ARCH="$target_cpu"
		;;
	hppa*)
		ARCH="hppa"
		;;
	loongarch*)
		ARCH="loongarch"
		;;
	* )
		AC_MSG_ERROR([unsupported architecture $target_cpu])
		;;
esac

if test "$ARCH" = "x86_64" ; then
	case $target in
		*x32 )
			SUBARCH="x32"
			;;
		* )
			SUBARCH=""
			;;
	esac
fi

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 ] )

AC_ARG_WITH([booke],
		AC_HELP_STRING([--with-booke],[build for booke]),
		AC_DEFINE(CONFIG_BOOKE,1,
			[Define to build for BookE]))

dnl ---Programs
dnl To specify a different compiler, just 'export CC=/path/to/compiler'
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)
AC_CHECK_TOOL([STRIP], strip, "no", $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([CHMOD],    chmod,    chmod,    "no", [$PATH])
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_kexec_load, ,
		AC_MSG_NOTICE([Xen support disabled]))])
fi

dnl Link libxenctrl.so at run-time rather than build-time
if test "$with_xen" = dl ; then
	AC_CHECK_HEADER(dlfcn.h,
		[AC_CHECK_LIB(dl, dlopen, ,
			AC_MSG_ERROR([Dynamic library linking not available]))],
		AC_MSG_ERROR([Dynamic library linking header not available]))
	AC_DEFINE(CONFIG_LIBXENCTRL_DL, 1, [Define to 1 to link libxenctrl.so at run-time rather than build-time])
	AC_CHECK_HEADER(xenctrl.h,
		[AC_CHECK_LIB(xenctrl, xc_kexec_load,
		AC_DEFINE(HAVE_LIBXENCTRL, 1, ), # required define, and prevent -lxenctrl
		AC_MSG_NOTICE([Xen support disabled]))])
fi

dnl Check for the Xen kexec_status hypercall - reachable from --with-xen=yes|dl
if test "$ac_cv_lib_xenctrl_xc_kexec_load" = yes ; then
	AC_CHECK_LIB(xenctrl, xc_kexec_status,
		AC_DEFINE(HAVE_KEXEC_CMD_STATUS, 1,
			[The kexec_status call is available]),
		AC_MSG_NOTICE([The kexec_status call is not available]))
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
if test "$STRIP"   = "no"; then AC_MSG_ERROR([ strip 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([SUBARCH])
AC_SUBST([OBJDIR])
AC_SUBST([INSTALL])

dnl ---Output
AC_OUTPUT([Makefile])
