| #!/bin/bash |
| # |
| # miniconfig - utility to minimize your coreboot config files |
| # |
| # Copyright 2015 Google Inc. |
| # |
| # This program is free software; you can redistribute it and/or modify |
| # it under the terms of the GNU General Public License as published by |
| # the Free Software Foundation; version 2 of the License. |
| # |
| # This program is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| |
| CONFIG=$1 |
| NEWCONFIG=$2 |
| |
| CONF=build/util/kconfig/conf |
| KCONFIG=src/Kconfig |
| DOTCONFIG=.config |
| PREVCONFIG=.config.prev |
| TMPCONFIG=.config.mini |
| |
| recreate_config() |
| { |
| $CONF --olddefconfig $KCONFIG &> /dev/null |
| } |
| |
| if [ "$CONFIG" == "" ]; then |
| printf "usage: util/miniconfig/miniconfig [path to config file] <path to new config file>\n" |
| exit 0 |
| fi |
| |
| if [ ! -r "$CONFIG" ]; then |
| printf "Can't read $CONFIG.\n" |
| exit 1 |
| fi |
| |
| if [ "$CONFIG" == .config ]; then |
| printf "Can't use .config, it's overwritten. Make a backup.\n" |
| exit 1 |
| fi |
| |
| if [ ! -x "$CONF" ]; then |
| printf "conf utility at $CONF not available.\n" |
| exit 1 |
| fi |
| |
| # Start out by creating a default config file for a mainboard |
| VENDOR=$( grep ^CONFIG_VENDOR "$CONFIG" ) |
| BOARD=$( grep ^CONFIG_BOARD "$CONFIG" | grep -v ROMSIZE | grep -v SPECIFIC_OPTIONS ) |
| |
| printf "$VENDOR\n$BOARD\n" > "$TMPCONFIG" |
| cp "$TMPCONFIG" "$DOTCONFIG" |
| recreate_config |
| |
| LINES=$( cat "$CONFIG" | wc -l ) |
| CUR=1 |
| |
| # Now go through each line of the existing, large config file, add it to our |
| # new minimal config file, and see if it makes a difference when running "make |
| # olddefconfig". If it does, keep the line, otherwise discard it. |
| |
| cat "$CONFIG" | while read L; do |
| printf "\rProcessing $CONFIG - $CUR / $LINES (%d%%)" $(( $CUR * 100 / $LINES)) |
| mv "$DOTCONFIG" "$PREVCONFIG" |
| cp "$TMPCONFIG" "$DOTCONFIG" |
| echo "$L" >> "$DOTCONFIG" |
| recreate_config |
| |
| if ! diff -q "$DOTCONFIG" "$PREVCONFIG" > /dev/null; then |
| echo "$L" >> "$TMPCONFIG" |
| fi |
| CUR=$(( $CUR + 1 )) |
| done |
| |
| echo |
| |
| if [ "$NEWCONFIG" != "" ]; then |
| printf "Writing new, minimized config to $NEWCONFIG\n" |
| mv "$TMPCONFIG" "$NEWCONFIG" |
| else |
| printf "Overwriting $CONFIG with new, minimized config.\n" |
| mv "$TMPCONFIG" "$CONFIG" |
| fi |