Configure
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:12k
- #! /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.
- #
- # Raymond Chen was the original author of Configure.
- # Michael Elizabeth Chastain (mec@shout.net) is the current maintainer.
- #
- # 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.
- #
- # 180995 Bernhard Kaindl (bkaindl@ping.at) - added dummy functions for
- # use with a config.in modified for make menuconfig.
- #
- # 301195 (boldt@math.ucsb.edu) - added help text support
- #
- # 281295 Paul Gortmaker - make tri_state functions collapse to boolean
- # if module support is not enabled.
- #
- # 010296 Aaron Ucko (ucko@vax1.rockhurst.edu) - fix int and hex to accept
- # arbitrary ranges
- #
- # 150296 Dick Streefland (dicks@tasking.nl) - report new configuration
- # items and ask for a value even when doing a "make oldconfig"
- #
- # 200396 Tom Dyas (tdyas@eden.rutgers.edu) - when the module option is
- # chosen for an item, define the macro <option_name>_MODULE
- #
- # 090397 Axel Boldt (boldt@math.ucsb.edu) - avoid ? and + in regular
- # expressions for GNU expr since version 1.15 and up use ? and +.
- #
- # 300397 Phil Blundell (pjb27@cam.ac.uk) - added support for min/max
- # arguments to "int", allow dep_tristate to take a list of dependencies
- # rather than just one.
- #
- # 090398 Axel Boldt (boldt@math.ucsb.edu) - allow for empty lines in help
- # texts.
- #
- # 102598 Michael Chastain (mec@shout.net) - put temporary files in
- # current directory, not in /tmp.
- #
- # 24 January 1999, Michael Elizabeth Chastain, <mec@shout.net>
- # - Improve the exit message (Jeff Ronne).
- #
- # 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
- #
- # Dummy functions for use with a config.in modified for menuconf
- #
- function mainmenu_option () {
- :
- }
- function mainmenu_name () {
- :
- }
- function endmenu () {
- :
- }
- #
- # help prints the corresponding help text from Configure.help to stdout
- #
- # help variable
- #
- function help () {
- if [ -f Documentation/Configure.help ]
- then
- #first escape regexp special characters in the argument:
- var=$(echo "$1"|sed 's/[][/.^$*]/\&/g')
- #now pick out the right help text:
- text=$(sed -n "/^$var[ ]*$/,${
- /^$var[ ]*$/c\
- ${var}:\
- /^#/b
- /^[^ ]/q
- /<file:\([^>]*\)>/s//\1/g
- p
- }" Documentation/Configure.help)
- if [ -z "$text" ]
- then
- echo; echo " Sorry, no help available for this option yet.";echo
- else
- (echo; echo "$text") | ${PAGER:-more}
- fi
- else
- echo;
- echo " Can't access the file Documentation/Configure.help which"
- echo " should contain the help texts."
- echo
- fi
- }
- #
- # readln reads a line into $ans.
- #
- # readln prompt default oldval
- #
- function readln () {
- if [ "$DEFAULT" = "-d" -a -n "$3" ]; then
- echo "$1"
- ans=$2
- else
- echo -n "$1"
- [ -z "$3" ] && echo -n "(NEW) "
- IFS='@' read ans || 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 () {
- define_tristate $1 $2
- }
- function define_tristate () {
- case "$2" in
- "y")
- echo "$1=y" >>$CONFIG
- echo "#define $1 1" >>$CONFIG_H
- ;;
- "m")
- echo "$1=m" >>$CONFIG
- echo "#undef $1" >>$CONFIG_H
- echo "#define $1_MODULE 1" >>$CONFIG_H
- ;;
- "n")
- echo "# $1 is not set" >>$CONFIG
- echo "#undef $1" >>$CONFIG_H
- ;;
- esac
- eval "$1=$2"
- }
- #
- # bool processes a boolean argument
- #
- # bool question define
- #
- function bool () {
- old=$(eval echo "${$2}")
- def=${old:-'n'}
- case "$def" in
- "y" | "m") defprompt="Y/n/?"
- def="y"
- ;;
- "n") defprompt="N/y/?"
- ;;
- esac
- while :; do
- readln "$1 ($2) [$defprompt] " "$def" "$old"
- case "$ans" in
- [yY] | [yY]es ) define_bool "$2" "y"
- break;;
- [nN] | [nN]o ) define_bool "$2" "n"
- break;;
- * ) help "$2"
- ;;
- esac
- done
- }
- #
- # tristate processes a tristate argument
- #
- # tristate question define
- #
- function tristate () {
- if [ "$CONFIG_MODULES" != "y" ]; then
- bool "$1" "$2"
- else
- old=$(eval echo "${$2}")
- def=${old:-'n'}
- case "$def" in
- "y") defprompt="Y/m/n/?"
- ;;
- "m") defprompt="M/n/y/?"
- ;;
- "n") defprompt="N/y/m/?"
- ;;
- esac
- while :; do
- readln "$1 ($2) [$defprompt] " "$def" "$old"
- case "$ans" in
- [yY] | [yY]es ) define_tristate "$2" "y"
- break ;;
- [nN] | [nN]o ) define_tristate "$2" "n"
- break ;;
- [mM] ) define_tristate "$2" "m"
- break ;;
- * ) help "$2"
- ;;
- esac
- done
- fi
- }
- #
- # dep_tristate processes a tristate argument that depends upon
- # another option or options. If any of the options we depend upon is a
- # module, then the only allowable options are M or N. If all are 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.
- #
- # dep_tristate question define default ...
- #
- function dep_tristate () {
- old=$(eval echo "${$2}")
- def=${old:-'n'}
- ques=$1
- var=$2
- need_module=0
- shift 2
- while [ $# -gt 0 ]; do
- case "$1" in
- n)
- define_tristate "$var" "n"
- return
- ;;
- m)
- need_module=1
- ;;
- esac
- shift
- done
- if [ $need_module = 1 ]; then
- if [ "$CONFIG_MODULES" = "y" ]; then
- case "$def" in
- "y" | "m") defprompt="M/n/?"
- def="m"
- ;;
- "n") defprompt="N/m/?"
- ;;
- esac
- while :; do
- readln "$ques ($var) [$defprompt] " "$def" "$old"
- case "$ans" in
- [nN] | [nN]o ) define_tristate "$var" "n"
- break ;;
- [mM] ) define_tristate "$var" "m"
- break ;;
- [yY] | [yY]es ) echo
- echo " This answer is not allowed, because it is not consistent with"
- echo " your other choices."
- echo " This driver depends on another one which you chose to compile"
- echo " as a module. This means that you can either compile this one"
- echo " as a module as well (with M) or leave it out altogether (N)."
- echo
- ;;
- * ) help "$var"
- ;;
- esac
- done
- fi
- else
- tristate "$ques" "$var"
- fi
- }
- function dep_bool () {
- ques=$1
- var=$2
- shift 2
- while [ $# -gt 0 ]; do
- case "$1" in
- m | n)
- define_bool "$var" "n"
- return
- ;;
- esac
- shift
- done
- bool "$ques" "$var"
- }
- function dep_mbool () {
- ques=$1
- var=$2
- shift 2
- while [ $# -gt 0 ]; do
- case "$1" in
- n)
- define_bool "$var" "n"
- return
- ;;
- esac
- shift
- done
- bool "$ques" "$var"
- }
- #
- # 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 with optional limits
- #
- # int question define default [min max]
- #
- function int () {
- old=$(eval echo "${$2}")
- def=${old:-$3}
- if [ $# -gt 3 ]; then
- min=$4
- else
- min=-10000000 # !!
- fi
- if [ $# -gt 4 ]; then
- max=$5
- else
- max=10000000 # !!
- fi
- while :; do
- readln "$1 ($2) [$def] " "$def" "$old"
- if expr ( ( $ans + 0 ) >= $min ) & ( $ans <= $max ) >/dev/null 2>&1 ; then
- define_int "$2" "$ans"
- break
- else
- help "$2"
- fi
- done
- }
- #
- # define_hex sets the value of a hexadecimal argument
- #
- # define_hex define value
- #
- function define_hex () {
- echo "$1=$2" >>$CONFIG
- echo "#define $1 0x${2#*[x,X]}" >>$CONFIG_H
- eval "$1=$2"
- }
- #
- # hex processes an hexadecimal argument
- #
- # hex question define default
- #
- function hex () {
- old=$(eval echo "${$2}")
- def=${old:-$3}
- def=${def#*[x,X]}
- while :; do
- readln "$1 ($2) [$def] " "$def" "$old"
- ans=${ans#*[x,X]}
- if expr "$ans" : '[0-9a-fA-F][0-9a-fA-F]*$' > /dev/null; then
- define_hex "$2" "$ans"
- break
- else
- help "$2"
- fi
- done
- }
- #
- # define_string sets the value of a string argument
- #
- # define_string define value
- #
- function define_string () {
- echo "$1="$2"" >>$CONFIG
- echo "#define $1 "$2"" >>$CONFIG_H
- eval "$1="$2""
- }
- #
- # string processes a string argument
- #
- # string question define default
- #
- function string () {
- old=$(eval echo "${$2}")
- def=${old:-$3}
- while :; do
- if [ "$old" = "?" ]; then
- readln "$1 ($2) [$def] " "$def" ""
- else
- readln "$1 ($2) [$def] " "$def" "$old"
- fi
- if [ "$ans" = "?" ]; then
- help "$2"
- else
- break
- fi
- done
- define_string "$2" "$ans"
- }
- #
- # choice processes a choice list (1-out-of-n)
- #
- # choice question choice-list default
- #
- # The choice list has a syntax of:
- # NAME WHITESPACE VALUE { WHITESPACE NAME WHITESPACE 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"
- old=
- def=$3
- # determine default answer:
- names=""
- set -- $choices
- firstvar=$2
- while [ -n "$2" ]; do
- if [ -n "$names" ]; then
- names="$names, $1"
- else
- names="$1"
- fi
- if [ "$(eval echo "${$2}")" = "y" ]; then
- old=$1
- def=$1
- fi
- shift; shift
- done
- val=""
- while [ -z "$val" ]; do
- ambg=n
- readln "$question ($names) [$def] " "$def" "$old"
- ans=$(echo $ans | tr a-z A-Z)
- set -- $choices
- while [ -n "$1" ]; do
- name=$(echo $1 | tr a-z A-Z)
- case "$name" in
- "$ans"* | */"$ans"* )
- case "$name" in
- "$ans" | */"$ans"/* |
- "$ans"/* | */"$ans" )
- val="$2"
- break # exact match
- ;;
- esac
- if [ -n "$val" ]; then
- echo;echo
- " Sorry, "$ans" is ambiguous; please enter a longer string."
- echo
- val=""
- ambg=y
- break
- else
- val="$2"
- fi;;
- esac
- shift; shift
- done
- if [ "$val" = "" -a "$ambg" = "n" ]; then
- help "$firstvar"
- fi
- done
- set -- $choices
- while [ -n "$2" ]; do
- if [ "$2" = "$val" ]; then
- echo " defined $val"
- define_bool "$2" "y"
- else
- define_bool "$2" "n"
- fi
- shift; shift
- done
- }
- 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
- echo "#define AUTOCONF_INCLUDED" >> $CONFIG_H
- DEFAULT=""
- if [ "$1" = "-d" ] ; then
- DEFAULT="-d"
- shift
- fi
- CONFIG_IN=./config.in
- if [ "$1" != "" ] ; then
- CONFIG_IN=$1
- fi
- DEFAULTS=arch/$ARCH/defconfig
- if [ -f .config ]; then
- DEFAULTS=.config
- fi
- if [ -f $DEFAULTS ]; then
- echo "#"
- echo "# Using defaults found in" $DEFAULTS
- echo "#"
- . $DEFAULTS
- sed -e 's/# (CONFIG_[^ ]*) is not.*/1=n/' <$DEFAULTS >.config-is-not.$$
- . .config-is-not.$$
- rm .config-is-not.$$
- else
- echo "#"
- echo "# No defaults found"
- echo "#"
- fi
- . $CONFIG_IN
- 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 "*** End of Linux kernel configuration."
- echo "*** Check the top-level Makefile for additional configuration."
- if [ ! -f .hdepend -o "$CONFIG_MODVERSIONS" = "y" ] ; then
- echo "*** Next, you must run 'make dep'."
- else
- echo "*** Next, you may run 'make bzImage', 'make bzdisk', or 'make install'."
- fi
- echo
- exit 0