summaryrefslogtreecommitdiffstats
path: root/configs/build_configs.sh
blob: 4ccb0dc2e330c16fcdb75b0455d8c7c0ecc24c1a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#!/bin/bash
#
# This script merges together the hierarchy of CONFIG_* files under generic
# and debug to form the necessary $PACKAGE_NAME<version>-<arch>-<variant>.config
# files for building RHEL kernels, based on the contents of a control file

PACKAGE_NAME="${1:-kernel}" # defines the package name used
KVERREL="${2:-}"
SUBARCH="${3:-}" # defines a specific arch
SCRIPT="$(readlink -f $0)"
OUTPUT_DIR="$PWD"
SCRIPT_DIR="$(dirname $SCRIPT)"

LANG=en_US.UTF-8

# to handle this script being a symlink
cd $SCRIPT_DIR

set errexit
set nounset

cleanup()
{
	rm -f config-*
}

die()
{
	echo "$1"
	cleanup
	exit 1
}

function combine_config_layer()
{
	dir=$1
	file="config-$(echo $dir | sed -e 's|/|-|g')"

	if [ $(ls $dir/ | grep -c "^CONFIG_") -eq 0 ]; then
		touch $file
		return
	fi

	cat $dir/CONFIG_* > $file
}

function merge_configs()
{
	archvar=$1
	arch=$(echo "$archvar" | cut -f1 -d"-")
	configs=$2
	order=$3
	flavor=$4

	name=$OUTPUT_DIR/$PACKAGE_NAME-$archvar-$flavor.config
	echo -n "Building $name ... "
	touch config-merging config-merged

	# apply based on order
	skip_if_missing=""
	for o in $order
	do
		for config in $(echo $configs | sed -e 's/:/ /g')
		do
			cfile="config-$o-$config"

			test -n "$skip_if_missing" && test ! -e $cfile && continue

			perl merge.pl $cfile config-merging > config-merged
			if [ ! $? -eq 0 ]; then
				die "Failed to merge $cfile"
			fi
			mv config-merged config-merging
		done

		# first configs in $order is baseline, all files should be
		# there.  second pass is overrides and can be missing.
		skip_if_missing="1"
	done
	if [ "x$arch" == "xaarch64" ]; then
		echo "# arm64" > $name
	elif [ "x$arch" == "xppc64le" ]; then
		echo "# powerpc" > $name
	elif [ "x$arch" == "xs390x" ]; then
		echo "# s390" > $name
	elif [ "x$arch" == "xarmv7hl" ]; then
		echo "# arm" > $name
	elif [ "x$arch" == "xi686" ]; then
		echo "# i386" > $name
	else
		echo "# $arch" > $name
	fi
	sort config-merging >> $name
	rm -f config-merged config-merging
	echo "done"
}

function build_flavor()
{
	flavor=$1
	control_file="priority".$flavor
	while read line
	do
		if [ $(echo "$line" | grep -c "^#") -ne 0 ]; then
			continue
		elif [ $(echo "$line" | grep -c "^$") -ne 0 ]; then
			continue
		elif [ $(echo "$line" | grep -c "^EMPTY") -ne 0 ]; then
			empty=$(echo "$line" | cut -f2 -d"=")
			for a in $empty
			do
				echo "# EMPTY" > $OUTPUT_DIR/$PACKAGE_NAME-$a-$flavor.config

			done
		elif [ $(echo "$line" | grep -c "^ORDER") -ne 0 ]; then
			order=$(echo "$line" | cut -f2 -d"=")
			for o in $order
			do
				glist=$(find $o -type d)
				for d in $glist
				do
					combine_config_layer $d
				done
			done
		else
			arch=$(echo "$line" | cut -f1 -d"=")
			configs=$(echo "$line" | cut -f2 -d"=")

			if [ -n "$SUBARCH" ]; then
				case $arch in
					$SUBARCH*)
						;;
					*)
						continue
				esac
			fi

			merge_configs $arch $configs "$order" $flavor
		fi
	done < $control_file
}

while read line
do
	build_flavor $line
done < flavors

# A passed in kernel version implies copy to final location
# otherwise defer to another script
if test -n "$KVERREL"
then
	for i in kernel-*.config
	do
		NEW="$(echo $i | sed "s/$PACKAGE_NAME-$SUBARCH/$PACKAGE_NAME-$KVERREL-$SUBARCH/")"
		mv $i $NEW
	done
fi

cleanup