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