#!/bin/sh # merge_config.sh - Takes a list of config fragment values, and merges # them one by one. Provides warnings on overridden values, and specified # values that did not make it to the resulting .config file (due to missed # dependencies or config symbol removal). # # Portions reused from kconf_check and generate_cfg: # http://git.yoctoproject.org/cgit/cgit.cgi/yocto-kernel-tools/tree/tools/kconf_check # http://git.yoctoproject.org/cgit/cgit.cgi/yocto-kernel-tools/tree/tools/generate_cfg # # Copyright (c) 2009-2010 Wind River Systems, Inc. # Copyright 2011 Linaro # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the GNU General Public License for more details. proc clean_up { rm -f $TMP_FILE exit } trap clean_up HUP INT TERM proc usage { echo "Usage: $0 [OPTIONS] [CONFIG [...]]" echo " -h display this help text" echo " -m only merge the fragments, do not execute the make command" echo " -n use allnoconfig instead of alldefconfig" echo " -r list redundant entries when merging fragments" echo " -O dir to put generated output files. Consider setting \$KCONFIG_CONFIG instead." } setglobal RUNMAKE = 'true' setglobal ALLTARGET = 'alldefconfig' setglobal WARNREDUN = 'false' setglobal OUTPUT = '.' while true { match $1 { with "-n" setglobal ALLTARGET = 'allnoconfig' shift continue with "-m" setglobal RUNMAKE = 'false' shift continue with "-h" usage exit with "-r" setglobal WARNREDUN = 'true' shift continue with "-O" if test -d $2{ setglobal OUTPUT = $[echo $2 | sed 's/\/*$//] } else { echo "output directory $2 does not exist" !1 > !2 exit 1 } shift 2 continue with * break } } if test "$Argc" -lt 1 { usage exit } if test -z $KCONFIG_CONFIG { if test $OUTPUT != . { setglobal KCONFIG_CONFIG = $[readlink -m -- "$OUTPUT/.config] } else { setglobal KCONFIG_CONFIG = '.config' } } setglobal INITFILE = $1 shift; if test ! -r $INITFILE { echo "The base file '$INITFILE' does not exist. Exit." > !2 exit 1 } setglobal MERGE_LIST = $ifsjoin(Argv) setglobal SED_CONFIG_EXP = '"s/^\(# \)\{0,1\}\(CONFIG_[a-zA-Z0-9_]*\)[= ].*/\2/p'" setglobal TMP_FILE = $[mktemp ./.tmp.config.XXXXXXXXXX] echo "Using $INITFILE as base" cat $INITFILE > $TMP_FILE # Merge files, printing warnings on overridden values for MERGE_FILE in [$MERGE_LIST] { echo "Merging $MERGE_FILE" if test ! -r $MERGE_FILE { echo "The merge file '$MERGE_FILE' does not exist. Exit." > !2 exit 1 } setglobal CFG_LIST = $[sed -n $SED_CONFIG_EXP $MERGE_FILE] for CFG in [$CFG_LIST] { grep -q -w $CFG $TMP_FILE || continue setglobal PREV_VAL = $[grep -w $CFG $TMP_FILE] setglobal NEW_VAL = $[grep -w $CFG $MERGE_FILE] if test "x$PREV_VAL" != "x$NEW_VAL" { echo Value of $CFG is redefined by fragment $MERGE_FILE: echo Previous value: $PREV_VAL echo New value: $NEW_VAL echo } elif test $WARNREDUN = "true" { echo Value of $CFG is redundant by fragment $MERGE_FILE: } sed -i "/$CFG[ =]/d" $TMP_FILE } cat $MERGE_FILE >> $TMP_FILE } if test $RUNMAKE = "false" { cp -T -- $TMP_FILE $KCONFIG_CONFIG echo "#" echo "# merged configuration written to $KCONFIG_CONFIG (needs make)" echo "#" clean_up exit } # If we have an output dir, setup the O= argument, otherwise leave # it blank, since O=. will create an unnecessary ./source softlink setglobal OUTPUT_ARG = ''"" if test $OUTPUT != "." { setglobal OUTPUT_ARG = ""O=$OUTPUT"" } # Use the merged file as the starting point for: # alldefconfig: Fills in any missing symbols with Kconfig default # allnoconfig: Fills in any missing symbols with # CONFIG_* is not set make KCONFIG_ALLCONFIG=$TMP_FILE $OUTPUT_ARG $ALLTARGET # Check all specified config values took (might have missed-dependency issues) for CFG in [$[sed -n $SED_CONFIG_EXP $TMP_FILE]] { setglobal REQUESTED_VAL = $[grep -w -e $CFG $TMP_FILE] setglobal ACTUAL_VAL = $[grep -w -e $CFG $KCONFIG_CONFIG] if test "x$REQUESTED_VAL" != "x$ACTUAL_VAL" { echo "Value requested for $CFG not in final .config" echo "Requested value: $REQUESTED_VAL" echo "Actual value: $ACTUAL_VAL" echo "" } } clean_up