util: Add miniconfig, a script to minimize coreboot configurations

This script produces a "minimal" configuration from a full coreboot
configuration, e.g. a configuration file that only contains the differences
between the default configuration of a board and the input configuration
file.

Usage: util/kconfig/miniconfig config.big config.mini

This will read config.big and produce config.mini. If you omit config.mini,
config.big will be changed in place.

Minimal configurations are easier to read and more robust when reusing
them among different versions of coreboot as they reflect exactly the
changes made to the default configuration instead of a full snapshot
of all configuration options.

Change-Id: Ifbee49e0192c2c557b18bcc1a92fe2a5d5164a3a
Signed-off-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Reviewed-on: http://review.coreboot.org/8974
Tested-by: build bot (Jenkins)
Reviewed-by: Aaron Durbin <adurbin@google.com>
This commit is contained in:
Stefan Reinauer 2015-03-24 21:46:52 +01:00
parent 0e99044aab
commit 172d33594e
1 changed files with 88 additions and 0 deletions

88
util/kconfig/miniconfig Executable file
View File

@ -0,0 +1,88 @@
#!/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