Merge branch 'master' of git://git.denx.de/u-boot-ti
[platform/kernel/u-boot.git] / scripts / multiconfig.sh
1 #!/bin/sh
2 #
3 # A wrapper script to adjust Kconfig for U-Boot
4 #
5 # Instead of touching various parts under the scripts/kconfig/ directory,
6 # pushing necessary adjustments into this single script would be better
7 # for code maintainance.  All the make targets related to the configuration
8 # (make %config) should be invoked via this script.
9 # See doc/README.kconfig for further information of Kconfig.
10 #
11 # Copyright (C) 2014, Masahiro Yamada <yamada.m@jp.panasonic.com>
12 #
13 # SPDX-License-Identifier:      GPL-2.0+
14 #
15
16 set -e
17
18 # Set "DEBUG" enavironment variable to show debug messages
19 debug () {
20         if [ $DEBUG ]; then
21                 echo "$@"
22         fi
23 }
24
25 # Useful shorthands
26 build () {
27         debug $progname: $MAKE -f $srctree/scripts/Makefile.build obj="$@"
28         $MAKE -f $srctree/scripts/Makefile.build obj="$@"
29 }
30
31 autoconf () {
32         debug $progname: $MAKE -f $srctree/scripts/Makefile.autoconf obj="$@"
33         $MAKE -f $srctree/scripts/Makefile.autoconf obj="$@"
34 }
35
36 # Make a configuration target
37 # Usage:
38 #   run_make_config <target> <objdir>
39 # <target>: Make target such as "config", "menuconfig", "defconfig", etc.
40 # <objdir>: Target directory where the make command is run.
41 #           Typically "", "spl", "tpl" for Normal, SPL, TPL, respectively.
42 run_make_config () {
43         target=$1
44         objdir=$2
45
46         # Linux expects defconfig files in arch/$(SRCARCH)/configs/ directory,
47         # but U-Boot has them in configs/ directory.
48         # Give SRCARCH=.. to fake scripts/kconfig/Makefile.
49         options="SRCARCH=.. KCONFIG_OBJDIR=$objdir"
50         if [ "$objdir" ]; then
51                 options="$options KCONFIG_CONFIG=$objdir/$KCONFIG_CONFIG"
52                 mkdir -p $objdir
53         fi
54
55         build scripts/kconfig $options $target
56 }
57
58 # Parse .config file to detect if CONFIG_SPL, CONFIG_TPL is enabled
59 # and returns:
60 #   ""        if neither CONFIG_SPL nor CONFIG_TPL is defined
61 #   "spl"     if CONFIG_SPL is defined but CONFIG_TPL is not
62 #   "spl tpl" if both CONFIG_SPL and CONFIG_TPL are defined
63 get_enabled_subimages() {
64         if [ ! -r "$KCONFIG_CONFIG" ]; then
65                 # This should never happen
66                 echo "$progname: $KCONFIG_CONFIG not found" >&2
67                 exit 1
68         fi
69
70         # CONFIG_SPL=y -> spl
71         # CONFIG_TPL=y -> tpl
72         sed -n -e 's/^CONFIG_\(SPL\|TPL\)=y$/\1/p' $KCONFIG_CONFIG | \
73                                                         tr '[A-Z]' '[a-z]'
74 }
75
76 do_silentoldconfig () {
77         run_make_config silentoldconfig
78         subimages=$(get_enabled_subimages)
79
80         for obj in $subimages
81         do
82                 mkdir -p $obj/include/config $obj/include/generated
83                 run_make_config silentoldconfig $obj
84         done
85
86         # If the following part fails, include/config/auto.conf should be
87         # deleted so "make silentoldconfig" will be re-run on the next build.
88         autoconf include include/autoconf.mk include/autoconf.mk.dep || {
89                 rm -f include/config/auto.conf
90                 exit 1
91         }
92
93         # include/config.h has been updated after "make silentoldconfig".
94         # We need to touch include/config/auto.conf so it gets newer
95         # than include/config.h.
96         # Otherwise, 'make silentoldconfig' would be invoked twice.
97         touch include/config/auto.conf
98
99         for obj in $subimages
100         do
101                 autoconf $obj/include $obj/include/autoconf.mk || {
102                         rm -f include/config/auto.conf
103                         exit 1
104                 }
105         done
106 }
107
108 cleanup_after_defconfig () {
109         rm -f configs/.tmp_defconfig
110         # ignore 'Directory not empty' error
111         # without using non-POSIX option '--ignore-fail-on-non-empty'
112         rmdir arch configs 2>/dev/null || true
113 }
114
115 # Usage:
116 #  do_board_defconfig <board>_defconfig
117 do_board_defconfig () {
118         defconfig_path=$srctree/configs/$1
119         tmp_defconfig_path=configs/.tmp_defconfig
120
121         mkdir -p arch configs
122         # defconfig for Normal:
123         #  pick lines without prefixes and lines starting '+' prefix
124         #  and rip the prefixes off.
125         sed -n -e '/^[+A-Z]*:/!p' -e 's/^+[A-Z]*://p' $defconfig_path \
126                                                 > configs/.tmp_defconfig
127
128         run_make_config .tmp_defconfig || {
129                 cleanup_after_defconfig
130                 exit 1
131         }
132
133         for img in $(get_enabled_subimages)
134         do
135                 symbol=$(echo $img | cut -c 1 | tr '[a-z]' '[A-Z]')
136                 # defconfig for SPL, TPL:
137                 #   pick lines with 'S', 'T' prefix and rip the prefixes off
138                 sed -n -e 's/^[+A-Z]*'$symbol'[A-Z]*://p' $defconfig_path \
139                                                 > configs/.tmp_defconfig
140                 run_make_config .tmp_defconfig $img || {
141                         cleanup_after_defconfig
142                         exit 1
143                 }
144         done
145
146         cleanup_after_defconfig
147 }
148
149 do_defconfig () {
150         if [ "$KBUILD_DEFCONFIG" ]; then
151                 do_board_defconfig $KBUILD_DEFCONFIG
152                 echo "*** Default configuration is based on '$KBUILD_DEFCONFIG'"
153         else
154                 run_make_config defconfig
155         fi
156 }
157
158 do_savedefconfig () {
159         if [ -r "$KCONFIG_CONFIG" ]; then
160                 subimages=$(get_enabled_subimages)
161         else
162                 subimages=
163         fi
164
165         run_make_config savedefconfig
166
167         output_lines=
168
169         # -r option is necessay because some string-type configs may include
170         # backslashes as an escape character
171         while read -r line
172         do
173                 output_lines="$output_lines $line"
174         done < defconfig
175
176         for img in $subimages
177         do
178                 run_make_config savedefconfig $img
179
180                 symbol=$(echo $img | cut -c 1 | tr '[a-z]' '[A-Z]')
181                 unmatched=
182
183                 while read -r line
184                 do
185                         tmp=
186                         match=
187
188                         # coalesce common lines together
189                         for i in $output_lines
190                         do
191                                 case "$i" in
192                                 "[+A-Z]*:$line")
193                                         tmp="$tmp $unmatched"
194                                         i=$(echo "$i" | \
195                                             sed -e "s/^\([^:]\)*/\1$symbol/")
196                                         tmp="$tmp $i"
197                                         match=1
198                                         ;;
199                                 "$line")
200                                         tmp="$tmp $unmatched"
201                                         tmp="$tmp +$symbol:$i"
202                                         match=1
203                                         ;;
204                                 *)
205                                         tmp="$tmp $i"
206                                         ;;
207                                 esac
208                         done
209
210                         if [ "$match" ]; then
211                                 output_lines="$tmp"
212                                 unmatched=
213                         else
214                                 unmatched="$unmatched $symbol:$line"
215                         fi
216                 done < defconfig
217         done
218
219         rm -f defconfig
220         for line in $output_lines
221         do
222                 echo $line >> defconfig
223         done
224 }
225
226 # Usage:
227 #   do_others <objdir>/<target>
228 # The field "<objdir>/" is typically empy, "spl/", "tpl/" for Normal, SPL, TPL,
229 # respectively.
230 # The field "<target>" is a configuration target such as "config",
231 # "menuconfig", etc.
232 do_others () {
233         target=${1##*/}
234
235         if [ "$target" = "$1" ]; then
236                 objdir=
237         else
238                 objdir=${1%/*}
239         fi
240
241         run_make_config $target $objdir
242 }
243
244 progname=$(basename $0)
245 target=$1
246
247 case $target in
248 *_defconfig)
249         do_board_defconfig $target;;
250 *_config)
251         # backward compatibility
252         do_board_defconfig ${target%_config}_defconfig;;
253 silentoldconfig)
254         do_silentoldconfig;;
255 defconfig)
256         do_defconfig;;
257 savedefconfig)
258         do_savedefconfig;;
259 *)
260         do_others $target;;
261 esac