#!/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/chromeos/config"
archs="x86_64 i386 armel"
family='chromeos'
bindir="`pwd`/chromeos/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_64"	;;
		lpia)   kernarch="x86" ;;
		sparc)	kernarch="sparc64"	;;
		armel)  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
)
