root/scripts/Configure

/* [previous][next][first][last][top][bottom][index][help] */
#! /bin/sh
#
# This script is used to configure the linux kernel.
#
# It was inspired by the challenge in the original Configure script
# to ``do something better'', combined with the actual need to ``do
# something better'' because the old configure script wasn't flexible
# enough.
#
# Please send comments / questions / bug fixes to raymondc@microsoft.com.
#
# Each line in the config file is a command.
#
# 050793 - use IFS='@' to get around a bug in a pre-version of bash-1.13
# with an empty IFS.
#
# 030995 (storner@osiris.ping.dk) - added support for tri-state answers,
# for selecting modules to compile.

#
# Make sure we're really running bash.
#
# I would really have preferred to write this script in a language with
# better string handling, but alas, bash is the only scripting language
# that I can be reasonable sure everybody has on their linux machine.
#
[ -z "$BASH" ] && { echo "Configure requires bash" 1>&2; exit 1; }

# Disable filename globbing once and for all.
# Enable function cacheing.
set -f -h

#
# readln reads a line into $ans.
#
#       readln prompt default
#
function readln () {
        if [ "$DEFAULT" = "-d" ]; then
                echo "$1"
                ans=$2
        else
                echo -n "$1"
                IFS='@' read ans </dev/tty || exit 1
                [ -z "$ans" ] && ans=$2
        fi
}

#
# comment does some pretty-printing
#
#       comment 'xxx'
# 
function comment () {
        echo "*"; echo "* $1" ; echo "*"
        (echo "" ; echo "#"; echo "# $1" ; echo "#") >>$CONFIG
        (echo "" ; echo "/*"; echo " * $1" ; echo " */") >>$CONFIG_H
}

#
# define_bool sets the value of a boolean argument
#
#       define_bool define value
#
function define_bool () {
        case "$2" in
         "y" | "Y")
                echo "$1=y" >>$CONFIG
                echo "#define $1 1" >>$CONFIG_H
                ;;

         "m" | "M")
                echo "$1=m" >>$CONFIG
                echo "#undef  $1" >>$CONFIG_H
                ;;

         "n" | "N")
                echo "# $1 is not set" >>$CONFIG
                echo "#undef  $1" >>$CONFIG_H
                ;;
        esac
        eval "$1=$2"
}

#
# bool processes a boolean argument
#
#       bool question define default
#
function bool () {
        ans=""
        def=$(eval echo "\${$2:-$3}")
        case "$def" in
         "y") defprompt="Y/n"
              ;;
         "n") defprompt="N/y"
              ;;
        esac
        while [ "$ans" != "y" -a "$ans" != "n" ]; do
                readln "$1 ($2) [$defprompt] " "$def" 
        done
        define_bool "$2" "$ans"
}

#
# tristate processes a tristate argument
#
#       tristate question define default
#
function tristate () {
        ans=""
        def=$(eval echo "\${$2:-$3}")
        case "$def" in
         "y") defprompt="Y/m/n"
              ;;
         "m") defprompt="M/n/y"
              ;;
         "n") defprompt="N/y/m"
              ;;
        esac
        while [ "$ans" != "y" -a "$ans" != "n" -a "$ans" != "m" ]; do
                readln "$1 ($2) [$defprompt] " "$def"
        done
        define_bool "$2" "$ans"
}

#
# dep_tristate processes a tristate argument
#
#       tristate question define default that depends upon
#       another option.  If the option we depend upon is a module,
#       then the only allowable options are M or N.  If Y, then
#       this is a normal tristate.  This is used in cases where modules
#       are nested, and one module requires the presence of something
#       else in the kernel.
#
function dep_tristate () {
        if [ "$4" != "m" ]; then
                tristate "$1" "$2" "$3"
        else
                ans=""
                def=$(eval echo "\${$2:-$3}")
                case "$def" in
                 "y" | "m") defprompt="M/n"
                      def="m"
                      ;;
                 "n") defprompt="N/m"
                      ;;
                esac
                while [ "$ans" != "n" -a "$ans" != "m" ]; do
                        readln "$1 ($2) [$defprompt] " "$def"
                done
                define_bool "$2" "$ans"
        fi
}

