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