Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 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 | |
Masahiro Yamada | 8caaec6 | 2014-09-04 22:16:15 +0900 | [diff] [blame] | 121 | if [ ! -r $defconfig_path ]; then |
| 122 | echo >&2 "***" |
| 123 | echo >&2 "*** Can't find default configuration \"confis/$1\"!" |
| 124 | echo >&2 "***" |
| 125 | exit 1 |
| 126 | fi |
| 127 | |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 128 | mkdir -p arch configs |
| 129 | # defconfig for Normal: |
| 130 | # pick lines without prefixes and lines starting '+' prefix |
| 131 | # and rip the prefixes off. |
| 132 | sed -n -e '/^[+A-Z]*:/!p' -e 's/^+[A-Z]*://p' $defconfig_path \ |
| 133 | > configs/.tmp_defconfig |
| 134 | |
| 135 | run_make_config .tmp_defconfig || { |
| 136 | cleanup_after_defconfig |
| 137 | exit 1 |
| 138 | } |
| 139 | |
| 140 | for img in $(get_enabled_subimages) |
| 141 | do |
| 142 | symbol=$(echo $img | cut -c 1 | tr '[a-z]' '[A-Z]') |
| 143 | # defconfig for SPL, TPL: |
| 144 | # pick lines with 'S', 'T' prefix and rip the prefixes off |
| 145 | sed -n -e 's/^[+A-Z]*'$symbol'[A-Z]*://p' $defconfig_path \ |
| 146 | > configs/.tmp_defconfig |
| 147 | run_make_config .tmp_defconfig $img || { |
| 148 | cleanup_after_defconfig |
| 149 | exit 1 |
| 150 | } |
| 151 | done |
| 152 | |
| 153 | cleanup_after_defconfig |
| 154 | } |
| 155 | |
| 156 | do_defconfig () { |
| 157 | if [ "$KBUILD_DEFCONFIG" ]; then |
| 158 | do_board_defconfig $KBUILD_DEFCONFIG |
| 159 | echo "*** Default configuration is based on '$KBUILD_DEFCONFIG'" |
| 160 | else |
| 161 | run_make_config defconfig |
| 162 | fi |
| 163 | } |
| 164 | |
| 165 | do_savedefconfig () { |
| 166 | if [ -r "$KCONFIG_CONFIG" ]; then |
| 167 | subimages=$(get_enabled_subimages) |
| 168 | else |
| 169 | subimages= |
| 170 | fi |
| 171 | |
| 172 | run_make_config savedefconfig |
| 173 | |
| 174 | output_lines= |
| 175 | |
| 176 | # -r option is necessay because some string-type configs may include |
| 177 | # backslashes as an escape character |
| 178 | while read -r line |
| 179 | do |
Masahiro Yamada | 8dffe66 | 2014-09-04 05:41:32 +0900 | [diff] [blame] | 180 | output_lines="$output_lines%$line" |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 181 | done < defconfig |
| 182 | |
| 183 | for img in $subimages |
| 184 | do |
| 185 | run_make_config savedefconfig $img |
| 186 | |
| 187 | symbol=$(echo $img | cut -c 1 | tr '[a-z]' '[A-Z]') |
| 188 | unmatched= |
| 189 | |
| 190 | while read -r line |
| 191 | do |
| 192 | tmp= |
| 193 | match= |
| 194 | |
Masahiro Yamada | 8dffe66 | 2014-09-04 05:41:32 +0900 | [diff] [blame] | 195 | # "# CONFIG_FOO is not set" should not be divided. |
| 196 | # Use "%" as a separator, instead of a whitespace. |
| 197 | # "%" is unlikely to appear in defconfig context. |
| 198 | save_IFS=$IFS |
| 199 | IFS=% |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 200 | # coalesce common lines together |
| 201 | for i in $output_lines |
| 202 | do |
| 203 | case "$i" in |
Masahiro Yamada | dee745b | 2014-09-04 05:41:33 +0900 | [diff] [blame] | 204 | [+A-Z]*:$line) |
Masahiro Yamada | 8dffe66 | 2014-09-04 05:41:32 +0900 | [diff] [blame] | 205 | tmp="$tmp%$unmatched" |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 206 | i=$(echo "$i" | \ |
Masahiro Yamada | dee745b | 2014-09-04 05:41:33 +0900 | [diff] [blame] | 207 | sed -e "s/^\([^:]*\)/\1$symbol/") |
Masahiro Yamada | 8dffe66 | 2014-09-04 05:41:32 +0900 | [diff] [blame] | 208 | tmp="$tmp%$i" |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 209 | match=1 |
| 210 | ;; |
Masahiro Yamada | dee745b | 2014-09-04 05:41:33 +0900 | [diff] [blame] | 211 | $line) |
Masahiro Yamada | 8dffe66 | 2014-09-04 05:41:32 +0900 | [diff] [blame] | 212 | tmp="$tmp%$unmatched" |
| 213 | tmp="$tmp%+$symbol:$i" |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 214 | match=1 |
| 215 | ;; |
| 216 | *) |
Masahiro Yamada | 8dffe66 | 2014-09-04 05:41:32 +0900 | [diff] [blame] | 217 | tmp="$tmp%$i" |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 218 | ;; |
| 219 | esac |
| 220 | done |
| 221 | |
Masahiro Yamada | 8dffe66 | 2014-09-04 05:41:32 +0900 | [diff] [blame] | 222 | # Restore the default separator for the outer for loop. |
| 223 | IFS=$save_IFS |
| 224 | |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 225 | if [ "$match" ]; then |
| 226 | output_lines="$tmp" |
| 227 | unmatched= |
| 228 | else |
Masahiro Yamada | 8dffe66 | 2014-09-04 05:41:32 +0900 | [diff] [blame] | 229 | unmatched="$unmatched%$symbol:$line" |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 230 | fi |
| 231 | done < defconfig |
| 232 | done |
| 233 | |
| 234 | rm -f defconfig |
Masahiro Yamada | 93481b9 | 2014-09-04 05:41:31 +0900 | [diff] [blame] | 235 | touch defconfig |
Masahiro Yamada | 8dffe66 | 2014-09-04 05:41:32 +0900 | [diff] [blame] | 236 | |
| 237 | save_IFS=$IFS |
| 238 | IFS=% |
| 239 | |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 240 | for line in $output_lines |
| 241 | do |
Masahiro Yamada | 8dffe66 | 2014-09-04 05:41:32 +0900 | [diff] [blame] | 242 | case "$line" in |
| 243 | "") |
| 244 | # do not output blank lines |
| 245 | ;; |
| 246 | *) |
| 247 | echo $line >> defconfig |
| 248 | ;; |
| 249 | esac |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 250 | done |
Masahiro Yamada | 8dffe66 | 2014-09-04 05:41:32 +0900 | [diff] [blame] | 251 | |
| 252 | IFS=$save_IFS |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 253 | } |
| 254 | |
Masahiro Yamada | 11b5db6 | 2014-09-10 18:13:10 +0900 | [diff] [blame] | 255 | # Some sanity checks before running "make <objdir>/<target>", |
| 256 | # where <objdir> should be either "spl" or "tpl". |
| 257 | # Doing "make spl/menuconfig" etc. on a non-SPL board makes no sense. |
| 258 | # It should be allowed only when ".config" exists and "CONFIG_SPL" is enabled. |
| 259 | # |
| 260 | # Usage: |
| 261 | # check_enabled_sumbimage <objdir>/<target> <objdir> |
| 262 | check_enabled_subimage () { |
| 263 | |
| 264 | case $2 in |
| 265 | spl|tpl) ;; |
| 266 | *) |
| 267 | echo >&2 "***" |
| 268 | echo >&2 "*** \"make $1\" is not supported." |
| 269 | echo >&2 "***" |
| 270 | exit 1 |
| 271 | ;; |
| 272 | esac |
| 273 | test -r "$KCONFIG_CONFIG" && get_enabled_subimages | grep -q $2 || { |
| 274 | config=CONFIG_$(echo $2 | tr '[a-z]' '[A-Z]') |
| 275 | |
| 276 | echo >&2 "***" |
| 277 | echo >&2 "*** Create \"$KCONFIG_CONFIG\" with \"$config\" enabled" |
| 278 | echo >&2 "*** before \"make $1\"." |
| 279 | echo >&2 "***" |
| 280 | exit 1 |
| 281 | } |
| 282 | } |
| 283 | |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 284 | # Usage: |
| 285 | # do_others <objdir>/<target> |
| 286 | # The field "<objdir>/" is typically empy, "spl/", "tpl/" for Normal, SPL, TPL, |
| 287 | # respectively. |
| 288 | # The field "<target>" is a configuration target such as "config", |
| 289 | # "menuconfig", etc. |
| 290 | do_others () { |
| 291 | target=${1##*/} |
| 292 | |
| 293 | if [ "$target" = "$1" ]; then |
| 294 | objdir= |
| 295 | else |
| 296 | objdir=${1%/*} |
Masahiro Yamada | 11b5db6 | 2014-09-10 18:13:10 +0900 | [diff] [blame] | 297 | check_enabled_subimage $1 $objdir |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 298 | fi |
| 299 | |
| 300 | run_make_config $target $objdir |
| 301 | } |
| 302 | |
| 303 | progname=$(basename $0) |
| 304 | target=$1 |
| 305 | |
| 306 | case $target in |
| 307 | *_defconfig) |
| 308 | do_board_defconfig $target;; |
| 309 | *_config) |
Masahiro Yamada | d1b60d3 | 2014-08-28 10:56:55 +0900 | [diff] [blame] | 310 | # backward compatibility |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 311 | do_board_defconfig ${target%_config}_defconfig;; |
| 312 | silentoldconfig) |
| 313 | do_silentoldconfig;; |
| 314 | defconfig) |
| 315 | do_defconfig;; |
| 316 | savedefconfig) |
| 317 | do_savedefconfig;; |
| 318 | *) |
| 319 | do_others $target;; |
| 320 | esac |