xref: /OK3568_Linux_fs/buildroot/build/update_defconfig.sh (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1#!/bin/bash
2#
3# Usage:
4# update_defconfig.sh <defconfig> [output dir]
5
6set -e
7
8# Usage: savedefconfig <output defconfig> [input defconfig]
9savedefconfig()
10{
11	TARGET="$1"
12	TMP_CONFIG="${CONFIG}.tmp"
13
14	if [ "$2" ]; then
15		"$SCRIPT_DIR/parse_defconfig.sh" "$2" "$TMP_CONFIG" >/dev/null
16	else
17		cp -f "$CONFIG" "$TMP_CONFIG"
18	fi
19
20	sed -i "/BR2_DEFCONFIG/d" "$TMP_CONFIG"
21	echo "BR2_DEFCONFIG=\"$TARGET\"" >> "$TMP_CONFIG"
22
23	# Based on buildroot/Makefile's savedefconfig
24	BR2_DEFCONFIG="$TARGET" BR2_CONFIG="$TMP_CONFIG" \
25		KCONFIG_AUTOCONFIG=$CONFIG_DIR/auto.conf \
26		KCONFIG_AUTOHEADER=$CONFIG_DIR/autoconf.h \
27		KCONFIG_TRISTATE=$CONFIG_DIR/tristate.config \
28		BASE_DIR="$OUTPUT_DIR" SKIP_LEGACY= \
29		HOST_GCC_VERSION="$HOST_GCC_VERSION" \
30		CUSTOM_KERNEL_VERSION="$CUSTOM_KERNEL_VERSION" \
31		HOSTARCH="$HOSTARCH" BR2_VERSION_FULL="$BR2_VERSION_FULL" \
32		$CONFIG_DIR/conf --savedefconfig="$TARGET" \
33		Config.in >/dev/null
34	sed -i '/^BR2_DEFCONFIG=/d' "$TARGET"
35}
36
37BOARD="$(basename "${1%_defconfig}")"
38[ -n "$BOARD" ] || exit 1
39
40SCRIPT_DIR="$(realpath "$(dirname "$0")")"
41BUILDROOT_DIR="$(dirname "$SCRIPT_DIR")"
42OUTPUT_DIR="${2:-$BUILDROOT_DIR/output/$BOARD}"
43cd "$BUILDROOT_DIR"
44
45DEFCONFIG="configs/${BOARD}_defconfig"
46[ -r "$DEFCONFIG" ] || exit 1
47
48echo "Updating defconfig: $DEFCONFIG"
49
50CONFIG="$OUTPUT_DIR/.config"
51ORIG_DEFCONFIG="$OUTPUT_DIR/.defconfig"
52BASE_DEFCONFIG="$OUTPUT_DIR/.base_defconfig"
53NEW_DEFCONFIG="$OUTPUT_DIR/.new_defconfig"
54FRAGMENT="$OUTPUT_DIR/.fragment"
55
56CONFIG_DIR="$OUTPUT_DIR/build/buildroot-config"
57HOST_GCC_VERSION="$(gcc --version | head -n 1 | xargs -n 1 | \
58	tail -n 1 | cut -d'.' -f1)"
59CUSTOM_KERNEL_VERSION="$(head -n 2 "$BUILDROOT_DIR/../kernel/Makefile" | \
60	cut -d' ' -f3 | paste -sd'.')"
61HOSTARCH="$(uname -m)"
62BR2_VERSION_FULL="$(grep "export BR2_VERSION := " \
63	"$BUILDROOT_DIR/Makefile" | xargs -n 1 | tail -n 1)"
64
65# Generate original defconfig
66if [ ! -r "$CONFIG" ]; then
67	mkdir -p "$OUTPUT_DIR"
68	savedefconfig "$ORIG_DEFCONFIG" "$DEFCONFIG"
69else
70	savedefconfig "$ORIG_DEFCONFIG"
71fi
72echo "Original defconfig saved to $ORIG_DEFCONFIG"
73
74# Generate base defconfig
75grep "^#include " $DEFCONFIG > "$FRAGMENT" || true
76savedefconfig "$BASE_DEFCONFIG" "$FRAGMENT"
77echo "Base defconfig saved to $BASE_DEFCONFIG"
78
79# Update defconfig fragment
80SED_CONFIG_EXP1="s/^\(<\|>\) \([a-zA-Z0-9_]*\)=.*/\2/p"
81SED_CONFIG_EXP2="s/^\(<\|>\) # \([a-zA-Z0-9_]*\) is not set$/\2/p"
82SED_STRING_EXP="s/^.*=\"\(.*\)\"/\1/p"
83
84CFG_LIST=$(diff "$ORIG_DEFCONFIG" "$BASE_DEFCONFIG" | \
85	sed -n -e "$SED_CONFIG_EXP1" -e "$SED_CONFIG_EXP2" | sort | uniq)
86
87for CFG in $CFG_LIST ; do
88	BASE_VAL=$(grep -w $CFG "$BASE_DEFCONFIG" || true)
89	ORIG_NEW_VAL=$(grep -w $CFG "$ORIG_DEFCONFIG" || true)
90
91	if [ -z "$ORIG_NEW_VAL" ]; then
92		# Reset to default
93		NEW_VAL="# $CFG is reset to default"
94	else
95		# Replace
96		NEW_VAL="$ORIG_NEW_VAL"
97
98		if grep -q "^$CFG+=" "$DEFCONFIG"; then
99			BASE_STR=$(echo "$BASE_VAL" | sed -n "$SED_STRING_EXP")
100			NEW_STR=$(echo "$NEW_VAL" | sed -n "$SED_STRING_EXP")
101			if [ -n "$BASE_STR" -a -n "$NEW_VAL" ]; then
102				# Try to extract additional strings
103				for s in $BASE_STR; do
104					NEW_STR=$(echo "$NEW_STR" | \
105						xargs -n 1 | grep -v "^$s$" | \
106						xargs)
107				done
108
109				NEW_VAL="${NEW_STR:+$CFG+=\"$NEW_STR\"}"
110			fi
111		fi
112	fi
113
114	echo "$NEW_VAL" >> $FRAGMENT
115
116	echo "Value of $CFG applied to fragment:"
117	echo -e "Base value:\t$BASE_VAL"
118	if [ -n "$ORIG_NEW_VAL" -a "$NEW_VAL" != "$ORIG_NEW_VAL" ]; then
119		echo -e "New value:\t$ORIG_NEW_VAL"
120	fi
121	echo -e "Final value:\t$NEW_VAL"
122	echo
123done
124
125# Update defconfig fragment for dependency changes
126savedefconfig "$NEW_DEFCONFIG" "$FRAGMENT"
127
128CFG_LIST=$(diff "$ORIG_DEFCONFIG" "$NEW_DEFCONFIG" | \
129	sed -n -e "$SED_CONFIG_EXP1" -e "$SED_CONFIG_EXP2" | sort | uniq)
130for CFG in $CFG_LIST ; do
131	grep -wq $CFG "$FRAGMENT" || \
132		echo "# $CFG is reset to default" >> $FRAGMENT
133done
134
135cat $FRAGMENT > $DEFCONFIG
136
137# Verify defconfig fragment
138savedefconfig "$NEW_DEFCONFIG" "$DEFCONFIG"
139if diff "$ORIG_DEFCONFIG" "$NEW_DEFCONFIG" | grep ""; then
140	echo "Configs unmatched, might be something wrong."
141	exit 1
142fi
143
144# Strip unneeded config resets
145TEMP_FILE=$(mktemp)
146for CFG in $(grep " is reset to default$" "$DEFCONFIG" | cut -d' ' -f2); do
147	grep -wv "$CFG" "$DEFCONFIG" > $TEMP_FILE
148	savedefconfig "$NEW_DEFCONFIG" $TEMP_FILE
149	if ! diff "$ORIG_DEFCONFIG" "$NEW_DEFCONFIG" | grep -q ""; then
150		cat $TEMP_FILE > "$DEFCONFIG"
151	fi
152done
153
154echo "Done updating $DEFCONFIG."
155