#!/bin/bash

# Script to merge all configs and run 'make silentoldconfig' on it to wade out bad juju.
# Then split the configs into distro-commmon and flavour-specific parts

# We have to be in the top level kernel source directory
if [ ! -f MAINTAINERS ] || [ ! -f Makefile ]; then
	echo "This does not appear to be the kernel source directory." 1>&2
	exit 1
fi

mode=${1:?"Usage: $0 [oldconfig|editconfig]"}
case "$mode" in
    oldconfig)  ;; # All is good
    editconfig) ;; # All is good
    genconfig)  ;; # All is good
    *) echo "$0 called with invalid mode" 1>&2
       exit 1 ;;
esac
kerneldir="`pwd`"
confdir="$kerneldir/sablink/config"
#archs="amd64 x86 armv5tel armv6j armv7a"
archs="amd64 x86 armv5tel armv7a"
family='sablink'
bindir="`pwd`/sablink/scripts"
common_conf="$confdir/config.common.$family"
tmpdir=`mktemp -d`

if [ "$mode" = "genconfig" ]; then
	keep=1
	mode="oldconfig"
	test -d CONFIGS || mkdir CONFIGS
fi

test -d build || mkdir build

for arch in $archs; do
	# Map debian archs to kernel archs
	case "$arch" in
		amd64)	kernarch="x86"	;;
		x86)   kernarch="x86" ;;
		sparc)	kernarch="sparc64"	;;
		armv5tel)  kernarch="arm" ;;
		armv6j)  kernarch="arm" ;;
		armv7a)  kernarch="arm" ;;
		*)	kernarch="$arch"	;;
	esac

	echo ""
	echo "***************************************"
	echo "* Processing $arch ($kernarch) ... "
	archconfdir=$confdir/$arch
	flavourconfigs=$(cd $archconfdir && ls config.flavour.*[^~])

	# Merge configs
	# We merge config.common.ubuntu + config.common.<arch> +
	# config.flavour.<flavour>

	for config in $flavourconfigs; do
		fullconf="$tmpdir/$arch-$config-full"
		case $config in
		*)
			: >"$fullconf"
			if [ -f $common_conf ]; then
				cat $common_conf >> "$fullconf"
			fi
			if [ -f $archconfdir/config.common.$arch ]; then
				cat $archconfdir/config.common.$arch >> "$fullconf"
			fi
			cat "$archconfdir/$config" >>"$fullconf"
			;;
		esac
	done

	for config in $flavourconfigs; do
		if [ -f $archconfdir/$config ]; then
			fullconf="$tmpdir/$arch-$config-full"
			cat "$fullconf" > build/.config
			# Call oldconfig or menuconfig
			case "$mode" in
			    oldconfig)
				# Weed out incorrect config parameters
				echo "* Run silentoldconfig on $arch/$config ..."
				make O=`pwd`/build ARCH=$kernarch silentoldconfig ;;
			    editconfig)
				# Interactively edit config parameters
				echo " * Run menuconfig on $arch/$config... Press a key."
				read
				make O=`pwd`/build ARCH=$kernarch menuconfig ;;
			    *)  # Bad!
				exit 1 ;;
			esac
			cat build/.config > $archconfdir/$config
			if [ "$keep" = "1" ]; then
				cat build/.config > CONFIGS/$arch-$config
			fi
		else
			echo "!! Config not found $archconfdir/$config..."
		fi
	done

	echo "Running splitconfig for $arch"
	echo

	# Can we make this more robust by avoiding $tmpdir completely?
	# This approach was used for now because I didn't want to change
	# splitconfig
	(cd $archconfdir; rm config.common.$arch; $bindir/splitconfig; \
	    mv config.common config.common.$arch; \
	    cp config.common.$arch $tmpdir)
done

rm -f $common_conf

# Now run splitconfig on all the config.common.<arch> copied to
# $tmpdir
(cd $tmpdir; $bindir/splitconfig)
(
	cd $confdir;
	rm -f *-full
	grep -v 'is UNMERGABLE' <$tmpdir/config.common >$common_conf
	for arch in $archs; do
		grep -v 'is UNMERGABLE' <$tmpdir/config.common.$arch \
			>$arch/config.common.$arch
	done
)
