xref: /nrf52832-nimble/rt-thread/tools/kconfig-frontends/utils/kconfig-merge (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero#!/bin/sh
2*10465441SEvalZero#  merge_config.sh - Takes a list of config fragment values, and merges
3*10465441SEvalZero#  them one by one. Provides warnings on overridden values, and specified
4*10465441SEvalZero#  values that did not make it to the resulting .config file (due to missed
5*10465441SEvalZero#  dependencies or config symbol removal).
6*10465441SEvalZero#
7*10465441SEvalZero#  Portions reused from kconf_check and generate_cfg:
8*10465441SEvalZero#  http://git.yoctoproject.org/cgit/cgit.cgi/yocto-kernel-tools/tree/tools/kconf_check
9*10465441SEvalZero#  http://git.yoctoproject.org/cgit/cgit.cgi/yocto-kernel-tools/tree/tools/generate_cfg
10*10465441SEvalZero#
11*10465441SEvalZero#  Copyright (c) 2009-2010 Wind River Systems, Inc.
12*10465441SEvalZero#  Copyright 2011 Linaro
13*10465441SEvalZero#
14*10465441SEvalZero#  This program is free software; you can redistribute it and/or modify
15*10465441SEvalZero#  it under the terms of the GNU General Public License version 2 as
16*10465441SEvalZero#  published by the Free Software Foundation.
17*10465441SEvalZero#
18*10465441SEvalZero#  This program is distributed in the hope that it will be useful,
19*10465441SEvalZero#  but WITHOUT ANY WARRANTY; without even the implied warranty of
20*10465441SEvalZero#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21*10465441SEvalZero#  See the GNU General Public License for more details.
22*10465441SEvalZero
23*10465441SEvalZeroclean_up() {
24*10465441SEvalZero	rm -f $TMP_FILE
25*10465441SEvalZero	exit
26*10465441SEvalZero}
27*10465441SEvalZerotrap clean_up HUP INT TERM
28*10465441SEvalZero
29*10465441SEvalZerousage() {
30*10465441SEvalZero	echo "Usage: $0 [OPTIONS] [CONFIG [...]]"
31*10465441SEvalZero	echo "  -h    display this help text"
32*10465441SEvalZero	echo "  -m    only merge the fragments, do not execute the make command"
33*10465441SEvalZero	echo "  -n    use allnoconfig instead of alldefconfig"
34*10465441SEvalZero	echo "  -r    list redundant entries when merging fragments"
35*10465441SEvalZero	echo "  -O    dir to put generated output files.  Consider setting \$KCONFIG_CONFIG instead."
36*10465441SEvalZero}
37*10465441SEvalZero
38*10465441SEvalZeroRUNMAKE=true
39*10465441SEvalZeroALLTARGET=alldefconfig
40*10465441SEvalZeroWARNREDUN=false
41*10465441SEvalZeroOUTPUT=.
42*10465441SEvalZero
43*10465441SEvalZerowhile true; do
44*10465441SEvalZero	case $1 in
45*10465441SEvalZero	"-n")
46*10465441SEvalZero		ALLTARGET=allnoconfig
47*10465441SEvalZero		shift
48*10465441SEvalZero		continue
49*10465441SEvalZero		;;
50*10465441SEvalZero	"-m")
51*10465441SEvalZero		RUNMAKE=false
52*10465441SEvalZero		shift
53*10465441SEvalZero		continue
54*10465441SEvalZero		;;
55*10465441SEvalZero	"-h")
56*10465441SEvalZero		usage
57*10465441SEvalZero		exit
58*10465441SEvalZero		;;
59*10465441SEvalZero	"-r")
60*10465441SEvalZero		WARNREDUN=true
61*10465441SEvalZero		shift
62*10465441SEvalZero		continue
63*10465441SEvalZero		;;
64*10465441SEvalZero	"-O")
65*10465441SEvalZero		if [ -d $2 ];then
66*10465441SEvalZero			OUTPUT=$(echo $2 | sed 's/\/*$//')
67*10465441SEvalZero		else
68*10465441SEvalZero			echo "output directory $2 does not exist" 1>&2
69*10465441SEvalZero			exit 1
70*10465441SEvalZero		fi
71*10465441SEvalZero		shift 2
72*10465441SEvalZero		continue
73*10465441SEvalZero		;;
74*10465441SEvalZero	*)
75*10465441SEvalZero		break
76*10465441SEvalZero		;;
77*10465441SEvalZero	esac
78*10465441SEvalZerodone
79*10465441SEvalZero
80*10465441SEvalZeroif [ "$#" -lt 1 ] ; then
81*10465441SEvalZero	usage
82*10465441SEvalZero	exit
83*10465441SEvalZerofi
84*10465441SEvalZero
85*10465441SEvalZeroif [ -z "$KCONFIG_CONFIG" ]; then
86*10465441SEvalZero	if [ "$OUTPUT" != . ]; then
87*10465441SEvalZero		KCONFIG_CONFIG=$(readlink -m -- "$OUTPUT/.config")
88*10465441SEvalZero	else
89*10465441SEvalZero		KCONFIG_CONFIG=.config
90*10465441SEvalZero	fi
91*10465441SEvalZerofi
92*10465441SEvalZero
93*10465441SEvalZeroINITFILE=$1
94*10465441SEvalZeroshift;
95*10465441SEvalZero
96*10465441SEvalZeroif [ ! -r "$INITFILE" ]; then
97*10465441SEvalZero	echo "The base file '$INITFILE' does not exist.  Exit." >&2
98*10465441SEvalZero	exit 1
99*10465441SEvalZerofi
100*10465441SEvalZero
101*10465441SEvalZeroMERGE_LIST=$*
102*10465441SEvalZeroSED_CONFIG_EXP="s/^\(# \)\{0,1\}\(CONFIG_[a-zA-Z0-9_]*\)[= ].*/\2/p"
103*10465441SEvalZeroTMP_FILE=$(mktemp ./.tmp.config.XXXXXXXXXX)
104*10465441SEvalZero
105*10465441SEvalZeroecho "Using $INITFILE as base"
106*10465441SEvalZerocat $INITFILE > $TMP_FILE
107*10465441SEvalZero
108*10465441SEvalZero# Merge files, printing warnings on overridden values
109*10465441SEvalZerofor MERGE_FILE in $MERGE_LIST ; do
110*10465441SEvalZero	echo "Merging $MERGE_FILE"
111*10465441SEvalZero	if [ ! -r "$MERGE_FILE" ]; then
112*10465441SEvalZero		echo "The merge file '$MERGE_FILE' does not exist.  Exit." >&2
113*10465441SEvalZero		exit 1
114*10465441SEvalZero	fi
115*10465441SEvalZero	CFG_LIST=$(sed -n "$SED_CONFIG_EXP" $MERGE_FILE)
116*10465441SEvalZero
117*10465441SEvalZero	for CFG in $CFG_LIST ; do
118*10465441SEvalZero		grep -q -w $CFG $TMP_FILE || continue
119*10465441SEvalZero		PREV_VAL=$(grep -w $CFG $TMP_FILE)
120*10465441SEvalZero		NEW_VAL=$(grep -w $CFG $MERGE_FILE)
121*10465441SEvalZero		if [ "x$PREV_VAL" != "x$NEW_VAL" ] ; then
122*10465441SEvalZero			echo Value of $CFG is redefined by fragment $MERGE_FILE:
123*10465441SEvalZero			echo Previous  value: $PREV_VAL
124*10465441SEvalZero			echo New value:       $NEW_VAL
125*10465441SEvalZero			echo
126*10465441SEvalZero		elif [ "$WARNREDUN" = "true" ]; then
127*10465441SEvalZero			echo Value of $CFG is redundant by fragment $MERGE_FILE:
128*10465441SEvalZero		fi
129*10465441SEvalZero		sed -i "/$CFG[ =]/d" $TMP_FILE
130*10465441SEvalZero	done
131*10465441SEvalZero	cat $MERGE_FILE >> $TMP_FILE
132*10465441SEvalZerodone
133*10465441SEvalZero
134*10465441SEvalZeroif [ "$RUNMAKE" = "false" ]; then
135*10465441SEvalZero	cp -T -- "$TMP_FILE" "$KCONFIG_CONFIG"
136*10465441SEvalZero	echo "#"
137*10465441SEvalZero	echo "# merged configuration written to $KCONFIG_CONFIG (needs make)"
138*10465441SEvalZero	echo "#"
139*10465441SEvalZero	clean_up
140*10465441SEvalZero	exit
141*10465441SEvalZerofi
142*10465441SEvalZero
143*10465441SEvalZero# If we have an output dir, setup the O= argument, otherwise leave
144*10465441SEvalZero# it blank, since O=. will create an unnecessary ./source softlink
145*10465441SEvalZeroOUTPUT_ARG=""
146*10465441SEvalZeroif [ "$OUTPUT" != "." ] ; then
147*10465441SEvalZero	OUTPUT_ARG="O=$OUTPUT"
148*10465441SEvalZerofi
149*10465441SEvalZero
150*10465441SEvalZero
151*10465441SEvalZero# Use the merged file as the starting point for:
152*10465441SEvalZero# alldefconfig: Fills in any missing symbols with Kconfig default
153*10465441SEvalZero# allnoconfig: Fills in any missing symbols with # CONFIG_* is not set
154*10465441SEvalZeromake KCONFIG_ALLCONFIG=$TMP_FILE $OUTPUT_ARG $ALLTARGET
155*10465441SEvalZero
156*10465441SEvalZero
157*10465441SEvalZero# Check all specified config values took (might have missed-dependency issues)
158*10465441SEvalZerofor CFG in $(sed -n "$SED_CONFIG_EXP" $TMP_FILE); do
159*10465441SEvalZero
160*10465441SEvalZero	REQUESTED_VAL=$(grep -w -e "$CFG" $TMP_FILE)
161*10465441SEvalZero	ACTUAL_VAL=$(grep -w -e "$CFG" "$KCONFIG_CONFIG")
162*10465441SEvalZero	if [ "x$REQUESTED_VAL" != "x$ACTUAL_VAL" ] ; then
163*10465441SEvalZero		echo "Value requested for $CFG not in final .config"
164*10465441SEvalZero		echo "Requested value:  $REQUESTED_VAL"
165*10465441SEvalZero		echo "Actual value:     $ACTUAL_VAL"
166*10465441SEvalZero		echo ""
167*10465441SEvalZero	fi
168*10465441SEvalZerodone
169*10465441SEvalZero
170*10465441SEvalZeroclean_up
171