Menuconfig
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:30k
- #! /bin/sh
- #
- # This script is used to configure the linux kernel.
- #
- # It was inspired by a desire to not have to hit <enter> 9 million times
- # or startup the X server just to change a single kernel parameter.
- #
- # This script attempts to parse the configuration files, which are
- # scattered throughout the kernel source tree, and creates a temporary
- # set of mini scripts which are in turn used to create nested menus and
- # radiolists.
- #
- # It uses a very modified/mutilated version of the "dialog" utility
- # written by Savio Lam (lam836@cs.cuhk.hk). Savio is not responsible
- # for this script or the version of dialog used by this script.
- # Please do not contact him with questions. The official version of
- # dialog is available at sunsite.unc.edu or a sunsite mirror.
- #
- # Portions of this script were borrowed from the original Configure
- # script.
- #
- # William Roadcap was the original author of Menuconfig.
- # Michael Elizabeth Chastain (mec@shout.net) is the current maintainer.
- #
- # 070497 Bernhard Kaindl (bkaindl@netway.at) - get default values for
- # new bool, tristate and dep_tristate parameters from the defconfig file.
- # new configuration parameters are marked with '(NEW)' as in make config.
- #
- # 180697 Bernhard Kaindl (bkaindl@netway.at) - added the needed support
- # for string options. They are handled like the int and hex options.
- #
- # 081297 Pavel Machek (pavel@atrey.karlin.mff.cuni.cz) - better error
- # handling
- #
- # 131197 Michael Chastain (mec@shout.net) - output all lines for a
- # choice list, not just the selected one. This makes the output
- # the same as Configure output, which is important for smart config
- # dependencies.
- #
- # 101297 Michael Chastain (mec@shout.net) - remove sound driver cruft.
- #
- # 221297 Michael Chastain (mec@shout.net) - make define_bool actually
- # define its arguments so that later tests on them work right.
- #
- # 160198 Michael Chastain (mec@shout.net) - fix bug with 'c' command
- # (complement existing value) when used on virgin uninitialized variables.
- #
- # 090398 Axel Boldt (boldt@math.ucsb.edu) - allow for empty lines in help
- # texts.
- #
- # 12 Dec 1998, Michael Elizabeth Chastain (mec@shout.net)
- # Remove a /tmp security hole in get_def (also makes it faster).
- # Give uninitialized variables canonical values rather than null value.
- # Change a lot of places to call set_x_info uniformly.
- # Take out message about preparing version (old sound driver cruft).
- #
- # 13 Dec 1998, Riley H Williams <Riley@Williams.Name>
- # When an error occurs, actually display the error message as well as
- # our comments thereon.
- #
- # 31 Dec 1998, Michael Elizabeth Chastain (mec@shout.net)
- # Fix mod_bool to honor $CONFIG_MODULES.
- # Fix dep_tristate to call define_bool when dependency is "n".
- #
- # 02 January 1999, Michael Elizabeth Chastain (mec@shout.net)
- # Blow away lxdialog.scrltmp on entry to activate_menu. This protects
- # against people who use commands like ' ' to select menus.
- #
- # 24 January 1999, Michael Elizabeth Chastain, <mec@shout.net>
- # - Improve the exit message (Jeff Ronne).
- #
- # 06 July 1999, Andrzej M. Krzysztofowicz, <ankry@mif.pg.gda.pl>
- # - Support for multiple conditions in dep_tristate().
- # - Implemented new functions: define_tristate(), define_int(), define_hex(),
- # define_string(), dep_bool().
- #
- # 12 November 2001, Keith Owens <kaos@ocs.com.au>
- # Escape double quotes on eval so the quotes are still there on the second
- # evaluation, required to handle strings with special characters.
- #
- #
- # Change this to TRUE if you prefer all kernel options listed
- # in a single menu rather than the standard menu hierarchy.
- #
- single_menu_mode=
- #
- # Make sure we're really running bash.
- #
- [ -z "$BASH" ] && { echo "Menuconfig requires bash" 1>&2; exit 1; }
- #
- # Cache function definitions, turn off posix compliance
- #
- set -h +o posix
- # Given a configuration variable, set the global variable $x to its value,
- # and the global variable $info to the string " (NEW)" if this is a new
- # variable.
- #
- # This function looks for: (1) the current value, or (2) the default value
- # from the arch-dependent defconfig file, or (3) a default passed by the caller.
- function set_x_info () {
- eval x=$$1
- if [ -z "$x" ]; then
- eval `sed -n -e 's/# (.*) is not set.*/1=n/' -e "/^$1=/p" arch/$ARCH/defconfig`
- eval x=${$1:-"$2"}
- eval $1=$x
- eval INFO_$1="' (NEW)'"
- fi
- eval info="$INFO_$1"
- }
- #
- # Load the functions used by the config.in files.
- #
- # I do this because these functions must be redefined depending
- # on whether they are being called for interactive use or for
- # saving a configuration to a file.
- #
- # Thank the heavens bash supports nesting function definitions.
- #
- load_functions () {
- #
- # Additional comments
- #
- function comment () {
- comment_ctr=$[ comment_ctr + 1 ]
- echo -ne "': $comment_ctr' '--- $1' " >>MCmenu
- }
- #
- # Define a boolean to a specific value.
- #
- function define_bool () {
- eval $1=$2
- }
- function define_tristate () {
- eval $1=$2
- }
- function define_hex () {
- eval $1=$2
- }
- function define_int () {
- eval $1=$2
- }
- function define_string () {
- eval $1="$2"
- }
- #
- # Create a boolean (Yes/No) function for our current menu
- # which calls our local bool function.
- #
- function bool () {
- set_x_info "$2" "n"
- case $x in
- y|m) flag="*" ;;
- n) flag=" " ;;
- esac
- echo -ne "'$2' '[$flag] $1$info' " >>MCmenu
- echo -e "function $2 () { l_bool '$2' "$1" ;}n" >>MCradiolists
- }
- #
- # Create a tristate (Yes/No/Module) radiolist function
- # which calls our local tristate function.
- #
- # Collapses to a boolean (Yes/No) if module support is disabled.
- #
- function tristate () {
- if [ "$CONFIG_MODULES" != "y" ]
- then
- bool "$1" "$2"
- else
- set_x_info "$2" "n"
-
- case $x in
- y) flag="*" ;;
- m) flag="M" ;;
- *) flag=" " ;;
- esac
-
- echo -ne "'$2' '<$flag> $1$info' " >>MCmenu
-
- echo -e "
- function $2 () { l_tristate '$2' "$1" ;}" >>MCradiolists
- fi
- }
- #
- # Create a tristate radiolist function which is dependent on
- # another kernel configuration option.
- #
- # Quote from the original configure script:
- #
- # 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 () {
- ques="$1"
- var="$2"
- dep=y
- shift 2
- while [ $# -gt 0 ]; do
- if [ "$1" = y ]; then
- shift
- elif [ "$1" = m ]; then
- dep=m
- shift
- else
- dep=n
- shift $#
- fi
- done
- if [ "$dep" = y ]; then
- tristate "$ques" "$var"
- elif [ "$dep" = m ]; then
- mod_bool "$ques" "$var"
- else
- define_tristate "$var" n
- fi
- }
- #
- # Same as above, but now only Y and N are allowed as dependency
- # (i.e. third and next arguments).
- #
- function dep_bool () {
- ques="$1"
- var="$2"
- dep=y
- shift 2
- while [ $# -gt 0 ]; do
- if [ "$1" = y ]; then
- shift
- else
- dep=n
- shift $#
- fi
- done
- if [ "$dep" = y ]; then
- bool "$ques" "$var"
- else
- define_bool "$var" n
- fi
- }
- function dep_mbool () {
- ques="$1"
- var="$2"
- dep=y
- shift 2
- while [ $# -gt 0 ]; do
- if [ "$1" = y -o "$1" = m ]; then
- shift
- else
- dep=n
- shift $#
- fi
- done
- if [ "$dep" = y ]; then
- bool "$ques" "$var"
- else
- define_bool "$var" n
- fi
- }
- #
- # Add a menu item which will call our local int function.
- #
- function int () {
- set_x_info "$2" "$3"
- echo -ne "'$2' '($x) $1$info' " >>MCmenu
- echo -e "function $2 () { l_int '$1' '$2' '$3' '$x' ;}" >>MCradiolists
- }
- #
- # Add a menu item which will call our local hex function.
- #
- function hex () {
- set_x_info "$2" "$3"
- x=${x##*[x,X]}
- echo -ne "'$2' '($x) $1$info' " >>MCmenu
- echo -e "function $2 () { l_hex '$1' '$2' '$3' '$x' ;}" >>MCradiolists
- }
- #
- # Add a menu item which will call our local string function.
- #
- function string () {
- set_x_info "$2" "$3"
- echo -ne "'$2' ' $1: "$x"$info' " >>MCmenu
- echo -e "function $2 () { l_string '$1' '$2' '$3' '$x' ;}" >>MCradiolists
- }
- #
- # Add a menu item which will call our local One-of-Many choice list.
- #
- function choice () {
- #
- # Need to remember params cause they're gonna get reset.
- #
- title=$1
- choices=$2
- default=$3
- current=
- #
- # Find out if one of the choices is already set.
- # If it's not then make it the default.
- #
- set -- $choices
- firstchoice=$2
- while [ -n "$2" ]
- do
- if eval [ "_$$2" = "_y" ]
- then
- current=$1
- break
- fi
- shift ; shift
- done
- : ${current:=$default}
- echo -ne "'$firstchoice' '($current) $title' " >>MCmenu
- echo -e "
- function $firstchoice ()
- { l_choice '$title' "$choices" "$current" ;}" >>MCradiolists
- }
- } # END load_functions()
- #
- # Extract available help for an option from Configure.help
- # and send it to standard output.
- #
- # Most of this function was borrowed from the original kernel
- # Configure script.
- #
- function extract_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
- s/^ //
- /<file:\([^>]*\)>/s//\1/g
- p
- }" Documentation/Configure.help)
- if [ -z "$text" ]
- then
- echo "There is no help available for this kernel option."
- return 1
- else
- echo "$text"
- fi
- else
- echo "There is no help available for this kernel option."
- return 1
- fi
- }
- #
- # Activate a help dialog.
- #
- function help () {
- if extract_help $1 >help.out
- then
- $DIALOG --backtitle "$backtitle" --title "$2"
- --textbox help.out $ROWS $COLS
- else
- $DIALOG --backtitle "$backtitle"
- --textbox help.out $ROWS $COLS
- fi
- rm -f help.out
- }
- #
- # Show the README file.
- #
- function show_readme () {
- $DIALOG --backtitle "$backtitle"
- --textbox scripts/README.Menuconfig $ROWS $COLS
- }
- #
- # Begin building the dialog menu command and Initialize the
- # Radiolist function file.
- #
- function menu_name () {
- echo -ne "$DIALOG --title '$1'
- --backtitle '$backtitle'
- --menu '$menu_instructions'
- $ROWS $COLS $((ROWS-10))
- '$default' " >MCmenu
- >MCradiolists
- }
- #
- # Add a submenu option to the menu currently under construction.
- #
- function submenu () {
- echo -ne "'activate_menu $2' '$1 --->' " >>MCmenu
- }
- #
- # Handle a boolean (Yes/No) option.
- #
- function l_bool () {
- if [ -n "$2" ]
- then
- case "$2" in
- y|m) eval $1=y ;;
- c) eval x=$$1
- case $x in
- y) eval $1=n ;;
- n) eval $1=y ;;
- *) eval $1=y ;;
- esac ;;
- *) eval $1=n ;;
- esac
- else
- echo -ne "07"
- fi
- }
- #
- # Same as bool() except options are (Module/No)
- #
- function mod_bool () {
- if [ "$CONFIG_MODULES" != "y" ]; then
- define_bool "$2" "n"
- else
- set_x_info "$2" "n"
-
- case $x in
- y|m) flag='M' ;;
- *) flag=' ' ;;
- esac
-
- echo -ne "'$2' '<$flag> $1$info' " >>MCmenu
-
- echo -e "function $2 () { l_mod_bool '$2' "$1" ;}" >>MCradiolists
- fi
- }
- #
- # Same as l_bool() except options are (Module/No)
- #
- function l_mod_bool() {
- if [ -n "$2" ]
- then
- case "$2" in
- y) echo -en "07"
- ${DIALOG} --backtitle "$backtitle"
- --infobox "
- This feature depends on another which has been configured as a module.
- As a result, this feature will be built as a module." 4 70
- sleep 5
- eval $1=m ;;
- m) eval $1=m ;;
- c) eval x=$$1
- case $x in
- m) eval $1=n ;;
- n) eval $1=m ;;
- *) eval $1=m ;;
- esac ;;
- *) eval $1=n ;;
- esac
- else
- echo -ne "07"
- fi
- }
- #
- # Handle a tristate (Yes/No/Module) option.
- #
- function l_tristate () {
- if [ -n "$2" ]
- then
- eval x=$$1
- case "$2" in
- y) eval $1=y ;;
- m) eval $1=m ;;
- c) eval x=$$1
- case $x in
- y) eval $1=n ;;
- n) eval $1=m ;;
- m) eval $1=y ;;
- *) eval $1=y ;;
- esac ;;
- *) eval $1=n ;;
- esac
- else
- echo -ne "07"
- fi
- }
- #
- # Create a dialog for entering an integer into a kernel option.
- #
- function l_int () {
- while true
- do
- if $DIALOG --title "$1"
- --backtitle "$backtitle"
- --inputbox "$inputbox_instructions_int"
- 10 75 "$4" 2>MCdialog.out
- then
- answer="`cat MCdialog.out`"
- answer="${answer:-$3}"
- # Semantics of + and ? in GNU expr changed, so
- # we avoid them:
- if expr "$answer" : '0$' '|' "$answer" : '[1-9][0-9]*$' '|' "$answer" : '-[1-9][0-9]*$' >/dev/null
- then
- eval $2="$answer"
- else
- eval $2="$3"
- echo -en "07"
- ${DIALOG} --backtitle "$backtitle"
- --infobox "You have made an invalid entry." 3 43
- sleep 2
- fi
- break
- fi
- help "$2" "$1"
- done
- }
- #
- # Create a dialog for entering a hexadecimal into a kernel option.
- #
- function l_hex () {
- while true
- do
- if $DIALOG --title "$1"
- --backtitle "$backtitle"
- --inputbox "$inputbox_instructions_hex"
- 10 75 "$4" 2>MCdialog.out
- then
- answer="`cat MCdialog.out`"
- answer="${answer:-$3}"
- answer="${answer##*[x,X]}"
- if expr "$answer" : '[0-9a-fA-F][0-9a-fA-F]*$' >/dev/null
- then
- eval $2="$answer"
- else
- eval $2="$3"
- echo -en "07"
- ${DIALOG} --backtitle "$backtitle"
- --infobox "You have made an invalid entry." 3 43
- sleep 2
- fi
- break
- fi
- help "$2" "$1"
- done
- }
- #
- # Create a dialog for entering a string into a kernel option.
- #
- function l_string () {
- while true
- do
- if $DIALOG --title "$1"
- --backtitle "$backtitle"
- --inputbox "$inputbox_instructions_string"
- 10 75 "$4" 2>MCdialog.out
- then
- answer="`cat MCdialog.out`"
- answer="${answer:-$3}"
- #
- # Someone may add a nice check for the entered
- # string here...
- #
- eval $2="$answer"
- break
- fi
- help "$2" "$1"
- done
- }
- #
- # Handle a one-of-many choice list.
- #
- function l_choice () {
- #
- # Need to remember params cause they're gonna get reset.
- #
- title="$1"
- choices="$2"
- current="$3"
- chosen=
- #
- # Scan current value of choices and set radiolist switches.
- #
- list=
- set -- $choices
- firstchoice=$2
- while [ -n "$2" ]
- do
- case "$1" in
- "$current"*) if [ -z "$chosen" ]; then
- list="$list $2 $1 ON "
- chosen=1
- else
- list="$list $2 $1 OFF "
- fi ;;
- *) list="$list $2 $1 OFF " ;;
- esac
-
- shift ; shift
- done
- while true
- do
- if $DIALOG --title "$title"
- --backtitle "$backtitle"
- --radiolist "$radiolist_instructions"
- 15 70 6 $list 2>MCdialog.out
- then
- choice=`cat MCdialog.out`
- break
- fi
- help "$firstchoice" "$title"
- done
- #
- # Now set the boolean value of each option based on
- # the selection made from the radiolist.
- #
- set -- $choices
- while [ -n "$2" ]
- do
- if [ "$2" = "$choice" ]
- then
- eval $2="y"
- else
- eval $2="n"
- fi
-
- shift ; shift
- done
- }
- #
- # Call awk, and watch for error codes, etc.
- #
- function callawk () {
- awk "$1" || { echo "Awk died with error code $?. Giving up."; exit 1; }
- }
- #
- # A faster awk based recursive parser. (I hope)
- #
- function parser1 () {
- callawk '
- BEGIN {
- menu_no = 0
- comment_is_option = 0
- parser("'$CONFIG_IN'","MCmenu0")
- }
- function parser(ifile,menu) {
- while (getline <ifile) {
- if ($1 == "mainmenu_option") {
- comment_is_option = "1"
- }
- else if ($1 == "comment" && comment_is_option == "1") {
- comment_is_option= "0"
- sub($1,"",$0)
- ++menu_no
- printf("submenu %s MCmenu%sn", $0, menu_no) >>menu
- newmenu = sprintf("MCmenu%d", menu_no);
- printf( "function MCmenu%s () {n"
- "default=$1n"
- "menu_name %sn",
- menu_no, $0) >newmenu
- parser(ifile, newmenu)
- }
- else if ($0 ~ /^#|$MAKE|mainmenu_name/) {
- printf("") >>menu
- }
- else if ($1 ~ "endmenu") {
- printf("}n") >>menu
- return
- }
- else if ($1 == "source") {
- parser($2,menu)
- }
- else {
- print >>menu
- }
- }
- }'
- }
- #
- # Secondary parser for single menu mode.
- #
- function parser2 () {
- callawk '
- BEGIN {
- parser("'$CONFIG_IN'","MCmenu0")
- }
- function parser(ifile,menu) {
- while (getline <ifile) {
- if ($0 ~ /^#|$MAKE|mainmenu_name/) {
- printf("") >>menu
- }
- else if ($1 ~ /mainmenu_option|endmenu/) {
- printf("") >>menu
- }
- else if ($1 == "source") {
- parser($2,menu)
- }
- else {
- print >>menu
- }
- }
- }'
- }
- #
- # Parse all the config.in files into mini scripts.
- #
- function parse_config_files () {
- rm -f MCmenu*
- echo "function MCmenu0 () {" >MCmenu0
- echo 'default=$1' >>MCmenu0
- echo "menu_name 'Main Menu'" >>MCmenu0
- if [ "_$single_menu_mode" = "_TRUE" ]
- then
- parser2
- else
- parser1
- fi
- echo "comment ''" >>MCmenu0
- echo "g_alt_config" >>MCmenu0
- echo "s_alt_config" >>MCmenu0
- echo "}" >>MCmenu0
- #
- # These mini scripts must be sourced into the current
- # environment in order for all of this to work. Leaving
- # them on the disk as executables screws up the recursion
- # in activate_menu(), among other things. Once they are
- # sourced we can discard them.
- #
- for i in MCmenu*
- do
- echo -n "."
- source ./$i
- done
- rm -f MCmenu*
- }
- #
- # This is the menu tree's bootstrap.
- #
- # Executes the parsed menus on demand and creates a set of functions,
- # one per configuration option. These functions will in turn execute
- # dialog commands or recursively call other menus.
- #
- function activate_menu () {
- rm -f lxdialog.scrltmp
- while true
- do
- comment_ctr=0 #So comment lines get unique tags
- $1 "$default" 2> MCerror #Create the lxdialog menu & functions
- if [ "$?" != "0" ]
- then
- clear
- cat <<EOM
- Menuconfig has encountered a possible error in one of the kernel's
- configuration files and is unable to continue. Here is the error
- report:
- EOM
- sed 's/^/ Q> /' MCerror
- cat <<EOM
- Please report this to the maintainer <mec@shout.net>. You may also
- send a problem report to <linux-kernel@vger.kernel.org>.
- Please indicate the kernel version you are trying to configure and
- which menu you were trying to enter when this error occurred.
- EOM
- cleanup
- exit 1
- fi
- rm -f MCerror
- . ./MCradiolists #Source the menu's functions
- . ./MCmenu 2>MCdialog.out #Activate the lxdialog menu
- ret=$?
- read selection <MCdialog.out
- case "$ret" in
- 0|3|4|5|6)
- defaults="$selection$defaults" #pseudo stack
- case "$ret" in
- 0) eval $selection ;;
- 3) eval $selection y ;;
- 4) eval $selection n ;;
- 5) eval $selection m ;;
- 6) eval $selection c ;;
- esac
- default="${defaults%%*}" defaults="${defaults#*}"
- ;;
- 2)
- default="${selection%% *}"
- case "$selection" in
- *"-->"*|*"alt_config"*)
- show_readme ;;
- *)
- eval help $selection ;;
- esac
- ;;
- 255|1)
- break
- ;;
- 139)
- stty sane
- clear
- cat <<EOM
- There seems to be a problem with the lxdialog companion utility which is
- built prior to running Menuconfig. Usually this is an indicator that you
- have upgraded/downgraded your ncurses libraries and did not remove the
- old ncurses header file(s) in /usr/include or /usr/include/ncurses.
- It is VERY important that you have only one set of ncurses header files
- and that those files are properly version matched to the ncurses libraries
- installed on your machine.
- You may also need to rebuild lxdialog. This can be done by moving to
- the /usr/src/linux/scripts/lxdialog directory and issuing the
- "make clean all" command.
- If you have verified that your ncurses install is correct, you may email
- the maintainer <mec@shout.net> or post a message to
- <linux-kernel@vger.kernel.org> for additional assistance.
- EOM
- cleanup
- exit 139
- ;;
- esac
- done
- }
- #
- # Create a menu item to load an alternate configuration file.
- #
- g_alt_config () {
- echo -n "get_alt_config 'Load an Alternate Configuration File' "
- >>MCmenu
- }
- #
- # Get alternate config file name and load the
- # configuration from it.
- #
- get_alt_config () {
- set -f ## Switch file expansion OFF
- while true
- do
- ALT_CONFIG="${ALT_CONFIG:-$DEFAULTS}"
- $DIALOG --backtitle "$backtitle"
- --inputbox "
- Enter the name of the configuration file you wish to load.
- Accept the name shown to restore the configuration you
- last retrieved. Leave blank to abort."
- 11 55 "$ALT_CONFIG" 2>MCdialog.out
- if [ "$?" = "0" ]
- then
- ALT_CONFIG=`cat MCdialog.out`
- [ "_" = "_$ALT_CONFIG" ] && break
- if eval [ -r "$ALT_CONFIG" ]
- then
- eval load_config_file "$ALT_CONFIG"
- break
- else
- echo -ne "07"
- $DIALOG --backtitle "$backtitle"
- --infobox "File does not exist!" 3 38
- sleep 2
- fi
- else
- cat <<EOM >help.out
- For various reasons, one may wish to keep several different kernel
- configurations available on a single machine.
- If you have saved a previous configuration in a file other than the
- kernel's default, entering the name of the file here will allow you
- to modify that configuration.
- If you are uncertain, then you have probably never used alternate
- configuration files. You should therefor leave this blank to abort.
- EOM
- $DIALOG --backtitle "$backtitle"
- --title "Load Alternate Configuration"
- --textbox help.out $ROWS $COLS
- fi
- done
- set +f ## Switch file expansion ON
- rm -f help.out MCdialog.out
- }
- #
- # Create a menu item to store an alternate config file.
- #
- s_alt_config () {
- echo -n "save_alt_config 'Save Configuration to an Alternate File' "
- >>MCmenu
- }
- #
- # Get an alternate config file name and save the current
- # configuration to it.
- #
- save_alt_config () {
- set -f ## Switch file expansion OFF
-
- while true
- do
- $DIALOG --backtitle "$backtitle"
- --inputbox "
- Enter a filename to which this configuration should be saved
- as an alternate. Leave blank to abort."
- 10 55 "$ALT_CONFIG" 2>MCdialog.out
- if [ "$?" = "0" ]
- then
- ALT_CONFIG=`cat MCdialog.out`
- [ "_" = "_$ALT_CONFIG" ] && break
- if eval touch $ALT_CONFIG 2>/dev/null
- then
- eval save_configuration $ALT_CONFIG
- load_functions ## RELOAD
- break
- else
- echo -ne "07"
- $DIALOG --backtitle "$backtitle"
- --infobox "Can't create file! Probably a nonexistent directory." 3 60
- sleep 2
- fi
- else
- cat <<EOM >help.out
- For various reasons, one may wish to keep different kernel
- configurations available on a single machine.
- Entering a file name here will allow you to later retrieve, modify
- and use the current configuration as an alternate to whatever
- configuration options you have selected at that time.
- If you are uncertain what all this means then you should probably
- leave this blank.
- EOM
- $DIALOG --backtitle "$backtitle"
- --title "Save Alternate Configuration"
- --textbox help.out $ROWS $COLS
- fi
- done
- set +f ## Switch file expansion ON
- rm -f help.out MCdialog.out
- }
- #
- # Load config options from a file.
- # Converts all "# OPTION is not set" lines to "OPTION=n" lines
- #
- function load_config_file () {
- awk '
- /# .* is not set.*/ { printf("%s=nn", $2) }
- ! /# .* is not set.*/ { print }
- ' $1 >.tmpconfig
- source ./.tmpconfig
- rm -f .tmpconfig
- }
- #
- # Just what it says.
- #
- save_configuration () {
- echo
- echo -n "Saving your kernel configuration."
- #
- # Now, let's redefine the configuration functions for final
- # output to the config files.
- #
- # Nested function definitions, YIPEE!
- #
- function bool () {
- set_x_info "$2" "n"
- eval define_bool "$2" "$x"
- }
- function tristate () {
- set_x_info "$2" "n"
- eval define_tristate "$2" "$x"
- }
- function dep_tristate () {
- set_x_info "$2" "n"
- var="$2"
- shift 2
- while [ $# -gt 0 ]; do
- if [ "$1" = y ]; then
- shift
- elif [ "$1" = m -a "$x" != n ]; then
- x=m; shift
- else
- x=n; shift $#
- fi
- done
- define_tristate "$var" "$x"
- }
- function dep_bool () {
- set_x_info "$2" "n"
- var="$2"
- shift 2
- while [ $# -gt 0 ]; do
- if [ "$1" = y ]; then
- shift
- else
- x=n; shift $#
- fi
- done
- define_bool "$var" "$x"
- }
- function dep_mbool () {
- set_x_info "$2" "n"
- var="$2"
- shift 2
- while [ $# -gt 0 ]; do
- if [ "$1" = y -o "$1" = m ]; then
- shift
- else
- x=n; shift $#
- fi
- done
- define_bool "$var" "$x"
- }
- function int () {
- set_x_info "$2" "$3"
- echo "$2=$x" >>$CONFIG
- echo "#define $2 ($x)" >>$CONFIG_H
- }
- function hex () {
- set_x_info "$2" "$3"
- echo "$2=$x" >>$CONFIG
- echo "#define $2 0x${x##*[x,X]}" >>$CONFIG_H
- }
- function string () {
- set_x_info "$2" "$3"
- echo "$2="$x"" >>$CONFIG
- echo "#define $2 "$x"" >>$CONFIG_H
- }
- function define_hex () {
- eval $1="$2"
- echo "$1=$2" >>$CONFIG
- echo "#define $1 0x${2##*[x,X]}" >>$CONFIG_H
- }
- function define_int () {
- eval $1="$2"
- echo "$1=$2" >>$CONFIG
- echo "#define $1 ($2)" >>$CONFIG_H
- }
- function define_string () {
- eval $1="$2"
- echo "$1="$2"" >>$CONFIG
- echo "#define $1 "$2"" >>$CONFIG_H
- }
- function define_bool () {
- define_tristate "$1" "$2"
- }
- function define_tristate () {
- eval $1="$2"
- case "$2" in
- y)
- echo "$1=y" >>$CONFIG
- echo "#define $1 1" >>$CONFIG_H
- ;;
- m)
- if [ "$CONFIG_MODULES" = "y" ]
- then
- echo "$1=m" >>$CONFIG
- echo "#undef $1" >>$CONFIG_H
- echo "#define $1_MODULE 1" >>$CONFIG_H
- else
- echo "$1=y" >>$CONFIG
- echo "#define $1 1" >>$CONFIG_H
- fi
- ;;
- n)
- echo "# $1 is not set" >>$CONFIG
- echo "#undef $1" >>$CONFIG_H
- ;;
- esac
- }
- function choice () {
- #
- # Find the first choice that's already set to 'y'
- #
- choices="$2"
- default="$3"
- current=
- chosen=
- set -- $choices
- while [ -n "$2" ]
- do
- if eval [ "_$$2" = "_y" ]
- then
- current=$1
- break
- fi
- shift ; shift
- done
- #
- # Use the default if none were set.
- #
- : ${current:=$default}
- #
- # Output all choices (to be compatible with other configs).
- #
- set -- $choices
- while [ -n "$2" ]
- do
- case "$1" in
- "$current"*) if [ -z "$chosen" ]; then
- define_bool "$2" "y"
- chosen=1
- else
- define_bool "$2" "n"
- fi ;;
- *) define_bool "$2" "n" ;;
- esac
- shift ; shift
- done
- }
- function mainmenu_name () {
- :
- }
- function mainmenu_option () {
- comment_is_option=TRUE
- }
- function endmenu () {
- :
- }
- function comment () {
- if [ "$comment_is_option" ]
- then
- comment_is_option=
- echo >>$CONFIG
- echo "#" >>$CONFIG
- echo "# $1" >>$CONFIG
- echo "#" >>$CONFIG
- echo >>$CONFIG_H
- echo "/*" >>$CONFIG_H
- echo " * $1" >>$CONFIG_H
- echo " */" >>$CONFIG_H
- fi
- }
- echo -n "."
- DEF_CONFIG="${1:-.config}"
- DEF_CONFIG_H="include/linux/autoconf.h"
- CONFIG=.tmpconfig
- CONFIG_H=.tmpconfig.h
- echo "#" >$CONFIG
- echo "# Automatically generated by make menuconfig: don't edit" >>$CONFIG
- echo "#" >>$CONFIG
- echo "/*" >$CONFIG_H
- echo " * Automatically generated by make menuconfig: don't edit" >>$CONFIG_H
- echo " */" >>$CONFIG_H
- echo "#define AUTOCONF_INCLUDED" >> $CONFIG_H
- echo -n "."
- if . $CONFIG_IN >>.menuconfig.log 2>&1
- then
- if [ "$DEF_CONFIG" = ".config" ]
- then
- mv $CONFIG_H $DEF_CONFIG_H
- fi
- if [ -f "$DEF_CONFIG" ]
- then
- rm -f ${DEF_CONFIG}.old
- mv $DEF_CONFIG ${DEF_CONFIG}.old
- fi
- mv $CONFIG $DEF_CONFIG
-
- return 0
- else
- return 1
- fi
- }
- #
- # Remove temporary files
- #
- cleanup () {
- cleanup1
- cleanup2
- }
- cleanup1 () {
- rm -f MCmenu* MCradiolists MCdialog.out help.out
- }
- cleanup2 () {
- rm -f .tmpconfig .tmpconfig.h
- }
- set_geometry () {
- # Some distributions export these with incorrect values
- # which can really screw up some ncurses programs.
- LINES= COLUMNS=
- ROWS=${1:-24} COLS=${2:-80}
- # Just in case the nasty rlogin bug returns.
- #
- [ $ROWS = 0 ] && ROWS=24
- [ $COLS = 0 ] && COLS=80
- if [ $ROWS -lt 19 -o $COLS -lt 80 ]
- then
- echo -e "n07Your display is too small to run Menuconfig!"
- echo "It must be at least 19 lines by 80 columns."
- exit 1
- fi
- ROWS=$((ROWS-4)) COLS=$((COLS-5))
- }
- set_geometry `stty size 2>/dev/null`
- menu_instructions="
- Arrow keys navigate the menu.
- <Enter> selects submenus --->.
- Highlighted letters are hotkeys.
- Pressing <Y> includes, <N> excludes, <M> modularizes features.
- Press <Esc><Esc> to exit, <?> for Help.
- Legend: [*] built-in [ ] excluded <M> module < > module capable"
- radiolist_instructions="
- Use the arrow keys to navigate this window or
- press the hotkey of the item you wish to select
- followed by the <SPACE BAR>.
- Press <?> for additional information about this option."
- inputbox_instructions_int="
- Please enter a decimal value.
- Fractions will not be accepted.
- Use the <TAB> key to move from the input field to the buttons below it."
- inputbox_instructions_hex="
- Please enter a hexadecimal value.
- Use the <TAB> key to move from the input field to the buttons below it."
- inputbox_instructions_string="
- Please enter a string value.
- Use the <TAB> key to move from the input field to the buttons below it."
- DIALOG="./scripts/lxdialog/lxdialog"
- kernel_version="${VERSION}.${PATCHLEVEL}.${SUBLEVEL}${EXTRAVERSION}"
- backtitle="Linux Kernel v$kernel_version Configuration"
- trap "cleanup ; exit 1" 1 2 15
- #
- # Locate default files.
- #
- 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 "Using defaults found in" $DEFAULTS
- load_config_file $DEFAULTS
- else
- echo "No defaults found"
- fi
- # Fresh new log.
- >.menuconfig.log
- # Load the functions used by the config.in files.
- echo -n "Preparing scripts: functions"
- load_functions
- if [ ! -e $CONFIG_IN ]
- then
- echo "Your main config.in file ($CONFIG_IN) does not exist"
- exit 1
- fi
- if [ ! -x $DIALOG ]
- then
- echo "Your lxdialog utility does not exist"
- exit 1
- fi
- #
- # Read config.in files and parse them into one shell function per menu.
- #
- echo -n ", parsing"
- parse_config_files $CONFIG_IN
- echo "done."
- #
- # Start the ball rolling from the top.
- #
- activate_menu MCmenu0
- #
- # All done!
- #
- cleanup1
- #
- # Confirm and Save
- #
- if $DIALOG --backtitle "$backtitle"
- --yesno "Do you wish to save your new kernel configuration?" 5 60
- then
- save_configuration
- echo
- 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
- else
- echo
- echo
- echo Your kernel configuration changes were NOT saved.
- echo
- fi
- # Remove log if empty.
- if [ ! -s .menuconfig.log ] ; then
- rm -f .menuconfig.log
- fi
- exit 0