| john stultz | 4b5f721 | 2012-01-10 15:41:08 -0800 | [diff] [blame] | 1 | #!/bin/sh | 
 | 2 | #  merge_config.sh - Takes a list of config fragment values, and merges | 
 | 3 | #  them one by one. Provides warnings on overridden values, and specified | 
 | 4 | #  values that did not make it to the resulting .config file (due to missed | 
 | 5 | #  dependencies or config symbol removal). | 
 | 6 | # | 
 | 7 | #  Portions reused from kconf_check and generate_cfg: | 
 | 8 | #  http://git.yoctoproject.org/cgit/cgit.cgi/yocto-kernel-tools/tree/tools/kconf_check | 
 | 9 | #  http://git.yoctoproject.org/cgit/cgit.cgi/yocto-kernel-tools/tree/tools/generate_cfg | 
 | 10 | # | 
 | 11 | #  Copyright (c) 2009-2010 Wind River Systems, Inc. | 
 | 12 | #  Copyright 2011 Linaro | 
 | 13 | # | 
 | 14 | #  This program is free software; you can redistribute it and/or modify | 
 | 15 | #  it under the terms of the GNU General Public License version 2 as | 
 | 16 | #  published by the Free Software Foundation. | 
 | 17 | # | 
 | 18 | #  This program is distributed in the hope that it will be useful, | 
 | 19 | #  but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 | 20 | #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 
 | 21 | #  See the GNU General Public License for more details. | 
 | 22 |  | 
 | 23 | clean_up() { | 
| Darren Hart | c0c0cda | 2012-01-10 15:41:12 -0800 | [diff] [blame] | 24 | 	rm -f $TMP_FILE | 
 | 25 | 	exit | 
| john stultz | 4b5f721 | 2012-01-10 15:41:08 -0800 | [diff] [blame] | 26 | } | 
| Darren Hart | 041b78c | 2012-01-10 15:41:10 -0800 | [diff] [blame] | 27 | trap clean_up HUP INT TERM | 
| john stultz | 4b5f721 | 2012-01-10 15:41:08 -0800 | [diff] [blame] | 28 |  | 
 | 29 | usage() { | 
 | 30 | 	echo "Usage: $0 [OPTIONS] [CONFIG [...]]" | 
 | 31 | 	echo "  -h    display this help text" | 
 | 32 | 	echo "  -m    only merge the fragments, do not execute the make command" | 
 | 33 | 	echo "  -n    use allnoconfig instead of alldefconfig" | 
| John Stultz | 9875c42 | 2012-03-23 12:52:08 -0700 | [diff] [blame] | 34 | 	echo "  -r    list redundant entries when merging fragments" | 
| john stultz | 4b5f721 | 2012-01-10 15:41:08 -0800 | [diff] [blame] | 35 | } | 
 | 36 |  | 
 | 37 | MAKE=true | 
 | 38 | ALLTARGET=alldefconfig | 
| John Stultz | 9875c42 | 2012-03-23 12:52:08 -0700 | [diff] [blame] | 39 | WARNREDUN=false | 
| john stultz | 4b5f721 | 2012-01-10 15:41:08 -0800 | [diff] [blame] | 40 |  | 
 | 41 | while true; do | 
 | 42 | 	case $1 in | 
 | 43 | 	"-n") | 
 | 44 | 		ALLTARGET=allnoconfig | 
 | 45 | 		shift | 
 | 46 | 		continue | 
 | 47 | 		;; | 
 | 48 | 	"-m") | 
 | 49 | 		MAKE=false | 
 | 50 | 		shift | 
 | 51 | 		continue | 
 | 52 | 		;; | 
 | 53 | 	"-h") | 
 | 54 | 		usage | 
 | 55 | 		exit | 
 | 56 | 		;; | 
| John Stultz | 9875c42 | 2012-03-23 12:52:08 -0700 | [diff] [blame] | 57 | 	"-r") | 
 | 58 | 		WARNREDUN=true | 
 | 59 | 		shift | 
 | 60 | 		continue | 
 | 61 | 		;; | 
| john stultz | 4b5f721 | 2012-01-10 15:41:08 -0800 | [diff] [blame] | 62 | 	*) | 
 | 63 | 		break | 
 | 64 | 		;; | 
 | 65 | 	esac | 
 | 66 | done | 
 | 67 |  | 
| Josh Boyer | 0928061 | 2012-02-01 12:01:58 -0500 | [diff] [blame] | 68 | INITFILE=$1 | 
 | 69 | shift; | 
