linux/scripts/kconfig/merge_config.sh
<<
>>
Prefs
   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
  23clean_up() {
  24        rm -f $TMP_FILE
  25        exit
  26}
  27trap clean_up HUP INT TERM
  28
  29usage() {
  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"
  34        echo "  -r    list redundant entries when merging fragments"
  35        echo "  -O    dir to put generated output files"
  36}
  37
  38MAKE=true
  39ALLTARGET=alldefconfig
  40WARNREDUN=false
  41OUTPUT=.
  42
  43while true; do
  44        case $1 in
  45        "-n")
  46                ALLTARGET=allnoconfig
  47                shift
  48                continue
  49                ;;
  50        "-m")
  51                MAKE=false
  52                shift
  53                continue
  54                ;;
  55        "-h")
  56                usage
  57                exit
  58                ;;
  59        "-r")
  60                WARNREDUN=true
  61                shift
  62                continue
  63                ;;
  64        "-O")
  65                if [ -d $2 ];then
  66                        OUTPUT=$(echo $2 | sed 's/\/*$//')
  67                else
  68                        echo "output directory $2 does not exist" 1>&2
  69                        exit 1
  70                fi
  71                shift 2
  72                continue
  73                ;;
  74        *)
  75                break
  76                ;;
  77        esac
  78done
  79
  80INITFILE=$1
  81shift;
  82
  83MERGE_LIST=$*
  84SED_CONFIG_EXP="s/^\(# \)\{0,1\}\(CONFIG_[a-zA-Z0-9_]*\)[= ].*/\2/p"
  85TMP_FILE=$(mktemp ./.tmp.config.XXXXXXXXXX)
  86
  87echo "Using $INITFILE as base"
  88cat $INITFILE > $TMP_FILE
  89
  90# Merge files, printing warnings on overrided values
  91for MERGE_FILE in $MERGE_LIST ; do
  92        echo "Merging $MERGE_FILE"
  93        CFG_LIST=$(sed -n "$SED_CONFIG_EXP" $MERGE_FILE)
  94
  95        for CFG in $CFG_LIST ; do
  96                grep -q -w $CFG $TMP_FILE
  97                if [ $? -eq 0 ] ; then
  98                        PREV_VAL=$(grep -w $CFG $TMP_FILE)
  99                        NEW_VAL=$(grep -w $CFG $MERGE_FILE)
 100                        if [ "x$PREV_VAL" != "x$NEW_VAL" ] ; then
 101                        echo Value of $CFG is redefined by fragment $MERGE_FILE:
 102                        echo Previous  value: $PREV_VAL
 103                        echo New value:       $NEW_VAL
 104                        echo
 105                        elif [ "$WARNREDUN" = "true" ]; then
 106                        echo Value of $CFG is redundant by fragment $MERGE_FILE:
 107                        fi
 108                        sed -i "/$CFG[ =]/d" $TMP_FILE
 109                fi
 110        done
 111        cat $MERGE_FILE >> $TMP_FILE
 112done
 113
 114if [ "$MAKE" = "false" ]; then
 115        cp $TMP_FILE $OUTPUT/.config
 116        echo "#"
 117        echo "# merged configuration written to $OUTPUT/.config (needs make)"
 118        echo "#"
 119        clean_up
 120        exit
 121fi
 122
 123# If we have an output dir, setup the O= argument, otherwise leave
 124# it blank, since O=. will create an unnecessary ./source softlink
 125OUTPUT_ARG=""
 126if [ "$OUTPUT" != "." ] ; then
 127        OUTPUT_ARG="O=$OUTPUT"
 128fi
 129
 130
 131# Use the merged file as the starting point for:
 132# alldefconfig: Fills in any missing symbols with Kconfig default
 133# allnoconfig: Fills in any missing symbols with # CONFIG_* is not set
 134make KCONFIG_ALLCONFIG=$TMP_FILE $OUTPUT_ARG $ALLTARGET
 135
 136
 137# Check all specified config values took (might have missed-dependency issues)
 138for CFG in $(sed -n "$SED_CONFIG_EXP" $TMP_FILE); do
 139
 140        REQUESTED_VAL=$(grep -w -e "$CFG" $TMP_FILE)
 141        ACTUAL_VAL=$(grep -w -e "$CFG" $OUTPUT/.config)
 142        if [ "x$REQUESTED_VAL" != "x$ACTUAL_VAL" ] ; then
 143                echo "Value requested for $CFG not in final .config"
 144                echo "Requested value:  $REQUESTED_VAL"
 145                echo "Actual value:     $ACTUAL_VAL"
 146                echo ""
 147        fi
 148done
 149
 150clean_up
 151