aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/kconfig/merge_config.sh
diff options
context:
space:
mode:
authorjohn stultz <johnstul@us.ibm.com>2012-01-10 18:41:08 -0500
committerMichal Marek <mmarek@suse.cz>2012-01-14 15:44:28 -0500
commit4b5f72145e3ba85e38240dba844ebe1fcbb73713 (patch)
tree30321b441f53ec5e126ee119d668bdeb952c2131 /scripts/kconfig/merge_config.sh
parent70cc01e7579cdb71f42f3f7085ab457be7808783 (diff)
kconfig: add merge_config.sh script
After noticing almost every distro has their own method of managing config fragments, I went looking at some best practices, and wanted to try to consolidate some of the different approaches so this fairly simple infrastructure can be shared (and new distros/build systems don't have to implement yet another config fragment merge script). This script is most influenced by the Windriver tools used in the Yocto Project, reusing some portions found there. This script merges multiple config fragments, warning on any overridden values. It then sets any unspecified values to their default, then finally checks to make sure no specified value was dropped due to unsatisfied dependencies. I'm sure this implementation won't work for everyone, and I expect it will need to evolve to adapt for various use cases. But I think its a reasonable starting point. Cc: Sam Ravnborg <sam@ravnborg.org> Cc: Greg Thelen <gthelen@google.com> Cc: Reinhard Tartler <Reinhard.Tartler@informatik.uni-erlangen.de> Cc: Dmitry Fink <Dmitry.Fink@palm.com> Cc: Darren Hart <dvhart@linux.intel.com> Cc: Eric B Munson <ebmunson@us.ibm.com> Cc: Bruce Ashfield <Bruce.Ashfield@windriver.com> Cc: Michal Marek <mmarek@suse.cz> Signed-off-by: John Stultz <john.stultz@linaro.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Michal Marek <mmarek@suse.cz>
Diffstat (limited to 'scripts/kconfig/merge_config.sh')
-rw-r--r--scripts/kconfig/merge_config.sh117
1 files changed, 117 insertions, 0 deletions
diff --git a/scripts/kconfig/merge_config.sh b/scripts/kconfig/merge_config.sh
new file mode 100644
index 000000000000..890276bd1e67
--- /dev/null
+++ b/scripts/kconfig/merge_config.sh
@@ -0,0 +1,117 @@
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 SIGHUP SIGINT SIGTERM
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}
35
36MAKE=true
37ALLTARGET=alldefconfig
38
39while true; do
40 case $1 in
41 "-n")
42 ALLTARGET=allnoconfig
43 shift
44 continue
45 ;;
46 "-m")
47 MAKE=false
48 shift
49 continue
50 ;;
51 "-h")
52 usage
53 exit
54 ;;
55 *)
56 break
57 ;;
58 esac
59done
60
61
62
63MERGE_LIST=$*
64SED_CONFIG_EXP="s/^\(# \)\{0,1\}\(CONFIG_[a-zA-Z0-9_]*\)[= ].*/\2/p"
65TMP_FILE=$(mktemp ./.tmp.config.XXXXXXXXXX)
66
67# Merge files, printing warnings on overrided values
68for MERGE_FILE in $MERGE_LIST ; do
69 echo "Merging $MERGE_FILE"
70 CFG_LIST=$(sed -n "$SED_CONFIG_EXP" $MERGE_FILE)
71
72 for CFG in $CFG_LIST ; do
73 grep -q -w $CFG $TMP_FILE
74 if [ $? -eq 0 ] ; then
75 PREV_VAL=$(grep -w $CFG $TMP_FILE)
76 NEW_VAL=$(grep -w $CFG $MERGE_FILE)
77 if [ "x$PREV_VAL" != "x$NEW_VAL" ] ; then
78 echo Value of $CFG is redefined by fragment $MERGE_FILE:
79 echo Previous value: $PREV_VAL
80 echo New value: $NEW_VAL
81 echo
82 fi
83 sed -i "/$CFG[ =]/d" $TMP_FILE
84 fi
85 done
86 cat $MERGE_FILE >> $TMP_FILE
87done
88
89if [ "$MAKE" = "false" ]; then
90 cp $TMP_FILE .config
91 echo "#"
92 echo "# merged configuration written to .config (needs make)"
93 echo "#"
94 clean_up
95 exit
96fi
97
98# Use the merged file as the starting point for:
99# alldefconfig: Fills in any missing symbols with Kconfig default
100# allnoconfig: Fills in any missing symbols with # CONFIG_* is not set
101make KCONFIG_ALLCONFIG=$TMP_FILE $ALLTARGET
102
103
104# Check all specified config values took (might have missed-dependency issues)
105for CFG in $(sed -n "$SED_CONFIG_EXP" $TMP_FILE); do
106
107 REQUESTED_VAL=$(sed -n "$SED_CONFIG_EXP" $TMP_FILE | grep -w -e "$CFG")
108 ACTUAL_VAL=$(sed -n "$SED_CONFIG_EXP" .config | grep -w -e "$CFG")
109 if [ "x$REQUESTED_VAL" != "x$ACTUAL_VAL" ] ; then
110 echo "Value requested for $CFG not in final .config"
111 echo "Requested value: $REQUESTED_VAL"
112 echo "Actual value: $ACTUAL_VAL"
113 echo ""
114 fi
115done
116
117clean_up