xref: /openbmc/u-boot/scripts/kconfig/merge_config.sh (revision bf7ab1e70fd7621fea5dea07b6975c576119b86e)
10a9064fbSMasahiro Yamada#!/bin/sh
20a9064fbSMasahiro Yamada#  merge_config.sh - Takes a list of config fragment values, and merges
30a9064fbSMasahiro Yamada#  them one by one. Provides warnings on overridden values, and specified
40a9064fbSMasahiro Yamada#  values that did not make it to the resulting .config file (due to missed
50a9064fbSMasahiro Yamada#  dependencies or config symbol removal).
60a9064fbSMasahiro Yamada#
70a9064fbSMasahiro Yamada#  Portions reused from kconf_check and generate_cfg:
80a9064fbSMasahiro Yamada#  http://git.yoctoproject.org/cgit/cgit.cgi/yocto-kernel-tools/tree/tools/kconf_check
90a9064fbSMasahiro Yamada#  http://git.yoctoproject.org/cgit/cgit.cgi/yocto-kernel-tools/tree/tools/generate_cfg
100a9064fbSMasahiro Yamada#
110a9064fbSMasahiro Yamada#  Copyright (c) 2009-2010 Wind River Systems, Inc.
120a9064fbSMasahiro Yamada#  Copyright 2011 Linaro
130a9064fbSMasahiro Yamada#
140a9064fbSMasahiro Yamada#  This program is free software; you can redistribute it and/or modify
150a9064fbSMasahiro Yamada#  it under the terms of the GNU General Public License version 2 as
160a9064fbSMasahiro Yamada#  published by the Free Software Foundation.
170a9064fbSMasahiro Yamada#
180a9064fbSMasahiro Yamada#  This program is distributed in the hope that it will be useful,
190a9064fbSMasahiro Yamada#  but WITHOUT ANY WARRANTY; without even the implied warranty of
200a9064fbSMasahiro Yamada#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
210a9064fbSMasahiro Yamada#  See the GNU General Public License for more details.
220a9064fbSMasahiro Yamada
230a9064fbSMasahiro Yamadaclean_up() {
240a9064fbSMasahiro Yamada	rm -f $TMP_FILE
250a9064fbSMasahiro Yamada	exit
260a9064fbSMasahiro Yamada}
270a9064fbSMasahiro Yamadatrap clean_up HUP INT TERM
280a9064fbSMasahiro Yamada
290a9064fbSMasahiro Yamadausage() {
300a9064fbSMasahiro Yamada	echo "Usage: $0 [OPTIONS] [CONFIG [...]]"
310a9064fbSMasahiro Yamada	echo "  -h    display this help text"
320a9064fbSMasahiro Yamada	echo "  -m    only merge the fragments, do not execute the make command"
330a9064fbSMasahiro Yamada	echo "  -n    use allnoconfig instead of alldefconfig"
340a9064fbSMasahiro Yamada	echo "  -r    list redundant entries when merging fragments"
35*bf7ab1e7SMasahiro Yamada	echo "  -O    dir to put generated output files.  Consider setting \$KCONFIG_CONFIG instead."
360a9064fbSMasahiro Yamada}
370a9064fbSMasahiro Yamada
389b5f0b1dSMasahiro YamadaRUNMAKE=true
390a9064fbSMasahiro YamadaALLTARGET=alldefconfig
400a9064fbSMasahiro YamadaWARNREDUN=false
410a9064fbSMasahiro YamadaOUTPUT=.
420a9064fbSMasahiro Yamada
430a9064fbSMasahiro Yamadawhile true; do
440a9064fbSMasahiro Yamada	case $1 in
450a9064fbSMasahiro Yamada	"-n")
460a9064fbSMasahiro Yamada		ALLTARGET=allnoconfig
470a9064fbSMasahiro Yamada		shift
480a9064fbSMasahiro Yamada		continue
490a9064fbSMasahiro Yamada		;;
500a9064fbSMasahiro Yamada	"-m")
519b5f0b1dSMasahiro Yamada		RUNMAKE=false
520a9064fbSMasahiro Yamada		shift
530a9064fbSMasahiro Yamada		continue
540a9064fbSMasahiro Yamada		;;
550a9064fbSMasahiro Yamada	"-h")
560a9064fbSMasahiro Yamada		usage
570a9064fbSMasahiro Yamada		exit
580a9064fbSMasahiro Yamada		;;
590a9064fbSMasahiro Yamada	"-r")
600a9064fbSMasahiro Yamada		WARNREDUN=true
610a9064fbSMasahiro Yamada		shift
620a9064fbSMasahiro Yamada		continue
630a9064fbSMasahiro Yamada		;;
640a9064fbSMasahiro Yamada	"-O")
650a9064fbSMasahiro Yamada		if [ -d $2 ];then
660a9064fbSMasahiro Yamada			OUTPUT=$(echo $2 | sed 's/\/*$//')
670a9064fbSMasahiro Yamada		else
680a9064fbSMasahiro Yamada			echo "output directory $2 does not exist" 1>&2
690a9064fbSMasahiro Yamada			exit 1
700a9064fbSMasahiro Yamada		fi
710a9064fbSMasahiro Yamada		shift 2
720a9064fbSMasahiro Yamada		continue
730a9064fbSMasahiro Yamada		;;
740a9064fbSMasahiro Yamada	*)
750a9064fbSMasahiro Yamada		break
760a9064fbSMasahiro Yamada		;;
770a9064fbSMasahiro Yamada	esac
780a9064fbSMasahiro Yamadadone
790a9064fbSMasahiro Yamada
80*bf7ab1e7SMasahiro Yamadaif [ "$#" -lt 1 ] ; then
819b5f0b1dSMasahiro Yamada	usage
829b5f0b1dSMasahiro Yamada	exit
839b5f0b1dSMasahiro Yamadafi
849b5f0b1dSMasahiro Yamada
85*bf7ab1e7SMasahiro Yamadaif [ -z "$KCONFIG_CONFIG" ]; then
86*bf7ab1e7SMasahiro Yamada	if [ "$OUTPUT" != . ]; then
87*bf7ab1e7SMasahiro Yamada		KCONFIG_CONFIG=$(readlink -m -- "$OUTPUT/.config")
88*bf7ab1e7SMasahiro Yamada	else
89*bf7ab1e7SMasahiro Yamada		KCONFIG_CONFIG=.config
90*bf7ab1e7SMasahiro Yamada	fi
91*bf7ab1e7SMasahiro Yamadafi
92*bf7ab1e7SMasahiro Yamada
930a9064fbSMasahiro YamadaINITFILE=$1
940a9064fbSMasahiro Yamadashift;
950a9064fbSMasahiro Yamada
969b5f0b1dSMasahiro Yamadaif [ ! -r "$INITFILE" ]; then
979b5f0b1dSMasahiro Yamada	echo "The base file '$INITFILE' does not exist.  Exit." >&2
989b5f0b1dSMasahiro Yamada	exit 1
999b5f0b1dSMasahiro Yamadafi
1009b5f0b1dSMasahiro Yamada
1010a9064fbSMasahiro YamadaMERGE_LIST=$*
1020a9064fbSMasahiro YamadaSED_CONFIG_EXP="s/^\(# \)\{0,1\}\(CONFIG_[a-zA-Z0-9_]*\)[= ].*/\2/p"
1030a9064fbSMasahiro YamadaTMP_FILE=$(mktemp ./.tmp.config.XXXXXXXXXX)
1040a9064fbSMasahiro Yamada
1050a9064fbSMasahiro Yamadaecho "Using $INITFILE as base"
1060a9064fbSMasahiro Yamadacat $INITFILE > $TMP_FILE
1070a9064fbSMasahiro Yamada
1085699ea6dSRobert P. J. Day# Merge files, printing warnings on overridden values
1090a9064fbSMasahiro Yamadafor MERGE_FILE in $MERGE_LIST ; do
1100a9064fbSMasahiro Yamada	echo "Merging $MERGE_FILE"
111*bf7ab1e7SMasahiro Yamada	if [ ! -r "$MERGE_FILE" ]; then
112*bf7ab1e7SMasahiro Yamada		echo "The merge file '$MERGE_FILE' does not exist.  Exit." >&2
113*bf7ab1e7SMasahiro Yamada		exit 1
114*bf7ab1e7SMasahiro Yamada	fi
1150a9064fbSMasahiro Yamada	CFG_LIST=$(sed -n "$SED_CONFIG_EXP" $MERGE_FILE)
1160a9064fbSMasahiro Yamada
1170a9064fbSMasahiro Yamada	for CFG in $CFG_LIST ; do
1189b5f0b1dSMasahiro Yamada		grep -q -w $CFG $TMP_FILE || continue
1190a9064fbSMasahiro Yamada		PREV_VAL=$(grep -w $CFG $TMP_FILE)
1200a9064fbSMasahiro Yamada		NEW_VAL=$(grep -w $CFG $MERGE_FILE)
1210a9064fbSMasahiro Yamada		if [ "x$PREV_VAL" != "x$NEW_VAL" ] ; then
1220a9064fbSMasahiro Yamada			echo Value of $CFG is redefined by fragment $MERGE_FILE:
1230a9064fbSMasahiro Yamada			echo Previous  value: $PREV_VAL
1240a9064fbSMasahiro Yamada			echo New value:       $NEW_VAL
1250a9064fbSMasahiro Yamada			echo
1260a9064fbSMasahiro Yamada		elif [ "$WARNREDUN" = "true" ]; then
1270a9064fbSMasahiro Yamada			echo Value of $CFG is redundant by fragment $MERGE_FILE:
1280a9064fbSMasahiro Yamada		fi
1290a9064fbSMasahiro Yamada		sed -i "/$CFG[ =]/d" $TMP_FILE
1300a9064fbSMasahiro Yamada	done
1310a9064fbSMasahiro Yamada	cat $MERGE_FILE >> $TMP_FILE
1320a9064fbSMasahiro Yamadadone
1330a9064fbSMasahiro Yamada
1349b5f0b1dSMasahiro Yamadaif [ "$RUNMAKE" = "false" ]; then
135*bf7ab1e7SMasahiro Yamada	cp -T -- "$TMP_FILE" "$KCONFIG_CONFIG"
1360a9064fbSMasahiro Yamada	echo "#"
137*bf7ab1e7SMasahiro Yamada	echo "# merged configuration written to $KCONFIG_CONFIG (needs make)"
1380a9064fbSMasahiro Yamada	echo "#"
1390a9064fbSMasahiro Yamada	clean_up
1400a9064fbSMasahiro Yamada	exit
1410a9064fbSMasahiro Yamadafi
1420a9064fbSMasahiro Yamada
1430a9064fbSMasahiro Yamada# If we have an output dir, setup the O= argument, otherwise leave
1440a9064fbSMasahiro Yamada# it blank, since O=. will create an unnecessary ./source softlink
1450a9064fbSMasahiro YamadaOUTPUT_ARG=""
1460a9064fbSMasahiro Yamadaif [ "$OUTPUT" != "." ] ; then
1470a9064fbSMasahiro Yamada	OUTPUT_ARG="O=$OUTPUT"
1480a9064fbSMasahiro Yamadafi
1490a9064fbSMasahiro Yamada
1500a9064fbSMasahiro Yamada
1510a9064fbSMasahiro Yamada# Use the merged file as the starting point for:
1520a9064fbSMasahiro Yamada# alldefconfig: Fills in any missing symbols with Kconfig default
1530a9064fbSMasahiro Yamada# allnoconfig: Fills in any missing symbols with # CONFIG_* is not set
1540a9064fbSMasahiro Yamadamake KCONFIG_ALLCONFIG=$TMP_FILE $OUTPUT_ARG $ALLTARGET
1550a9064fbSMasahiro Yamada
1560a9064fbSMasahiro Yamada
1570a9064fbSMasahiro Yamada# Check all specified config values took (might have missed-dependency issues)
1580a9064fbSMasahiro Yamadafor CFG in $(sed -n "$SED_CONFIG_EXP" $TMP_FILE); do
1590a9064fbSMasahiro Yamada
1600a9064fbSMasahiro Yamada	REQUESTED_VAL=$(grep -w -e "$CFG" $TMP_FILE)
161*bf7ab1e7SMasahiro Yamada	ACTUAL_VAL=$(grep -w -e "$CFG" "$KCONFIG_CONFIG")
1620a9064fbSMasahiro Yamada	if [ "x$REQUESTED_VAL" != "x$ACTUAL_VAL" ] ; then
1630a9064fbSMasahiro Yamada		echo "Value requested for $CFG not in final .config"
1640a9064fbSMasahiro Yamada		echo "Requested value:  $REQUESTED_VAL"
1650a9064fbSMasahiro Yamada		echo "Actual value:     $ACTUAL_VAL"
1660a9064fbSMasahiro Yamada		echo ""
1670a9064fbSMasahiro Yamada	fi
1680a9064fbSMasahiro Yamadadone
1690a9064fbSMasahiro Yamada
1700a9064fbSMasahiro Yamadaclean_up
171