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 | |
| 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 | do_board_defconfig ${target%_config}_defconfig;; |
| 252 | silentoldconfig) |
| 253 | do_silentoldconfig;; |
| 254 | defconfig) |
| 255 | do_defconfig;; |
| 256 | savedefconfig) |
| 257 | do_savedefconfig;; |
| 258 | *) |
| 259 | do_others $target;; |
| 260 | esac |