| #! /bin/sh |
| # |
| # This script is used to configure BusyBox. |
| # |
| # 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 <rhw@memalpha.cx> |
| # 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(). |
| # |
| # 22 October 2001, Erik Andersen <andersee@debian.org> |
| # - Adjusted for busybox (modified hard coded kernel specific paths, |
| # and everything to do with modules (tristates, modbools, etc). |
| |
| |
| # |
| # Change this to TRUE if you prefer all 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" sysdeps/$TARGET_OS/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_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 |
| } |
| |
| # |
| # 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 docs/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 |
| }" docs/Configure.help) |
| |
| if [ -z "$text" ] |
| then |
| echo "There is no help available for this option." |
| return 1 |
| else |
| echo "$text" |
| fi |
| else |
| echo "There is no help available for this 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 "\007" |
| fi |
| } |
| |
| # |
| # Create a dialog for entering an integer into a 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 "\007" |
| ${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 an 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 "\007" |
| ${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 an 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%s\n", $0, menu_no) >>menu |
| |
| newmenu = sprintf("MCmenu%d", menu_no); |
| printf( "function MCmenu%s () {\n"\ |
| "default=$1\n"\ |
| "menu_name %s\n",\ |
| 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 BusyBox'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 <busybox@oss.lineo.com>. |
| |
| Please indicate the BusyBox 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 <andersen@codepoet.org> or post a message to |
| <busybox@oss.lineo.com> 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 "\007" |
| $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 BusyBox |
| configurations available on a single machine. |
| |
| If you have saved a previous configuration in a file other than the |
| busybox 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 "\007" |
| $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 BusyBox |
| 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=n\n", $2) } |
| ! /# .* is not set.*/ { print } |
| ' $1 >.tmpconfig |
| |
| source ./.tmpconfig |
| rm -f .tmpconfig |
| } |
| |
| # |
| # Just what it says. |
| # |
| save_configuration () { |
| echo |
| echo -n "Saving your BusyBox 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 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 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 |
| ;; |
| |
| 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/config.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 "\n\007Your 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. \ |
| Pressing <Enter> selects submenus --->. \ |
| Highlighted letters are hotkeys. \ |
| Pressing <Y> includes, and <N> excludes. \ |
| Press <Esc><Esc> to exit, <?> for Help. \ |
| Legend: [*] built-in [ ] excluded " |
| |
| 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" |
| |
| bb_version="${VERSION}" |
| backtitle="BusyBox v$bb_version Configuration" |
| |
| trap "cleanup ; exit 1" 1 2 15 |
| |
| |
| # |
| # Locate default files. |
| # |
| CONFIG_IN=./config.in |
| if [ "$1" != "" ] ; then |
| CONFIG_IN=$1 |
| fi |
| |
| DEFAULTS=sysdeps/$TARGET_OS/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 BusyBox configuration?" 5 60 |
| then |
| save_configuration |
| echo |
| echo |
| echo "*** End of BusyBox configuration." |
| echo "*** Check the top-level Makefile for additional configuration." |
| if [ ! -f .hdepend ] ; then |
| echo "*** Next, you must run 'make dep'." |
| else |
| echo "*** Next, you should run 'make' or 'make install'." |
| fi |
| echo |
| else |
| echo |
| echo |
| echo Your BusyBox configuration changes were NOT saved. |
| echo |
| fi |
| |
| # Remove log if empty. |
| if [ ! -s .menuconfig.log ] ; then |
| rm -f .menuconfig.log |
| fi |
| |
| exit 0 |