]> git.sur5r.net Git - kconfig-frontends/blob - utils/kconfig-merge
974d5cb7e30a5eb8abdd718371341160f9964dbb
[kconfig-frontends] / utils / kconfig-merge
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() {
24         rm -f $TMP_FILE
25         exit
26 }
27 trap clean_up HUP INT TERM
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"
34         echo "  -r    list redundant entries when merging fragments"
35 }
36
37 MAKE=true
38 ALLTARGET=alldefconfig
39 WARNREDUN=false
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                 ;;
57         "-r")
58                 WARNREDUN=true
59                 shift
60                 continue
61                 ;;
62         *)
63                 break
64                 ;;
65         esac
66 done
67
68 INITFILE=$1
69 shift;
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
75 echo "Using $INITFILE as base"
76 cat $INITFILE > $TMP_FILE
77
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
93                         elif [ "$WARNREDUN" = "true" ]; then
94                         echo Value of $CFG is redundant by fragment $MERGE_FILE:
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
120         REQUESTED_VAL=$(grep -w -e "$CFG" $TMP_FILE)
121         ACTUAL_VAL=$(grep -w -e "$CFG" .config)
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