| john stultz | 4b5f721 | 2012-01-10 15:41:08 -0800 | [diff] [blame] | 70 |  | 
 | 71 | MERGE_LIST=$* | 
 | 72 | SED_CONFIG_EXP="s/^\(# \)\{0,1\}\(CONFIG_[a-zA-Z0-9_]*\)[= ].*/\2/p" | 
 | 73 | TMP_FILE=$(mktemp ./.tmp.config.XXXXXXXXXX) | 
 | 74 |  | 
| Josh Boyer | 0928061 | 2012-02-01 12:01:58 -0500 | [diff] [blame] | 75 | echo "Using $INITFILE as base" | 
 | 76 | cat $INITFILE > $TMP_FILE | 
 | 77 |  | 
| john stultz | 4b5f721 | 2012-01-10 15:41:08 -0800 | [diff] [blame] | 78 | # Merge files, printing warnings on overrided values | 
 | 79 | for MERGE_FILE in $MERGE_LIST ; do | 
 | 80 | 	echo "Merging $MERGE_FILE" | 
 | 81 | 	CFG_LIST=$(sed -n "$SED_CONFIG_EXP" $MERGE_FILE) | 
 | 82 |  | 
 | 83 | 	for CFG in $CFG_LIST ; do | 
 | 84 | 		grep -q -w $CFG $TMP_FILE | 
 | 85 | 		if [ $? -eq 0 ] ; then | 
 | 86 | 			PREV_VAL=$(grep -w $CFG $TMP_FILE) | 
 | 87 | 			NEW_VAL=$(grep -w $CFG $MERGE_FILE) | 
 | 88 | 			if [ "x$PREV_VAL" != "x$NEW_VAL" ] ; then | 
 | 89 | 			echo Value of $CFG is redefined by fragment $MERGE_FILE: | 
 | 90 | 			echo Previous  value: $PREV_VAL | 
 | 91 | 			echo New value:       $NEW_VAL | 
 | 92 | 			echo | 
| John Stultz | 9875c42 | 2012-03-23 12:52:08 -0700 | [diff] [blame] | 93 | 			elif [ "$WARNREDUN" = "true" ]; then | 
 | 94 | 			echo Value of $CFG is redundant by fragment $MERGE_FILE: | 
| john stultz | 4b5f721 | 2012-01-10 15:41:08 -0800 | [diff] [blame] | 95 | 			fi | 
 | 96 | 			sed -i "/$CFG[ =]/d" $TMP_FILE | 
 | 97 | 		fi | 
 | 98 | 	done | 
 | 99 | 	cat $MERGE_FILE >> $TMP_FILE | 
 | 100 | done | 
 | 101 |  | 
 | 102 | if [ "$MAKE" = "false" ]; then | 
 | 103 | 	cp $TMP_FILE .config | 
 | 104 | 	echo "#" | 
 | 105 | 	echo "# merged configuration written to .config (needs make)" | 
 | 106 | 	echo "#" | 
 | 107 | 	clean_up | 
 | 108 | 	exit | 
 | 109 | fi | 
 | 110 |  | 
 | 111 | # Use the merged file as the starting point for: | 
 | 112 | # alldefconfig: Fills in any missing symbols with Kconfig default | 
 | 113 | # allnoconfig: Fills in any missing symbols with # CONFIG_* is not set | 
 | 114 | make KCONFIG_ALLCONFIG=$TMP_FILE $ALLTARGET | 
 | 115 |  | 
 | 116 |  | 
 | 117 | # Check all specified config values took (might have missed-dependency issues) | 
 | 118 | for CFG in $(sed -n "$SED_CONFIG_EXP" $TMP_FILE); do | 
 | 119 |  | 
| John Stultz | 320d41b | 2012-01-10 15:41:15 -0800 | [diff] [blame] | 120 | 	REQUESTED_VAL=$(grep -w -e "$CFG" $TMP_FILE) | 
 | 121 | 	ACTUAL_VAL=$(grep -w -e "$CFG" .config) | 
| john stultz | 4b5f721 | 2012-01-10 15:41:08 -0800 | [diff] [blame] | 122 | 	if [ "x$REQUESTED_VAL" != "x$ACTUAL_VAL" ] ; then | 
 | 123 | 		echo "Value requested for $CFG not in final .config" | 
 | 124 | 		echo "Requested value:  $REQUESTED_VAL" | 
 | 125 | 		echo "Actual value:     $ACTUAL_VAL" | 
 | 126 | 		echo "" | 
 | 127 | 	fi | 
 | 128 | done | 
 | 129 |  | 
 | 130 | clean_up |