#
# define_int sets the value of a integer argument
#
#       define_int define value
#
function define_int () {
        echo "$1=$2" >>$CONFIG
        echo "#define $1 ($2)" >>$CONFIG_H
        eval "$1=$2"
}

#
# int processes an integer argument
#
#       int question define default
#
function int () {
        # Slimier hack to get bash to rescan a line.
        ans="x"
        def=$(eval echo "\${$2:-$3}")
        while [ $[$ans+0] != "$ans" ]; do
                readln "$1 ($2) [$def] " "$def"
        done
        define_int "$2" "$ans"
}

#
# choice processes a choice list (1-out-of-n)
#
#       choice question choice-list default
#
# The choice list has a syntax of:
#       NAME:VALUE { WHITESPACE '|' NAME:VALUE }
# The user may enter any unique prefix of one of the NAMEs and
# choice will define VALUE as if it were a boolean option.
# VALUE must be in all uppercase.  Normally, VALUE is of the
# form CONFIG_<something>.  Thus, if the user selects <something>,
# the CPP symbol CONFIG_<something> will be defined and the
# shell variable CONFIG_<something> will be set to "y".
#
function choice () {
        question="$1"
        choices="$2"
        def="$3"

        # determine default answer:
        names=""
        set -- $choices
        while [ -n "$2" ]; do
                if [ -n "$names" ]; then
                        names="$names, $1"
                else
                        names="$1"
                fi
                if [ "$(eval echo \"\${$2}\")" = "y" ]; then
                        def=$1
                fi
                shift; shift
        done

        val=""
        while [ -z "$val" ]; do
                readln "$question ($names) [$def] " "$def"
                ans=$(echo $ans | tr a-z A-Z)
                set -- $choices
                val=""
                while [ -n "$1" ]; do
                        name=$(echo $1 | tr a-z A-Z)
                        case "$name" in
                                ${ans}*)
                                        if [ "$name" = "$ans" ]; then
                                                val="$2"
                                                break   # stop on exact match
                                        fi
                                        if [ -n "$val" ]; then
                                                echo \
                "  Sorry, \"$ans\" is ambiguous; please enter a longer string."
                                                val=""
                                                break
                                        else
                                                val="$2"
                                        fi;;
                        esac
                        shift; shift
                done
        done
        echo "  defining $val"
        define_bool "$val" "y"
}

CONFIG=.tmpconfig
CONFIG_H=.tmpconfig.h
trap "rm -f $CONFIG $CONFIG_H ; exit 1" 1 2

#
# Make sure we start out with a clean slate.
#
echo "#" > $CONFIG
echo "# Automatically generated make config: don't edit" >> $CONFIG
echo "#" >> $CONFIG

echo "/*" > $CONFIG_H
echo " * Automatically generated C config: don't edit" >> $CONFIG_H
echo " */" >> $CONFIG_H

DEFAULT=""
if [ "$1" = "-d" ] ; then
        DEFAULT="-d"
        shift
fi

CONFIG_IN=./config.in
if [ "$1" != "" ] ; then
        CONFIG_IN=$1
fi

if [ -f ./.config ] ; then
        . ./.config
        sed -e 's/# \(.*\) is not.*/\1=n/' <./.config >/tmp/conf.$$
        . /tmp/conf.$$
        rm /tmp/conf.$$
fi
. $CONFIG_IN

case "$CONFIG_SOUND" in
        [YyMm] )        $MAKE -C drivers/sound config || exit 1 ;;
esac

rm -f .config.old
if [ -f .config ]; then
        mv .config .config.old
fi
mv .tmpconfig .config
mv .tmpconfig.h include/linux/autoconf.h

echo
echo "The linux kernel is now hopefully configured for your setup."
echo "Check the top-level Makefile for additional configuration,"
echo "and do a 'make dep ; make clean' if you want to be sure all"
echo "the files are correctly re-made"
echo

exit 0

/* [previous][next][first][last][top][bottom][index][help] */