The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/scripts/Menuconfig

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 #! /bin/sh
    2 #
    3 # This script is used to configure the linux kernel.
    4 #
    5 # It was inspired by a desire to not have to hit <enter> 9 million times
    6 # or startup the X server just to change a single kernel parameter.  
    7 #
    8 # This script attempts to parse the configuration files, which are
    9 # scattered throughout the kernel source tree, and creates a temporary
   10 # set of mini scripts which are in turn used to create nested menus and
   11 # radiolists.
   12 #
   13 # It uses a very modified/mutilated version of the "dialog" utility
   14 # written by Savio Lam (lam836@cs.cuhk.hk). Savio is not responsible
   15 # for this script or the version of dialog used by this script.
   16 # Please do not contact him with questions. The official version of 
   17 # dialog is available at sunsite.unc.edu or a sunsite mirror.
   18 #
   19 # Portions of this script were borrowed from the original Configure
   20 # script.
   21 #
   22 # William Roadcap was the original author of Menuconfig.
   23 # Michael Elizabeth Chastain (mec@shout.net) is the current maintainer.
   24 #
   25 # 070497 Bernhard Kaindl (bkaindl@netway.at) - get default values for
   26 # new bool, tristate and dep_tristate parameters from the defconfig file.
   27 # new configuration parameters are marked with '(NEW)' as in make config.
   28 #
   29 # 180697 Bernhard Kaindl (bkaindl@netway.at) - added the needed support
   30 # for string options. They are handled like the int and hex options.
   31 #
   32 # 081297 Pavel Machek (pavel@atrey.karlin.mff.cuni.cz) - better error 
   33 # handling
   34 #
   35 # 131197 Michael Chastain (mec@shout.net) - output all lines for a
   36 # choice list, not just the selected one.  This makes the output
   37 # the same as Configure output, which is important for smart config
   38 # dependencies.
   39 #
   40 # 101297 Michael Chastain (mec@shout.net) - remove sound driver cruft.
   41 #
   42 # 221297 Michael Chastain (mec@shout.net) - make define_bool actually
   43 # define its arguments so that later tests on them work right.
   44 #
   45 # 160198 Michael Chastain (mec@shout.net) - fix bug with 'c' command
   46 # (complement existing value) when used on virgin uninitialized variables.
   47 #
   48 # 090398 Axel Boldt (boldt@math.ucsb.edu) - allow for empty lines in help
   49 # texts.
   50 #
   51 # 12 Dec 1998, Michael Elizabeth Chastain (mec@shout.net)
   52 # Remove a /tmp security hole in get_def (also makes it faster).
   53 # Give uninitialized variables canonical values rather than null value.
   54 # Change a lot of places to call set_x_info uniformly.
   55 # Take out message about preparing version (old sound driver cruft).
   56 #
   57 # 13 Dec 1998, Riley H Williams <Riley@Williams.Name>
   58 # When an error occurs, actually display the error message as well as
   59 # our comments thereon.
   60 #
   61 # 31 Dec 1998, Michael Elizabeth Chastain (mec@shout.net)
   62 # Fix mod_bool to honor $CONFIG_MODULES.
   63 # Fix dep_tristate to call define_bool when dependency is "n".
   64 #
   65 # 02 January 1999, Michael Elizabeth Chastain (mec@shout.net)
   66 # Blow away lxdialog.scrltmp on entry to activate_menu.  This protects
   67 # against people who use commands like ' ' to select menus.
   68 #
   69 # 24 January 1999, Michael Elizabeth Chastain, <mec@shout.net>
   70 # - Improve the exit message (Jeff Ronne).
   71 #
   72 # 06 July 1999, Andrzej M. Krzysztofowicz, <ankry@mif.pg.gda.pl>
   73 # - Support for multiple conditions in dep_tristate().
   74 # - Implemented new functions: define_tristate(), define_int(), define_hex(),
   75 #   define_string(), dep_bool().
   76 #
   77 # 12 November 2001, Keith Owens <kaos@ocs.com.au>
   78 # Escape double quotes on eval so the quotes are still there on the second
   79 # evaluation, required to handle strings with special characters.
   80 # 
   81 
   82 
   83 #
   84 # Change this to TRUE if you prefer all kernel options listed
   85 # in a single menu rather than the standard menu hierarchy.
   86 #
   87 single_menu_mode=
   88 
   89 #
   90 # Make sure we're really running bash.
   91 #
   92 [ -z "$BASH" ] && { echo "Menuconfig requires bash" 1>&2; exit 1; }
   93 
   94 #
   95 # Cache function definitions, turn off posix compliance
   96 #
   97 set -h +o posix
   98 
   99 
  100 
  101 # Given a configuration variable, set the global variable $x to its value,
  102 # and the global variable $info to the string " (NEW)" if this is a new
  103 # variable.
  104 #
  105 # This function looks for: (1) the current value, or (2) the default value
  106 # from the arch-dependent defconfig file, or (3) a default passed by the caller.
  107 
  108 function set_x_info () {
  109     eval x=\$$1
  110     if [ -z "$x" ]; then
  111         eval `sed -n -e 's/# \(.*\) is not set.*/\1=n/' -e "/^$1=/p" arch/$ARCH/defconfig`
  112         eval x=\${$1:-\"$2\"}
  113         eval $1=$x
  114         eval INFO_$1="' (NEW)'"
  115     fi
  116     eval info=\"\$INFO_$1\"
  117 }
  118 
  119 #
  120 # Load the functions used by the config.in files.
  121 #
  122 # I do this because these functions must be redefined depending
  123 # on whether they are being called for interactive use or for
  124 # saving a configuration to a file.
  125 #
  126 # Thank the heavens bash supports nesting function definitions.
  127 #
  128 load_functions () {
  129 
  130 #
  131 # Additional comments
  132 #
  133 function comment () {
  134         comment_ctr=$[ comment_ctr + 1 ]
  135         echo -ne "': $comment_ctr' '--- $1' " >>MCmenu
  136 }
  137 
  138 #
  139 # Define a boolean to a specific value.
  140 #
  141 function define_bool () {
  142         eval $1=$2
  143 }
  144 
  145 function define_tristate () {
  146         eval $1=$2
  147 }
  148 
  149 function define_hex () {
  150         eval $1=$2
  151 }
  152 
  153 function define_int () {
  154         eval $1=$2
  155 }
  156 
  157 function define_string () {
  158         eval $1=\"$2\"
  159 }
  160 
  161 #
  162 # Create a boolean (Yes/No) function for our current menu
  163 # which calls our local bool function.
  164 #
  165 function bool () {
  166         set_x_info "$2" "n"
  167 
  168         case $x in
  169         y|m)    flag="*" ;;
  170         n)      flag=" " ;;
  171         esac
  172 
  173         echo -ne "'$2' '[$flag] $1$info' " >>MCmenu
  174 
  175         echo -e "function $2 () { l_bool '$2' \"\$1\" ;}\n" >>MCradiolists
  176 }
  177 
  178 #
  179 # Create a tristate (Yes/No/Module) radiolist function
  180 # which calls our local tristate function.
  181 #
  182 # Collapses to a boolean (Yes/No) if module support is disabled.
  183 #
  184 function tristate () {
  185         if [ "$CONFIG_MODULES" != "y" ]
  186         then
  187                 bool "$1" "$2"
  188         else
  189                 set_x_info "$2" "n"
  190         
  191                 case $x in
  192                 y) flag="*" ;;
  193                 m) flag="M" ;;
  194                 *) flag=" " ;;
  195                 esac
  196         
  197                 echo -ne "'$2' '<$flag> $1$info' " >>MCmenu
  198         
  199                 echo -e "
  200                 function $2 () { l_tristate '$2' \"\$1\" ;}" >>MCradiolists
  201         fi
  202 }
  203 
  204 #
  205 # Create a tristate radiolist function which is dependent on
  206 # another kernel configuration option.
  207 #
  208 # Quote from the original configure script:
  209 #
  210 #       If the option we depend upon is a module,
  211 #       then the only allowable options are M or N.  If Y, then
  212 #       this is a normal tristate.  This is used in cases where modules
  213 #       are nested, and one module requires the presence of something
  214 #       else in the kernel.
  215 #
  216 function dep_tristate () {
  217         ques="$1"
  218         var="$2"
  219         dep=y
  220         shift 2
  221         while [ $# -gt 0 ]; do
  222                 if   [ "$1" = y ]; then
  223                         shift
  224                 elif [ "$1" = m ]; then
  225                         dep=m
  226                         shift
  227                 else
  228                         dep=n
  229                         shift $#
  230                 fi
  231         done
  232         if [ "$dep" = y ]; then
  233             tristate "$ques" "$var"
  234         elif [ "$dep" = m ]; then
  235             mod_bool "$ques" "$var"
  236         else 
  237             define_tristate "$var" n
  238         fi
  239 }
  240 
  241 #
  242 #   Same as above, but now only Y and N are allowed as dependency
  243 #   (i.e. third and next arguments).
  244 #
  245 function dep_bool () {
  246         ques="$1"
  247         var="$2"
  248         dep=y
  249         shift 2
  250         while [ $# -gt 0 ]; do
  251                 if [ "$1" = y ]; then
  252                         shift
  253                 else
  254                         dep=n
  255                         shift $#
  256                 fi
  257         done
  258         if [ "$dep" = y ]; then
  259             bool "$ques" "$var"
  260         else 
  261             define_bool "$var" n
  262         fi
  263 }
  264 
  265 function dep_mbool () {
  266         ques="$1"
  267         var="$2"
  268         dep=y
  269         shift 2
  270         while [ $# -gt 0 ]; do
  271                 if [ "$1" = y -o "$1" = m ]; then
  272                         shift
  273                 else
  274                         dep=n
  275                         shift $#
  276                 fi
  277         done
  278         if [ "$dep" = y ]; then
  279             bool "$ques" "$var"
  280         else 
  281             define_bool "$var" n
  282         fi
  283 }
  284 
  285 #
  286 # Add a menu item which will call our local int function.
  287 # 
  288 function int () {
  289         set_x_info "$2" "$3"
  290 
  291         echo -ne "'$2' '($x) $1$info' " >>MCmenu
  292 
  293         echo -e "function $2 () { l_int '$1' '$2' '$3' '$x' ;}" >>MCradiolists
  294 }
  295 
  296 #
  297 # Add a menu item which will call our local hex function.
  298 # 
  299 function hex () {
  300         set_x_info "$2" "$3"
  301         x=${x##*[x,X]}
  302 
  303         echo -ne "'$2' '($x) $1$info' " >>MCmenu
  304 
  305         echo -e "function $2 () { l_hex '$1' '$2' '$3' '$x' ;}" >>MCradiolists
  306 }
  307 
  308 #
  309 # Add a menu item which will call our local string function.
  310 # 
  311 function string () {
  312         set_x_info "$2" "$3"
  313 
  314         echo -ne "'$2' '     $1: \"$x\"$info' " >>MCmenu
  315 
  316         echo -e "function $2 () { l_string '$1' '$2' '$3' '$x' ;}" >>MCradiolists
  317 }
  318 
  319 #
  320 # Add a menu item which will call our local One-of-Many choice list.
  321 #
  322 function choice () {
  323         #
  324         # Need to remember params cause they're gonna get reset.
  325         #
  326         title=$1
  327         choices=$2
  328         default=$3
  329         current=
  330 
  331         #
  332         # Find out if one of the choices is already set.
  333         # If it's not then make it the default.
  334         #
  335         set -- $choices
  336         firstchoice=$2
  337 
  338         while [ -n "$2" ]
  339         do
  340                 if eval [ \"_\$$2\" = \"_y\" ]
  341                 then
  342                         current=$1
  343                         break
  344                 fi
  345                 shift ; shift
  346         done
  347 
  348         : ${current:=$default}
  349 
  350         echo -ne "'$firstchoice' '($current) $title' " >>MCmenu
  351 
  352         echo -e "
  353         function $firstchoice () \
  354                 { l_choice '$title' \"$choices\" \"$current\" ;}" >>MCradiolists
  355 }
  356 
  357 } # END load_functions()
  358 
  359 
  360 
  361 
  362 
  363 #
  364 # Extract available help for an option from Configure.help
  365 # and send it to standard output.
  366 #
  367 # Most of this function was borrowed from the original kernel
  368 # Configure script.
  369 #
  370 function extract_help () {
  371   if [ -f Documentation/Configure.help ]
  372   then
  373      #first escape regexp special characters in the argument:
  374      var=$(echo "$1"|sed 's/[][\/.^$*]/\\&/g')
  375      #now pick out the right help text:
  376      text=$(sed -n "/^$var[     ]*\$/,\${
  377                         /^$var[         ]*\$/c\\
  378 ${var}:\\
  379 
  380                         /^#/b
  381                         /^[^    ]/q
  382                         s/^  //
  383                         /<file:\\([^>]*\\)>/s//\\1/g
  384                         p
  385                     }" Documentation/Configure.help)
  386 
  387      if [ -z "$text" ]
  388      then
  389           echo "There is no help available for this kernel option."
  390           return 1
  391      else
  392           echo "$text"
  393      fi
  394   else
  395          echo "There is no help available for this kernel option."
  396          return 1
  397   fi
  398 }
  399 
  400 #
  401 # Activate a help dialog.
  402 #
  403 function help () {
  404         if extract_help $1 >help.out
  405         then
  406                 $DIALOG --backtitle "$backtitle" --title "$2"\
  407                         --textbox help.out $ROWS $COLS
  408         else
  409                 $DIALOG --backtitle "$backtitle" \
  410                         --textbox help.out $ROWS $COLS
  411         fi
  412         rm -f help.out
  413 }
  414 
  415 #
  416 # Show the README file.
  417 #
  418 function show_readme () {
  419         $DIALOG --backtitle "$backtitle" \
  420                 --textbox scripts/README.Menuconfig $ROWS $COLS
  421 }
  422 
  423 #
  424 # Begin building the dialog menu command and Initialize the 
  425 # Radiolist function file.
  426 #
  427 function menu_name () {
  428         echo -ne "$DIALOG --title '$1'\
  429                         --backtitle '$backtitle' \
  430                         --menu '$menu_instructions' \
  431                         $ROWS $COLS $((ROWS-10)) \
  432                         '$default' " >MCmenu
  433         >MCradiolists
  434 }
  435 
  436 #
  437 # Add a submenu option to the menu currently under construction.
  438 #
  439 function submenu () {
  440         echo -ne "'activate_menu $2' '$1  --->' " >>MCmenu
  441 }
  442 
  443 #
  444 # Handle a boolean (Yes/No) option.
  445 #
  446 function l_bool () {
  447         if [ -n "$2" ]
  448         then
  449                 case "$2" in
  450                 y|m)    eval $1=y ;;
  451                 c)      eval x=\$$1
  452                         case $x in
  453                         y) eval $1=n ;;
  454                         n) eval $1=y ;;
  455                         *) eval $1=y ;;
  456                         esac ;;
  457                 *)      eval $1=n ;;
  458                 esac
  459         else
  460                 echo -ne "\007"
  461         fi
  462 }
  463 
  464 #
  465 # Same as bool() except options are (Module/No)
  466 #
  467 function mod_bool () {
  468         if [ "$CONFIG_MODULES" != "y" ]; then
  469             define_bool "$2" "n"
  470         else
  471             set_x_info "$2" "n"
  472  
  473             case $x in
  474             y|m) flag='M' ;;
  475             *)   flag=' ' ;;
  476             esac
  477  
  478             echo -ne "'$2' '<$flag> $1$info' " >>MCmenu
  479  
  480             echo -e "function $2 () { l_mod_bool '$2' \"\$1\" ;}" >>MCradiolists
  481         fi
  482 }
  483 
  484 #
  485 # Same as l_bool() except options are (Module/No)
  486 #
  487 function l_mod_bool() {
  488         if [ -n "$2" ]
  489         then
  490                 case "$2" in
  491                 y)      echo -en "\007"
  492                         ${DIALOG} --backtitle "$backtitle" \
  493                                   --infobox "\
  494 This feature depends on another which has been configured as a module.  \
  495 As a result, this feature will be built as a module." 4 70
  496                         sleep 5
  497                         eval $1=m ;;
  498                 m)      eval $1=m ;;
  499                 c)      eval x=\$$1
  500                         case $x in
  501                         m) eval $1=n ;;
  502                         n) eval $1=m ;;
  503                         *) eval $1=m ;;
  504                         esac ;;
  505                 *)      eval $1=n ;;
  506                 esac
  507         else
  508                 echo -ne "\007"
  509         fi
  510 }
  511 
  512 #
  513 # Handle a tristate (Yes/No/Module) option.
  514 #
  515 function l_tristate () {
  516         if [ -n "$2" ]
  517         then
  518                 eval x=\$$1
  519 
  520                 case "$2" in
  521                 y) eval $1=y ;;
  522                 m) eval $1=m ;;
  523                 c) eval x=\$$1
  524                    case $x in
  525                    y) eval $1=n ;;
  526                    n) eval $1=m ;;
  527                    m) eval $1=y ;;
  528                    *) eval $1=y ;;
  529                    esac ;;
  530                 *) eval $1=n ;;
  531                 esac
  532         else
  533                 echo -ne "\007"
  534         fi
  535 }
  536 
  537 #
  538 # Create a dialog for entering an integer into a kernel option.
  539 #
  540 function l_int () {
  541         while true
  542         do
  543                 if $DIALOG --title "$1" \
  544                         --backtitle "$backtitle" \
  545                         --inputbox "$inputbox_instructions_int" \
  546                         10 75 "$4" 2>MCdialog.out
  547                 then
  548                         answer="`cat MCdialog.out`"
  549                         answer="${answer:-$3}"
  550 
  551                         # Semantics of + and ? in GNU expr changed, so
  552                         # we avoid them:
  553                         if expr "$answer" : '0$' '|' "$answer" : '[1-9][0-9]*$' '|' "$answer" : '-[1-9][0-9]*$' >/dev/null
  554                         then
  555                                 eval $2=\"$answer\"
  556                         else
  557                                 eval $2=\"$3\"
  558                                 echo -en "\007"
  559                                 ${DIALOG} --backtitle "$backtitle" \
  560                                         --infobox "You have made an invalid entry." 3 43
  561                                 sleep 2
  562                         fi
  563 
  564                         break
  565                 fi
  566 
  567                 help "$2" "$1"
  568         done
  569 }
  570 
  571 #
  572 # Create a dialog for entering a hexadecimal into a kernel option.
  573 #
  574 function l_hex () {
  575         while true
  576         do
  577                 if $DIALOG --title "$1" \
  578                         --backtitle "$backtitle" \
  579                         --inputbox "$inputbox_instructions_hex" \
  580                         10 75 "$4" 2>MCdialog.out
  581                 then
  582                         answer="`cat MCdialog.out`"
  583                         answer="${answer:-$3}"
  584                         answer="${answer##*[x,X]}"
  585 
  586                         if expr "$answer" : '[0-9a-fA-F][0-9a-fA-F]*$' >/dev/null
  587                         then
  588                                 eval $2=\"$answer\"
  589                         else
  590                                 eval $2=\"$3\"
  591                                 echo -en "\007"
  592                                 ${DIALOG} --backtitle "$backtitle" \
  593                                         --infobox "You have made an invalid entry." 3 43
  594                                 sleep 2
  595                         fi
  596 
  597                         break
  598                 fi
  599 
  600                 help "$2" "$1"
  601         done
  602 }
  603 
  604 #
  605 # Create a dialog for entering a string into a kernel option.
  606 #
  607 function l_string () {
  608         while true
  609         do
  610                 if $DIALOG --title "$1" \
  611                         --backtitle "$backtitle" \
  612                         --inputbox "$inputbox_instructions_string" \
  613                         10 75 "$4" 2>MCdialog.out
  614                 then
  615                         answer="`cat MCdialog.out`"
  616                         answer="${answer:-$3}"
  617 
  618                         #
  619                         # Someone may add a nice check for the entered
  620                         # string here...
  621                         #
  622                         eval $2=\"$answer\"
  623 
  624                         break
  625                 fi
  626 
  627                 help "$2" "$1"
  628         done
  629 }
  630 
  631 
  632 #
  633 # Handle a one-of-many choice list.
  634 #
  635 function l_choice () {
  636         #
  637         # Need to remember params cause they're gonna get reset.
  638         #
  639         title="$1"
  640         choices="$2"
  641         current="$3"
  642         chosen=
  643 
  644         #
  645         # Scan current value of choices and set radiolist switches.
  646         #
  647         list=
  648         set -- $choices
  649         firstchoice=$2
  650         while [ -n "$2" ]
  651         do
  652                 case "$1" in
  653                 "$current"*)    if [ -z "$chosen" ]; then
  654                                         list="$list $2 $1 ON "
  655                                         chosen=1
  656                                 else
  657                                         list="$list $2 $1 OFF "
  658                                 fi  ;;
  659                 *)              list="$list $2 $1 OFF " ;;
  660                 esac
  661                         
  662                 shift ; shift
  663         done
  664 
  665         while true
  666         do
  667                 if $DIALOG --title "$title" \
  668                         --backtitle "$backtitle" \
  669                         --radiolist "$radiolist_instructions" \
  670                         15 70 6 $list 2>MCdialog.out
  671                 then
  672                         choice=`cat MCdialog.out`
  673                         break
  674                 fi
  675 
  676                 help "$firstchoice" "$title"
  677         done
  678 
  679         #
  680         # Now set the boolean value of each option based on
  681         # the selection made from the radiolist.
  682         #
  683         set -- $choices
  684         while [ -n "$2" ]
  685         do
  686                 if [ "$2" = "$choice" ]
  687                 then
  688                         eval $2=\"y\"
  689                 else
  690                         eval $2=\"n\"
  691                 fi
  692                 
  693                 shift ; shift
  694         done
  695 }
  696 
  697 #
  698 # Call awk, and watch for error codes, etc.
  699 #
  700 function callawk () {
  701 awk "$1" || { echo "Awk died with error code $?. Giving up."; exit 1; }
  702 }
  703 
  704 #
  705 # A faster awk based recursive parser. (I hope)
  706 #
  707 function parser1 () {
  708 callawk '
  709 BEGIN {
  710         menu_no = 0
  711         comment_is_option = 0
  712         parser("'$CONFIG_IN'","MCmenu0")
  713 }
  714 
  715 function parser(ifile,menu) {
  716 
  717         while (getline <ifile) {
  718                 if ($1 == "mainmenu_option") {
  719                         comment_is_option = "1"
  720                 }
  721                 else if ($1 == "comment" && comment_is_option == "1") {
  722                         comment_is_option= "0"
  723                         sub($1,"",$0)
  724                         ++menu_no
  725 
  726                         printf("submenu %s MCmenu%s\n", $0, menu_no) >>menu
  727 
  728                         newmenu = sprintf("MCmenu%d", menu_no);
  729                         printf( "function MCmenu%s () {\n"\
  730                                 "default=$1\n"\
  731                                 "menu_name %s\n",\
  732                                  menu_no, $0) >newmenu
  733 
  734                         parser(ifile, newmenu)
  735                 }
  736                 else if ($0 ~ /^#|\$MAKE|mainmenu_name/) {
  737                         printf("") >>menu
  738                 }
  739                 else if ($1 ~ "endmenu") {
  740                         printf("}\n") >>menu
  741                         return
  742                 } 
  743                 else if ($1 == "source") {
  744                         parser($2,menu)
  745                 }
  746                 else {
  747                         print >>menu
  748                 }
  749         }
  750 }'
  751 }
  752 
  753 #
  754 # Secondary parser for single menu mode.
  755 #
  756 function parser2 () {
  757 callawk '
  758 BEGIN {
  759         parser("'$CONFIG_IN'","MCmenu0")
  760 }
  761 
  762 function parser(ifile,menu) {
  763 
  764         while (getline <ifile) {
  765                 if ($0 ~ /^#|$MAKE|mainmenu_name/) {
  766                         printf("") >>menu
  767                 }
  768                 else if ($1 ~ /mainmenu_option|endmenu/) {
  769                         printf("") >>menu
  770                 } 
  771                 else if ($1 == "source") {
  772                         parser($2,menu)
  773                 }
  774                 else {
  775                         print >>menu
  776                 }
  777         }
  778 }'
  779 }
  780 
  781 #
  782 # Parse all the config.in files into mini scripts.
  783 #
  784 function parse_config_files () {
  785         rm -f MCmenu*
  786 
  787         echo "function MCmenu0 () {" >MCmenu0
  788         echo 'default=$1' >>MCmenu0
  789         echo "menu_name 'Main Menu'" >>MCmenu0
  790 
  791         if [ "_$single_menu_mode" = "_TRUE" ]
  792         then
  793                 parser2
  794         else
  795                 parser1
  796         fi
  797 
  798         echo "comment ''"       >>MCmenu0
  799         echo "g_alt_config"     >>MCmenu0
  800         echo "s_alt_config"     >>MCmenu0
  801 
  802         echo "}" >>MCmenu0
  803 
  804         #
  805         # These mini scripts must be sourced into the current
  806         # environment in order for all of this to work.  Leaving
  807         # them on the disk as executables screws up the recursion
  808         # in activate_menu(), among other things.  Once they are
  809         # sourced we can discard them.
  810         #
  811         for i in MCmenu*
  812         do
  813                 echo -n "."
  814                 source ./$i
  815         done
  816         rm -f MCmenu*
  817 }
  818 
  819 #
  820 # This is the menu tree's bootstrap.
  821 #
  822 # Executes the parsed menus on demand and creates a set of functions,
  823 # one per configuration option.  These functions will in turn execute
  824 # dialog commands or recursively call other menus.
  825 #
  826 function activate_menu () {
  827         rm -f lxdialog.scrltmp
  828         while true
  829         do
  830                 comment_ctr=0           #So comment lines get unique tags
  831 
  832                 $1 "$default" 2> MCerror #Create the lxdialog menu & functions
  833 
  834                 if [ "$?" != "0" ]
  835                 then
  836                         clear
  837                         cat <<EOM
  838 
  839 Menuconfig has encountered a possible error in one of the kernel's
  840 configuration files and is unable to continue.  Here is the error
  841 report:
  842 
  843 EOM
  844                         sed 's/^/ Q> /' MCerror
  845                         cat <<EOM
  846 
  847 Please report this to the maintainer <mec@shout.net>.  You may also
  848 send a problem report to <linux-kernel@vger.kernel.org>.
  849 
  850 Please indicate the kernel version you are trying to configure and
  851 which menu you were trying to enter when this error occurred.
  852 
  853 EOM
  854                         cleanup
  855                         exit 1
  856                 fi
  857                 rm -f MCerror
  858 
  859                 . ./MCradiolists                #Source the menu's functions
  860 
  861                 . ./MCmenu 2>MCdialog.out       #Activate the lxdialog menu
  862                 ret=$?
  863 
  864                 read selection <MCdialog.out
  865 
  866                 case "$ret" in
  867                 0|3|4|5|6)
  868                         defaults="$selection$defaults"  #pseudo stack
  869                         case "$ret" in
  870                         0) eval $selection   ;;
  871                         3) eval $selection y ;;
  872                         4) eval $selection n ;;
  873                         5) eval $selection m ;;
  874                         6) eval $selection c ;;
  875                         esac
  876                         default="${defaults%%*}" defaults="${defaults#*}"
  877                         ;;
  878                 2)      
  879                         default="${selection%%\ *}"
  880 
  881                         case "$selection" in
  882                         *"-->"*|*"alt_config"*)
  883                                 show_readme ;;
  884                         *)
  885                                 eval help $selection ;;
  886                         esac
  887                         ;;
  888                 255|1)
  889                         break
  890                         ;;
  891                 139)
  892                         stty sane
  893                         clear
  894                         cat <<EOM
  895 
  896 There seems to be a problem with the lxdialog companion utility which is
  897 built prior to running Menuconfig.  Usually this is an indicator that you
  898 have upgraded/downgraded your ncurses libraries and did not remove the 
  899 old ncurses header file(s) in /usr/include or /usr/include/ncurses.
  900 
  901 It is VERY important that you have only one set of ncurses header files
  902 and that those files are properly version matched to the ncurses libraries 
  903 installed on your machine.
  904 
  905 You may also need to rebuild lxdialog.  This can be done by moving to
  906 the /usr/src/linux/scripts/lxdialog directory and issuing the 
  907 "make clean all" command.
  908 
  909 If you have verified that your ncurses install is correct, you may email
  910 the maintainer <mec@shout.net> or post a message to
  911 <linux-kernel@vger.kernel.org> for additional assistance. 
  912 
  913 EOM
  914                         cleanup
  915                         exit 139
  916                         ;;
  917                 esac
  918         done
  919 }
  920 
  921 #
  922 # Create a menu item to load an alternate configuration file.
  923 #
  924 g_alt_config () {
  925         echo -n "get_alt_config 'Load an Alternate Configuration File' "\
  926                 >>MCmenu
  927 }
  928 
  929 #
  930 # Get alternate config file name and load the 
  931 # configuration from it.
  932 #
  933 get_alt_config () {
  934         set -f ## Switch file expansion OFF
  935 
  936         while true
  937         do
  938                 ALT_CONFIG="${ALT_CONFIG:-$DEFAULTS}"
  939 
  940                 $DIALOG --backtitle "$backtitle" \
  941                         --inputbox "\
  942 Enter the name of the configuration file you wish to load.  \
  943 Accept the name shown to restore the configuration you \
  944 last retrieved.  Leave blank to abort."\
  945                         11 55 "$ALT_CONFIG" 2>MCdialog.out
  946 
  947                 if [ "$?" = "0" ]
  948                 then
  949                         ALT_CONFIG=`cat MCdialog.out`
  950 
  951                         [ "_" = "_$ALT_CONFIG" ] && break
  952 
  953                         if eval [ -r \"$ALT_CONFIG\" ]
  954                         then
  955                                 eval load_config_file \"$ALT_CONFIG\"
  956                                 break
  957                         else
  958                                 echo -ne "\007"
  959                                 $DIALOG --backtitle "$backtitle" \
  960                                         --infobox "File does not exist!"  3 38
  961                                 sleep 2
  962                         fi
  963                 else
  964                         cat <<EOM >help.out
  965 
  966 For various reasons, one may wish to keep several different kernel
  967 configurations available on a single machine.  
  968 
  969 If you have saved a previous configuration in a file other than the
  970 kernel's default, entering the name of the file here will allow you
  971 to modify that configuration.
  972 
  973 If you are uncertain, then you have probably never used alternate 
  974 configuration files.  You should therefor leave this blank to abort.
  975 
  976 EOM
  977                         $DIALOG --backtitle "$backtitle"\
  978                                 --title "Load Alternate Configuration"\
  979                                 --textbox help.out $ROWS $COLS
  980                 fi
  981         done
  982 
  983         set +f ## Switch file expansion ON
  984         rm -f help.out MCdialog.out
  985 }
  986 
  987 #
  988 # Create a menu item to store an alternate config file.
  989 #
  990 s_alt_config () {
  991         echo -n "save_alt_config 'Save Configuration to an Alternate File' "\
  992                  >>MCmenu
  993 }
  994 
  995 #
  996 # Get an alternate config file name and save the current
  997 # configuration to it.
  998 #
  999 save_alt_config () {
 1000         set -f  ## Switch file expansion OFF
 1001                         
 1002         while true
 1003         do
 1004                 $DIALOG --backtitle "$backtitle" \
 1005                         --inputbox "\
 1006 Enter a filename to which this configuration should be saved \
 1007 as an alternate.  Leave blank to abort."\
 1008                         10 55 "$ALT_CONFIG" 2>MCdialog.out
 1009 
 1010                 if [ "$?" = "0" ]
 1011                 then
 1012                         ALT_CONFIG=`cat MCdialog.out`
 1013 
 1014                         [ "_" = "_$ALT_CONFIG" ] && break
 1015 
 1016                         if eval touch $ALT_CONFIG 2>/dev/null
 1017                         then
 1018                                 eval save_configuration $ALT_CONFIG
 1019                                 load_functions  ## RELOAD
 1020                                 break
 1021                         else
 1022                                 echo -ne "\007"
 1023                                 $DIALOG --backtitle "$backtitle" \
 1024                                         --infobox "Can't create file!  Probably a nonexistent directory." 3 60
 1025                                 sleep 2
 1026                         fi
 1027                 else
 1028                         cat <<EOM >help.out
 1029 
 1030 For various reasons, one may wish to keep different kernel
 1031 configurations available on a single machine.  
 1032 
 1033 Entering a file name here will allow you to later retrieve, modify
 1034 and use the current configuration as an alternate to whatever 
 1035 configuration options you have selected at that time.
 1036 
 1037 If you are uncertain what all this means then you should probably
 1038 leave this blank.
 1039 EOM
 1040                         $DIALOG --backtitle "$backtitle"\
 1041                                 --title "Save Alternate Configuration"\
 1042                                 --textbox help.out $ROWS $COLS
 1043                 fi
 1044         done
 1045 
 1046         set +f  ## Switch file expansion ON
 1047         rm -f help.out MCdialog.out
 1048 }
 1049 
 1050 #
 1051 # Load config options from a file.
 1052 # Converts all "# OPTION is not set" lines to "OPTION=n" lines
 1053 #
 1054 function load_config_file () {
 1055         awk '
 1056           /# .* is not set.*/ { printf("%s=n\n", $2) }
 1057         ! /# .* is not set.*/ { print }
 1058         ' $1 >.tmpconfig
 1059 
 1060         source ./.tmpconfig
 1061         rm -f .tmpconfig
 1062 }
 1063 
 1064 #
 1065 # Just what it says.
 1066 #
 1067 save_configuration () {
 1068         echo
 1069         echo -n "Saving your kernel configuration."
 1070 
 1071         #
 1072         # Now, let's redefine the configuration functions for final
 1073         # output to the config files.
 1074         #
 1075         # Nested function definitions, YIPEE!
 1076         #
 1077         function bool () {
 1078                 set_x_info "$2" "n"
 1079                 eval define_bool \"$2\" \"$x\"
 1080         }
 1081 
 1082         function tristate () {
 1083                 set_x_info "$2" "n"
 1084                 eval define_tristate \"$2\" \"$x\"
 1085         }
 1086 
 1087         function dep_tristate () {
 1088                 set_x_info "$2" "n"
 1089                 var="$2"
 1090                 shift 2
 1091                 while [ $# -gt 0 ]; do
 1092                         if   [ "$1" = y ]; then
 1093                                 shift
 1094                         elif [ "$1" = m -a "$x" != n ]; then
 1095                                 x=m; shift
 1096                         else 
 1097                                 x=n; shift $#
 1098                         fi
 1099                 done
 1100                 define_tristate "$var" "$x"
 1101         }
 1102 
 1103         function dep_bool () {
 1104                 set_x_info "$2" "n"
 1105                 var="$2"
 1106                 shift 2
 1107                 while [ $# -gt 0 ]; do
 1108                         if   [ "$1" = y ]; then
 1109                                 shift
 1110                         else 
 1111                                 x=n; shift $#
 1112                         fi
 1113                 done
 1114                 define_bool "$var" "$x"
 1115         }
 1116 
 1117         function dep_mbool () {
 1118                 set_x_info "$2" "n"
 1119                 var="$2"
 1120                 shift 2
 1121                 while [ $# -gt 0 ]; do
 1122                         if   [ "$1" = y -o "$1" = m ]; then
 1123                                 shift
 1124                         else 
 1125                                 x=n; shift $#
 1126                         fi
 1127                 done
 1128                 define_bool "$var" "$x"
 1129         }
 1130 
 1131         function int () {
 1132                 set_x_info "$2" "$3"
 1133                 echo "$2=$x"            >>$CONFIG
 1134                 echo "#define $2 ($x)"  >>$CONFIG_H
 1135         }
 1136 
 1137         function hex () {
 1138                 set_x_info "$2" "$3"
 1139                 echo "$2=$x"                     >>$CONFIG
 1140                 echo "#define $2 0x${x##*[x,X]}" >>$CONFIG_H
 1141         }
 1142 
 1143         function string () {
 1144                 set_x_info "$2" "$3"
 1145                 echo "$2=\"$x\""                         >>$CONFIG
 1146                 echo "#define $2 \"$x\""        >>$CONFIG_H
 1147         }
 1148 
 1149         function define_hex () {
 1150                 eval $1=\"$2\"
 1151                 echo "$1=$2"                    >>$CONFIG
 1152                 echo "#define $1 0x${2##*[x,X]}"        >>$CONFIG_H
 1153         }
 1154 
 1155         function define_int () {
 1156                 eval $1=\"$2\"
 1157                 echo "$1=$2"                    >>$CONFIG
 1158                 echo "#define $1 ($2)"          >>$CONFIG_H
 1159         }
 1160 
 1161         function define_string () {
 1162                 eval $1=\"$2\"
 1163                 echo "$1=\"$2\""                >>$CONFIG
 1164                 echo "#define $1 \"$2\""        >>$CONFIG_H
 1165         }
 1166 
 1167         function define_bool () {
 1168                 define_tristate "$1" "$2"
 1169         }
 1170 
 1171         function define_tristate () {
 1172                 eval $1=\"$2\"
 1173 
 1174                 case "$2" in
 1175                 y)
 1176                         echo "$1=y"             >>$CONFIG
 1177                         echo "#define $1 1"     >>$CONFIG_H
 1178                         ;;
 1179 
 1180                 m)
 1181                         if [ "$CONFIG_MODULES" = "y" ]
 1182                         then
 1183                                 echo "$1=m"                >>$CONFIG
 1184                                 echo "#undef  $1"          >>$CONFIG_H
 1185                                 echo "#define $1_MODULE 1" >>$CONFIG_H
 1186                         else
 1187                                 echo "$1=y"             >>$CONFIG
 1188                                 echo "#define $1 1"     >>$CONFIG_H
 1189                         fi
 1190                         ;;
 1191 
 1192                 n)
 1193                         echo "# $1 is not set"  >>$CONFIG
 1194                         echo "#undef  $1"       >>$CONFIG_H
 1195                         ;;
 1196                 esac
 1197         }
 1198 
 1199         function choice () {
 1200                 #
 1201                 # Find the first choice that's already set to 'y'
 1202                 #
 1203                 choices="$2"
 1204                 default="$3"
 1205                 current=
 1206                 chosen=
 1207 
 1208                 set -- $choices
 1209                 while [ -n "$2" ]
 1210                 do
 1211                         if eval [ \"_\$$2\" = \"_y\" ]
 1212                         then
 1213                                 current=$1
 1214                                 break
 1215                         fi
 1216                         shift ; shift
 1217                 done
 1218 
 1219                 #
 1220                 # Use the default if none were set.  
 1221                 #
 1222                 : ${current:=$default}
 1223 
 1224                 #
 1225                 # Output all choices (to be compatible with other configs).
 1226                 #
 1227                 set -- $choices
 1228                 while [ -n "$2" ]
 1229                 do
 1230                         case "$1" in
 1231                         "$current"*)    if [ -z "$chosen" ]; then
 1232                                                 define_bool "$2" "y"
 1233                                                 chosen=1
 1234                                         else
 1235                                                 define_bool "$2" "n"
 1236                                         fi ;;
 1237                         *)              define_bool "$2" "n" ;;
 1238                         esac
 1239                         shift ; shift
 1240                 done
 1241         }
 1242 
 1243         function mainmenu_name () {
 1244                 :
 1245         }
 1246 
 1247         function mainmenu_option () {
 1248                 comment_is_option=TRUE
 1249         }
 1250 
 1251         function endmenu () {
 1252                 :
 1253         }
 1254 
 1255         function comment () {
 1256                 if [ "$comment_is_option" ]
 1257                 then
 1258                         comment_is_option=
 1259                         echo        >>$CONFIG
 1260                         echo "#"    >>$CONFIG
 1261                         echo "# $1" >>$CONFIG
 1262                         echo "#"    >>$CONFIG
 1263 
 1264                         echo         >>$CONFIG_H
 1265                         echo "/*"    >>$CONFIG_H
 1266                         echo " * $1" >>$CONFIG_H
 1267                         echo " */"   >>$CONFIG_H
 1268                 fi
 1269         }
 1270 
 1271         echo -n "."
 1272 
 1273         DEF_CONFIG="${1:-.config}"
 1274         DEF_CONFIG_H="include/linux/autoconf.h"
 1275 
 1276         CONFIG=.tmpconfig
 1277         CONFIG_H=.tmpconfig.h
 1278 
 1279         echo "#" >$CONFIG
 1280         echo "# Automatically generated by make menuconfig: don't edit" >>$CONFIG
 1281         echo "#" >>$CONFIG
 1282 
 1283         echo "/*" >$CONFIG_H
 1284         echo " * Automatically generated by make menuconfig: don't edit" >>$CONFIG_H
 1285         echo " */" >>$CONFIG_H
 1286         echo "#define AUTOCONF_INCLUDED" >> $CONFIG_H
 1287 
 1288         echo -n "."
 1289         if . $CONFIG_IN >>.menuconfig.log 2>&1
 1290         then
 1291                 if [ "$DEF_CONFIG" = ".config" ]
 1292                 then
 1293                         mv $CONFIG_H $DEF_CONFIG_H
 1294                 fi
 1295 
 1296                 if [ -f "$DEF_CONFIG" ]
 1297                 then
 1298                         rm -f ${DEF_CONFIG}.old
 1299                         mv $DEF_CONFIG ${DEF_CONFIG}.old
 1300                 fi
 1301 
 1302                 mv $CONFIG $DEF_CONFIG
 1303                         
 1304                 return 0
 1305         else
 1306                 return 1
 1307         fi
 1308 }
 1309 
 1310 #
 1311 # Remove temporary files
 1312 #
 1313 cleanup () {
 1314         cleanup1
 1315         cleanup2
 1316 }
 1317 
 1318 cleanup1 () {
 1319         rm -f MCmenu* MCradiolists MCdialog.out help.out
 1320 }
 1321 
 1322 cleanup2 () {
 1323         rm -f .tmpconfig .tmpconfig.h
 1324 }
 1325 
 1326 set_geometry () {
 1327         # Some distributions export these with incorrect values
 1328         # which can really screw up some ncurses programs.
 1329         LINES=  COLUMNS=
 1330 
 1331         ROWS=${1:-24}  COLS=${2:-80} 
 1332 
 1333         # Just in case the nasty rlogin bug returns.
 1334         #
 1335         [ $ROWS = 0 ] && ROWS=24
 1336         [ $COLS = 0 ] && COLS=80
 1337 
 1338         if [ $ROWS -lt 19 -o $COLS -lt 80 ]
 1339         then
 1340                 echo -e "\n\007Your display is too small to run Menuconfig!"
 1341                 echo "It must be at least 19 lines by 80 columns."
 1342                 exit 1
 1343         fi 
 1344 
 1345         ROWS=$((ROWS-4))  COLS=$((COLS-5))
 1346 }
 1347 
 1348 
 1349 set_geometry `stty size 2>/dev/null`
 1350 
 1351 menu_instructions="\
 1352 Arrow keys navigate the menu.  \
 1353 <Enter> selects submenus --->.  \
 1354 Highlighted letters are hotkeys.  \
 1355 Pressing <Y> includes, <N> excludes, <M> modularizes features.  \
 1356 Press <Esc><Esc> to exit, <?> for Help.  \
 1357 Legend: [*] built-in  [ ] excluded  <M> module  < > module capable"
 1358 
 1359 radiolist_instructions="\
 1360 Use the arrow keys to navigate this window or \
 1361 press the hotkey of the item you wish to select \
 1362 followed by the <SPACE BAR>.
 1363 Press <?> for additional information about this option."
 1364 
 1365 inputbox_instructions_int="\
 1366 Please enter a decimal value. \
 1367 Fractions will not be accepted.  \
 1368 Use the <TAB> key to move from the input field to the buttons below it."
 1369 
 1370 inputbox_instructions_hex="\
 1371 Please enter a hexadecimal value. \
 1372 Use the <TAB> key to move from the input field to the buttons below it."
 1373 
 1374 inputbox_instructions_string="\
 1375 Please enter a string value. \
 1376 Use the <TAB> key to move from the input field to the buttons below it."
 1377 
 1378 DIALOG="./scripts/lxdialog/lxdialog"
 1379 
 1380 kernel_version="${VERSION}.${PATCHLEVEL}.${SUBLEVEL}${EXTRAVERSION}"
 1381 
 1382 backtitle="Linux Kernel v$kernel_version Configuration"
 1383 
 1384 trap "cleanup ; exit 1" 1 2 15
 1385 
 1386 
 1387 #
 1388 # Locate default files.
 1389 #
 1390 CONFIG_IN=./config.in
 1391 if [ "$1" != "" ] ; then
 1392         CONFIG_IN=$1
 1393 fi
 1394 
 1395 DEFAULTS=arch/$ARCH/defconfig
 1396 if [ -f .config ]; then
 1397   DEFAULTS=.config
 1398 fi
 1399 
 1400 if [ -f $DEFAULTS ]
 1401 then
 1402   echo "Using defaults found in" $DEFAULTS
 1403   load_config_file $DEFAULTS
 1404 else
 1405   echo "No defaults found"
 1406 fi
 1407 
 1408 
 1409 # Fresh new log.
 1410 >.menuconfig.log
 1411 
 1412 # Load the functions used by the config.in files.
 1413 echo -n "Preparing scripts: functions" 
 1414 load_functions
 1415 
 1416 if [ ! -e $CONFIG_IN ]
 1417 then
 1418         echo "Your main config.in file ($CONFIG_IN) does not exist"
 1419         exit 1
 1420 fi
 1421 
 1422 if [ ! -x $DIALOG ]
 1423 then
 1424         echo "Your lxdialog utility does not exist"
 1425         exit 1
 1426 fi
 1427 
 1428 #
 1429 # Read config.in files and parse them into one shell function per menu.
 1430 #
 1431 echo -n ", parsing"
 1432 parse_config_files $CONFIG_IN
 1433 
 1434 echo "done."
 1435 #
 1436 # Start the ball rolling from the top.
 1437 #
 1438 activate_menu MCmenu0
 1439 
 1440 #
 1441 # All done!
 1442 #
 1443 cleanup1
 1444 
 1445 #
 1446 # Confirm and Save
 1447 #
 1448 if $DIALOG --backtitle "$backtitle" \
 1449            --yesno "Do you wish to save your new kernel configuration?" 5 60
 1450 then
 1451         save_configuration
 1452         echo
 1453         echo
 1454         echo "*** End of Linux kernel configuration."
 1455         echo "*** Check the top-level Makefile for additional configuration."
 1456         if [ ! -f .hdepend -o "$CONFIG_MODVERSIONS" = "y" ] ; then
 1457             echo "*** Next, you must run 'make dep'."
 1458         else
 1459             echo "*** Next, you may run 'make bzImage', 'make bzdisk', or 'make install'."
 1460         fi
 1461         echo
 1462 else
 1463         echo
 1464         echo 
 1465         echo Your kernel configuration changes were NOT saved.
 1466         echo
 1467 fi
 1468 
 1469 # Remove log if empty.
 1470 if [ ! -s .menuconfig.log ] ; then
 1471         rm -f .menuconfig.log
 1472 fi
 1473 
 1474 exit 0

Cache object: e227e0b24b88aeab549b52451838a4b6


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.