patch-1.3.60 linux/scripts/Menuconfig
Next file: linux/scripts/README.Menuconfig
Previous file: linux/scripts/Makefile
Back to the patch index
Back to the overall index
- Lines: 902
- Date:
Wed Feb 7 09:47:28 1996
- Orig file:
v1.3.59/linux/scripts/Menuconfig
- Orig date:
Thu Jan 1 02:00:00 1970
diff -u --recursive --new-file v1.3.59/linux/scripts/Menuconfig linux/scripts/Menuconfig
@@ -0,0 +1,901 @@
+#! /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 parses the configuration files, which are
+# scattered throughout the kernel source tree, and create 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 used in linux-1.3.55.
+#
+# Please send comments / questions / bug fixes to roadcapw@cfw.com
+#
+#----------------------------------------------------------------------------
+
+#
+# Make sure we're really running bash.
+#
+[ -z "$BASH" ] && { echo "Configure requires bash" 1>&2; exit 1; }
+
+#
+# Cache function definitions
+#
+set -h
+
+#
+# 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[ ]*\$/b
+ /^#.*/b;/^[ ]*\$/q
+ p
+ }" Documentation/Configure.help)
+
+ if [ -z "$text" ]
+ then
+ echo "There is no help available for this setting."
+ else
+ echo "$text"
+ fi
+ else
+ echo "There is no help available for this setting."
+ fi
+}
+
+#
+# Activate a help dialog.
+#
+function help () {
+ extract_help $2 >help.out
+ $DIALOG --backtitle "$backtitle" --title "$1" --textbox help.out 20 75
+ rm help.out
+}
+
+
+#
+# Init temporary scripts for the current menu.
+#
+function menu_name () {
+ echo -ne "$DIALOG --title '$1'\
+ --backtitle '$backtitle' \
+ --menu '$menu_instructions' \
+ 21 75 11 '$default' " >submenu
+ >radiolists
+}
+
+#
+# Additional comments are currently semi-supported
+#
+function comment () {
+ if [ "$comments_ok" ]
+ then
+ $DIALOG --backtitle "$backtitle" --msgbox "$*" 7 70
+ comments_ok=
+ fi
+}
+
+#
+# Don't need this yet, but we don't want to puke either.
+#
+function define_bool () {
+ :
+}
+
+#
+# Add a submenu option to the menu currently under construction.
+#
+function submenu () {
+ echo -ne "'activate_menu $2' '$1 --->' " >>submenu
+}
+
+#
+# This is to handle the Sound configuration.
+#
+function yuck1 () {
+ echo -ne "'clear ; $MAKE $2' '$1' " >>submenu
+}
+
+#
+# Create a boolean (Yes/No) function for our current menu
+# which calls our local bool function.
+#
+function bool () {
+ eval $2=\${$2:-'n'} x=\$$2
+
+ case $x in
+ y|m) yes='ON' no='OFF' flag="*"
+ ;;
+ n) yes='OFF' no='ON' flag=" "
+ ;;
+ esac
+
+ echo -ne "'$2' '($flag) $1' " >>submenu
+
+ echo -e "function $2 () { l_bool '$1' '$yes' '$no' '$2' }\n" \
+ >>radiolists
+}
+
+#
+# Handle a boolean (Yes/No) option.
+#
+function l_bool () {
+ while true
+ do
+ if $DIALOG --title "$1" \
+ --backtitle "$backtitle" \
+ --radiolist "$radiolist_instructions" 12 70 2 \
+ 'y' 'Yes' $2 'n' 'No' $3 2>dialog.out
+ then
+ eval $4=`cat dialog.out`
+ break
+ fi
+
+ help "$1" "$4"
+ done
+ comments_ok=TRUE
+}
+
+#
+# Same as bool() except options are (Module/No)
+#
+function mod_bool () {
+ eval $2=\${$2:-'n'} x=\$$2
+
+ case $x in
+ m) module='ON' no='OFF' flag='M'
+ ;;
+ *) module='OFF' no='ON' flag=' '
+ ;;
+ esac
+
+ echo -ne "'$2' '($flag) $1' " >>submenu
+
+ echo -e "function $2 () { l_mod_bool '$1' '$module' '$no' '$2' }\n" \
+ >>radiolists
+}
+
+#
+# Same as l_bool() except options are (Module/No)
+#
+function l_mod_bool() {
+ while true
+ do
+ if $DIALOG --title "$1" \
+ --backtitle "$backtitle" \
+ --radiolist "$radiolist_instructions" 12 70 2 \
+ 'm' 'Module' $2 'n' 'No' $3 2>dialog.out
+ then
+ eval $4=`cat dialog.out`
+ break
+ fi
+
+ help "$1" "$4"
+ done
+ comments_ok=TRUE
+}
+
+#
+# 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
+ eval $2=\${$2:-'n'} x=\$$2
+
+ case $x in
+ y) yes='ON' no='OFF' module='OFF' flag="*"
+ ;;
+ m) yes='OFF' no='OFF' module='ON' flag="M"
+ ;;
+ *) yes='OFF' no='ON' module='OFF' flag=" "
+ ;;
+ esac
+
+ echo -ne "'$2' '($flag) $1' " >>submenu
+
+ echo -e "
+ function $2 () { \
+ l_tristate '$1' '$yes' '$no' '$module' '$2'
+ }" >>radiolists
+ fi
+}
+
+#
+# Handle a tristate (Yes/No/Module) option.
+#
+function l_tristate () {
+ while true
+ do
+ if $DIALOG --title "$1" \
+ --backtitle "$backtitle" \
+ --radiolist "$radiolist_instructions" 13 70 3 \
+ 'y' 'Yes' $2 'n' 'No' $3 'm' 'Module' $4 \
+ 2>dialog.out
+ then
+ eval $5=`cat dialog.out`
+ break
+ fi
+
+ help "$1" "$5"
+ done
+ comments_ok=TRUE
+}
+
+#
+# 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 () {
+ if [ "$CONFIG_MODULES" != "y" ]
+ then
+ bool "$1" "$2"
+ else
+ if eval [ "_$3" != "_m" ]
+ then
+ tristate "$1" "$2" $3
+ else
+ mod_bool "$1" "$2"
+ fi
+ fi
+}
+
+#
+# Create a function which will call our local int function.
+#
+function int () {
+ eval $2=\${$2:-"$3"} x=\$$2
+
+ echo -ne "'$2' '($x) $1' " >>submenu
+
+ echo -e "function $2 () { l_int '$1' '$2' '$3' '$x' }\n" >>radiolists
+}
+
+#
+# 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" \
+ 15 55 "$4" 2>dialog.out
+ then
+ answer="`cat dialog.out`"
+
+ case "$answer" in
+ [1-9] |\
+ [1-9][0-9] |\
+ [1-9][0-9][0-9] |\
+ [1-9][0-9][0-9][0-9] |\
+ [1-9][0-9][0-9][0-9][0-9])\
+ eval $2="$answer"
+ ;;
+ *) eval $2="$3"
+ echo -en "\007"
+ ${DIALOG} --backtitle "$backtitle" \
+ --infobox "You have made an invalid entry." 3 43
+ sleep 2
+ ;;
+ esac
+
+ break
+ fi
+
+ help "$1" "$2"
+ done
+ comments_ok=TRUE
+}
+
+
+#
+# Create a function which will call our local int function.
+#
+function hex () {
+ eval $2=\${$2:-"$3"} x=\${$2#*[x,X]}
+
+ echo -ne "'$2' '($x) $1' " >>submenu
+
+ echo -e "function $2 () { l_hex '$1' '$2' '$3' '$x' }\n" >>radiolists
+}
+
+#
+# Create a dialog for entering a hexidecimal into a kernel option.
+#
+function l_hex () {
+ while true
+ do
+ if $DIALOG --title "$1" \
+ --backtitle "$backtitle" \
+ --inputbox "$inputbox_instructions_hex" \
+ 15 55 "$4" 2>dialog.out
+ then
+ answer="`cat dialog.out`"
+ answer="${answer#*[x,X]}"
+
+ case "$answer" in
+ [0-9,a-f,A-F] |\
+ [0-9,a-f,A-F][0-9,a-f,A-F] |\
+ [0-9,a-f,A-F][0-9,a-f,A-F][0-9,a-f,A-F] |\
+ [0-9,a-f,A-F][0-9,a-f,A-F][0-9,a-f,A-F][0-9,a-f,A-F])\
+ eval $2="$answer"
+ ;;
+ *) eval $2="$3"
+ echo -en "\007"
+ ${DIALOG} --backtitle "$backtitle" \
+ --infobox "You have made an invalid entry." 3 43
+ sleep 2
+ ;;
+ esac
+
+ break
+ fi
+
+ help "$1" "$2"
+ done
+ comments_ok=TRUE
+}
+
+#
+# Create a function which will call our local One-of-Many choice list.
+#
+function choice () {
+ #
+ # Need to remember params cause the'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' " >>submenu
+
+ echo -e "
+ function $firstchoice () {
+ l_choice '$title' \"$choices\" $current
+ }\n" >>radiolists
+}
+
+
+function l_choice () {
+ #
+ # Need to remember params cause the're gonna get reset.
+ #
+ title="$1"
+ choices="$2"
+ current="$3"
+
+ #
+ # Scan current value of choices and set radiolist switches.
+ #
+ list=
+ set -- $choices
+ firstchoice=$2
+ while [ -n "$2" ]
+ do
+ case "$1" in
+ "$current") list="$list $2 $1 ON " ;;
+ *) list="$list $2 $1 OFF " ;;
+ esac
+
+ shift ; shift
+ done
+
+ while true
+ do
+ if $DIALOG --title "$title" \
+ --backtitle "$backtitle" \
+ --radiolist "$radiolist_instructions" \
+ 22 70 11 $list 2>dialog.out
+ then
+ choice=`cat dialog.out`
+ break
+ fi
+
+ help "$title" "$firstchoice"
+ done
+
+ #
+ # Now set the boolean value of each option base 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
+ comments_ok=TRUE
+}
+
+
+#
+# Now parse the configuration files and create our mini scripts.
+# Each script represents a separate menu which when taken together
+# form a linked menu tree. Since one configuration file
+# may source another elsewhere in the kernel source tree, this
+# function is recursive.
+#
+function parse_config_files () {
+ while read command args
+ do
+ if [ "$command" != "comment" -a "$in_a_comment" ]
+ then
+ in_a_comment=
+ echo >>$submenu
+ fi
+
+ case $command in
+
+ #
+ # Will it ever happen that mainmenu_option will be followed
+ # by anything other then "next_comment"? This assumes not..
+ #
+ mainmenu_option)
+ comment_is_option=TRUE
+ ;;
+
+ comment)
+ if [ "$comment_is_option" ]
+ then
+ comment_is_option=
+
+ stack="$submenu$stack"
+
+ menu_no=$[menu_no + 1]
+ x="submenu$menu_no"
+
+ echo "submenu $args $x" >> $submenu
+
+ submenu=$x
+ echo menu_name $args >$submenu
+
+ elif [ "$in_a_comment" ]
+ then
+ echo -n $args >> $submenu
+ else
+ in_a_comment=TRUE
+ echo -n comment $args >> $submenu
+ fi
+ ;;
+
+ endmenu)
+ submenu="${stack%%*}"
+ stack="${stack#*}"
+ ;;
+
+ mainmenu_name)
+ echo menu_name "'Main Menu'" > submenu0
+ ;;
+
+ \$MAKE) echo "yuck1 'Configure (You must do this!)' '$args'"\
+ >>$submenu
+ ;;
+
+ source)
+ parse_config_files "$args"
+ ;;
+
+ '#'|'') : ;;
+
+ *) echo $command $args >> $submenu
+ ;;
+ esac
+ done < $1
+}
+
+#
+# This is the menu tree's bootstrap.
+#
+# Executes a mini script to create a set of functions, one per configuration
+# option. These functions will in turn execute dialog commands or recursively
+# call other mini scripts.
+#
+function activate_menu () {
+ comments_ok=
+
+ while true
+ do
+ $1 "$default" #Create the radiolists and dialog cmd
+ . radiolists #Read in the dialog functions.
+
+ . submenu 2>dialog.out #Activate this menu
+
+ case "$?" in
+ 0)
+ defaults="`cat dialog.out`$defaults" #pseudo stack
+ source dialog.out
+ default="${defaults%%*}" defaults="${defaults#*}"
+ ;;
+ 2)
+ read selection <dialog.out
+ default="${selection##* }"
+ case "$selection" in
+ *"-->"*) : ;;
+ *) eval help $selection ;;
+ esac
+ ;;
+ 255|1)
+ break
+ ;;
+ esac
+ done
+}
+
+#
+# Just what it says.
+#
+save_configuration () {
+ ${DIALOG} --backtitle "$backtitle" \
+ --infobox "Saving your new kernel configuration..." 3 43
+
+ #
+ # Now, let's redefine the configuration functions for final
+ # output to the config files.
+ #
+ function bool () {
+ eval define_bool "$2" "\${$2:-n}"
+ }
+
+ function tristate () {
+ eval define_bool "$2" "\${$2:-n}"
+ }
+
+ function dep_tristate () {
+ eval x=\${$2:-n}
+ if eval [ "_$3" != "_m" ]
+ then
+ tristate "$1" "$2"
+ else
+ if [ "$x" = "y" ]
+ then
+ x="m"
+ fi
+ define_bool "$2" "$x"
+ fi
+ }
+
+ function int () {
+ eval x=\${$2:-"$3"}
+ echo "$2=$x" >>$CONFIG
+ echo "#define $2 ($x)" >>$CONFIG_H
+ }
+
+ function hex () {
+ eval x=\${$2:-"$3"}
+ echo "$2=$x" >>$CONFIG
+ echo "#define $2 0x${x#*[x,X]}" >>$CONFIG_H
+ }
+
+ function define_bool () {
+ 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
+ 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=
+
+ 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}
+
+ #
+ # Then extract the actual option from the list of choices.
+ #
+ current=${choices#*$current} ; set $current
+
+ define_bool "$1" "y"
+ }
+
+ 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
+ }
+
+ #
+ # This will hopfully prevent the sound configuration from
+ # running again. (blagh!)
+ #
+ MAKE=:
+
+ 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
+
+ . $CONFIG_IN
+
+ if [ -f .config ]
+ then
+ rm -f .config.old
+ mv .config .config.old
+ fi
+ mv .tmpconfig .config
+ mv .tmpconfig.h include/linux/autoconf.h
+}
+
+#
+# Remove temporary files
+#
+cleanup () {
+ cleanup1
+ cleanup2
+}
+
+cleanup1 () {
+ rm -f submenu* radiolists dialog.out help.out
+}
+
+cleanup2 () {
+ rm -f .tmpconfig .tmpconfig.h
+}
+
+
+menu_instructions="\
+Arrow keys navigate the menu. \
+Highlighted letters are shortcuts. \
+Select an item with <Space Bar> or <Enter>. \
+When finished press <E> or <X> or <Esc>. \
+(*) indicates an option will be compiled into the kernel. \
+(M) indicates an option will be compiled as a module."
+
+radiolist_instructions="\
+Use the arrow keys to navigate this radiolist or \
+press the first letter of the item you wish to select \
+followed by the <SPACE BAR>.
+Press <H> for additional information about this option."
+
+inputbox_instructions_int="\
+Please enter a decimal value between 1 and 9999. \
+Fractions will not be accepted. \
+Use the <TAB> key to move from the input field to buttons below it."
+
+inputbox_instructions_hex="\
+Please enter a hexidecimal value. \
+Use the <TAB> key to move from the input field to buttons below it."
+
+backtitle="Linux Kernel Configuration"
+
+DIALOG="./scripts/lxdialog/lxdialog"
+
+comment_is_option=
+in_a_comment=
+comments_ok=
+menu_no=0
+submenu=submenu0
+kernel_version="${VERSION}.${PATCHLEVEL}.${SUBLEVEL}"
+
+trap "cleanup ; rm -f .menuconfig.in ; exit 1" 1 2 15
+
+#
+# Locate default files.
+#
+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
+else
+ echo "#"
+ echo "# No defaults found"
+ echo "#"
+fi
+
+
+#
+# Convert the configuration files into our mini scripts.
+# Then put all the mini scripts into a single file which should
+# stick around and act as a cache until the kernel release changes
+# or "make mrproper".
+#
+if [ -e .menuconfig.in ]
+then
+ read x <.menuconfig.in
+ if [ "$x" != "# $kernel_version" ]
+ then
+ rm -f .menuconfig.in
+ fi
+fi
+
+if [ ! -e .menuconfig.in ]
+then
+ $DIALOG --backtitle "$backtitle" \
+ --infobox "Compiling configuration script..." 3 40
+
+ rm -f submenu*
+ parse_config_files $CONFIG_IN
+
+ #
+ # For handling Sound configuration. (Yuk!)
+ #
+ echo '$MAKE $*' >submenu999
+
+ echo "# $kernel_version" >.menuconfig.in
+
+ for i in submenu*
+ do
+ echo "function $i () {"
+ echo 'default=$1'
+ cat $i
+ echo -e "}\n\n"
+ done >> .menuconfig.in
+
+ rm -f submenu*
+fi
+
+source .menuconfig.in
+
+#
+# Start the ball rolling from the top.
+#
+activate_menu submenu0
+
+#
+# We're done with the menu scripts. Get rid of them.
+#
+cleanup1
+
+#
+# Confirm and Save
+#
+if $DIALOG --backtitle "$backtitle" \
+ --yesno "Do you wish to save your new kernel configuration?" 5 60
+
+then
+ save_configuration
+
+ $DIALOG --backtitle "$backtitle" --infobox "\
+The linux kernel is now hopefully configured for your setup. \
+Check the top-level Makefile for additional configuration, \
+and do a 'make dep ; make clean' if you want to be sure all \
+the files are correctly re-made." 7 60
+else
+ $DIALOG --backtitle "$backtitle" \
+ --infobox "Your new configuration was not saved." 3 42
+
+fi
+
+
+exit 0
+
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov
with Sam's (original) version of this