1b7eeb8
#!/bin/bash
1b7eeb8
#
1b7eeb8
# This script merges together the hierarchy of CONFIG_* files under generic
1b7eeb8
# and debug to form the necessary $PACKAGE_NAME<version>-<arch>-<variant>.config
1b7eeb8
# files for building RHEL kernels, based on the contents of a control file
1b7eeb8
2bf928d
PACKAGE_NAME="${1:-kernel}" # defines the package name used
2bf928d
KVERREL="${2:-}"
62496f7
SUBARCH="${3:-}" # defines a specific arch
2bf928d
SCRIPT="$(readlink -f $0)"
2bf928d
OUTPUT_DIR="$PWD"
2bf928d
SCRIPT_DIR="$(dirname $SCRIPT)"
2bf928d
405061d
LANG=en_US.UTF-8
405061d
2bf928d
# to handle this script being a symlink
2bf928d
cd $SCRIPT_DIR
1b7eeb8
1b7eeb8
set errexit
1b7eeb8
set nounset
1b7eeb8
1b7eeb8
control_file="config_generation"
1b7eeb8
2bf928d
cleanup()
2bf928d
{
2bf928d
	rm -f config-*
2bf928d
}
2bf928d
2bf928d
die()
2bf928d
{
2bf928d
	echo "$1"
2bf928d
	cleanup
2bf928d
	exit 1
2bf928d
}
2bf928d
1b7eeb8
function combine_config_layer()
1b7eeb8
{
1b7eeb8
	dir=$1
1b7eeb8
	file="config-$(echo $dir | sed -e 's|/|-|g')"
1b7eeb8
1b7eeb8
	if [ $(ls $dir/ | grep -c "^CONFIG_") -eq 0 ]; then
1b7eeb8
		touch $file
1b7eeb8
		return
1b7eeb8
	fi
1b7eeb8
1b7eeb8
	cat $dir/CONFIG_* > $file
1b7eeb8
}
1b7eeb8
1b7eeb8
function merge_configs()
1b7eeb8
{
1b7eeb8
	archvar=$1
1b7eeb8
	arch=$(echo "$archvar" | cut -f1 -d"-")
1b7eeb8
	configs=$2
62496f7
	order=$3
2bf928d
	name=$OUTPUT_DIR/$PACKAGE_NAME-$archvar.config
1b7eeb8
	echo -n "Building $name ... "
1b7eeb8
	touch config-merging config-merged
2bf928d
62496f7
	# apply based on order
62496f7
	skip_if_missing=""
62496f7
	for o in $order
2bf928d
	do
62496f7
		for config in $(echo $configs | sed -e 's/:/ /g')
62496f7
		do
62496f7
			cfile="config-$o-$config"
62496f7
62496f7
			test -n "$skip_if_missing" && test ! -e $cfile && continue
62496f7
62496f7
			perl merge.pl $cfile config-merging > config-merged
62496f7
			if [ ! $? -eq 0 ]; then
62496f7
				die "Failed to merge $cfile"
62496f7
			fi
62496f7
			mv config-merged config-merging
62496f7
		done
62496f7
62496f7
		# first configs in $order is baseline, all files should be
62496f7
		# there.  second pass is overrides and can be missing.
62496f7
		skip_if_missing="1"
1b7eeb8
	done
1b7eeb8
	if [ "x$arch" == "xaarch64" ]; then
1b7eeb8
		echo "# arm64" > $name
1b7eeb8
	elif [ "x$arch" == "xppc64le" ]; then
1b7eeb8
		echo "# powerpc" > $name
1b7eeb8
	elif [ "x$arch" == "xs390x" ]; then
1b7eeb8
		echo "# s390" > $name
1b7eeb8
	elif [ "x$arch" == "xarmv7hl" ]; then
1b7eeb8
		echo "# arm" > $name
1b7eeb8
	elif [ "x$arch" == "xi686" ]; then
1b7eeb8
		echo "# i386" > $name
1b7eeb8
	else
1b7eeb8
		echo "# $arch" > $name
1b7eeb8
	fi
1b7eeb8
	sort config-merging >> $name
1b7eeb8
	rm -f config-merged config-merging
1b7eeb8
	echo "done"
1b7eeb8
}
1b7eeb8
1b7eeb8
while read line
1b7eeb8
do
1b7eeb8
	if [ $(echo "$line" | grep -c "^#") -ne 0 ]; then
1b7eeb8
		continue
1b7eeb8
	elif [ $(echo "$line" | grep -c "^$") -ne 0 ]; then
1b7eeb8
		continue
62496f7
	elif [ $(echo "$line" | grep -c "^ORDER") -ne 0 ]; then
62496f7
		order=$(echo "$line" | cut -f2 -d"=")
62496f7
		for o in $order
62496f7
		do
62496f7
			glist=$(find $o -type d)
62496f7
			for d in $glist
62496f7
			do
62496f7
				combine_config_layer $d
62496f7
			done
62496f7
		done
1b7eeb8
	else
1b7eeb8
		arch=$(echo "$line" | cut -f1 -d"=")
1b7eeb8
		configs=$(echo "$line" | cut -f2 -d"=")
1b7eeb8
1b7eeb8
		if [ -n "$SUBARCH" -a "$SUBARCH" != "$arch" ]; then
1b7eeb8
			continue
1b7eeb8
		fi
1b7eeb8
62496f7
		merge_configs $arch $configs "$order"
1b7eeb8
	fi
1b7eeb8
done < $control_file
1b7eeb8
2bf928d
# A passed in kernel version implies copy to final location
2bf928d
# otherwise defer to another script
2bf928d
if test -n "$KVERREL"
2bf928d
then
2bf928d
	for i in kernel-*.config
2bf928d
	do
2bf928d
		NEW="$(echo $i | sed "s/$PACKAGE_NAME-$SUBARCH/$PACKAGE_NAME-$KVERREL-$SUBARCH/")"
2bf928d
		mv $i $NEW
2bf928d
	done
2bf928d
fi
2bf928d
2bf928d
cleanup