| #! /bin/sh | |
| # | |
| # This script is used to configure the linux kernel. | |
| # | |
| # It was inspired by the challenge in the original Configure script | |
| # to ``do something better'', combined with the actual need to ``do | |
| # something better'' because the old configure script wasn't flexible | |
| # enough. | |
| # | |
| # Please send comments / questions / bug fixes to raymondc@microsoft.com. | |
| # | |
| # Each line in the config file is a command. | |
| # | |
| # # internal comment | |
| # | |
| # Lines beginning with a `#' are ignored. | |
| # | |
| # : message | |
| # | |
| # `:' causes the line to be echoed to the screen. | |
| # | |
| # * external comment | |
| # | |
| # `*' causes the line to be placed in the output | |
| # configuration file as a comment as well as being | |
| # echoed to the screen. | |
| # | |
| # if condition | |
| # ... commands ... | |
| # else | |
| # ... commands ... | |
| # fi | |
| # | |
| # This does the obvious thing. The `else' clause is | |
| # optional. Conditionals can be nested. | |
| # | |
| # The `condition' can be any valid bash expression. | |
| # They typically involve tests against environment | |
| # variables set by configuration options. For example, | |
| # | |
| # if [ "$CONFIG_SCSI" = "y" ] | |
| # ...More stuff... | |
| # fi | |
| # | |
| # Note! That there is no `then' keyword. | |
| # | |
| # bool 'prompt' CONFIG_VARIABLE default | |
| # | |
| # This prompts the user for a boolean value. | |
| # The prompt may not contain an apostrophe. | |
| # `default' should be either `y' or `n'. | |
| # The user's response is recorded in four places. | |
| # | |
| # In .config, if `y' | |
| # CONFIG_VARIABLE = CONFIG_VARIABLE | |
| # In .config, if `n' | |
| # # CONFIG_VARIABLE is not set | |
| # | |
| # In autoconf.h, if `y' | |
| # #define CONFIG_VARIABLE 1 | |
| # In autoconf.h, if `n' | |
| # #undef CONFIG_VARIABLE | |
| # | |
| # In config.in, if `y' | |
| # bool 'prompt' CONFIG_VARIABLE y | |
| # In config.in, if `n' | |
| # bool 'prompt' CONFIG_VARIABLE n | |
| # | |
| # In the environment of the Configure script, if `y' | |
| # CONFIG_VARIABLE = y | |
| # In the environment of the Configure script, if `n' | |
| # CONFIG_VARIABLE = n | |
| # | |
| # The value is placed into the environment of the Configure | |
| # script so that later parts of config.in can use the `if' | |
| # command to inspect the results of previous queries. | |
| # | |
| # int 'prompt' CONFIG_VARIABLE default | |
| # | |
| # This prompts the user for an integer value. | |
| # The prompt may not contain an apostrophe. | |
| # `default' should be an integer. | |
| # | |
| # The response is recorded as follows. | |
| # | |
| # In .config | |
| # CONFIG_VARIABLE = response | |
| # In autoconf.h | |
| # #define CONFIG_VARIABLE (response) | |
| # In config.in | |
| # int 'prompt' CONFIG_VARIABLE response | |
| # In the environment of the Configure script | |
| # CONFIG_VARIABLE = response | |
| # | |
| # 050793 - use IFS='@' to get around a bug in a pre-version of bash-1.13 | |
| # with an empty IFS. | |
| # | |
| # Make sure we're really running bash. | |
| # | |
| # I would really have preferred to write this script in a language with | |
| # better string handling, but alas, bash is the only scripting language | |
| # that I can be reasonable sure everybody has on their linux machine. | |
| # | |
| [ -z "$BASH" ] && { echo "Configure requires bash" 1>&2; exit 1; } | |
| # Disable filename globbing once and for all. | |
| # Enable function cacheing. | |
| set -f -h | |
| # | |
| # readln reads a line into $ans. | |
| # | |
| # readln prompt default | |
| # | |
| function readln () { | |
| echo -n "$1" | |
| IFS='@' read ans </dev/tty || exit 1 | |
| [ -z "$ans" ] && ans=$2 | |
| } | |
| # bool processes a boolean argument | |
| # | |
| # bool tail | |
| # | |
| function bool () { | |
| # Slimier hack to get bash to rescan a line. | |
| eval "set -- $1" | |
| ans="" | |
| while [ "$ans" != "y" -a "$ans" != "n" ]; do | |
| readln "$1 ($2) [$3] " "$3" | |
| done | |
| if [ "$ans" = "y" ]; then | |
| echo "$2 = $2" >>$CONFIG | |
| echo "#define $2 1" >>$CONFIG_H | |
| else | |
| echo "# $2 is not set" >>$CONFIG | |
| echo "#undef $2" >>$CONFIG_H | |
| fi | |
| raw_input_line="bool '$1' $2 $ans" | |
| eval "$2=$ans" | |
| } | |
| # int processes an integer argument | |
| # | |
| # int tail | |
| # | |
| function int () { | |
| # Slimier hack to get bash to rescan a line. | |
| eval "set -- $1" | |
| ans="x" | |
| while [ $[$ans+0] != "$ans" ]; do | |
| readln "$1 ($2) [$3] " "$3" | |
| done | |
| echo "$2 = $ans" >>$CONFIG | |
| echo "#define $2 ($ans)" >>$CONFIG_H | |
| raw_input_line="int '$1' $2 $ans" | |
| eval "$2=$ans" | |
| } | |
| CONFIG=.tmpconfig | |
| CONFIG_H=include/linux/autoconf.h | |
| trap "rm -f $CONFIG $CONFIG_H config.new ; exit 1" 1 2 | |
| # | |
| # Make sure we start out with a clean slate. | |
| # | |
| > config.new | |
| echo "#" > $CONFIG | |
| echo "# Automatically generated make config: don't edit" >> $CONFIG | |
| echo "#" >> $CONFIG | |
| echo "/*" > $CONFIG_H | |
| echo " * Automatically generated C config: don't edit" >> $CONFIG_H | |
| echo " */" >> $CONFIG_H | |
| stack='' | |
| branch='t' | |
| while IFS='@' read raw_input_line | |
| do | |
| # Slimy hack to get bash to rescan a line. | |
| read cmd rest <<-END_OF_COMMAND | |
| $raw_input_line | |
| END_OF_COMMAND | |
| if [ "$cmd" = "*" ]; then | |
| if [ "$branch" = "t" ]; then | |
| echo "$raw_input_line" | |
| echo "# $rest" >>$CONFIG | |
| if [ "$prevcmd" != "*" ]; then | |
| echo >>$CONFIG_H | |
| echo "/* $rest" >>$CONFIG_H | |
| else | |
| echo " * $rest" >>$CONFIG_H | |
| fi | |
| prevcmd="*" | |
| fi | |
| else | |
| [ "$prevcmd" = "*" ] && echo " */" >>$CONFIG_H | |
| prevcmd="" | |
| case "$cmd" in | |
| :) [ "$branch" = "t" ] && echo "$raw_input_line" ;; | |
| int) [ "$branch" = "t" ] && int "$rest" ;; | |
| bool) [ "$branch" = "t" ] && bool "$rest" ;; | |
| exec) [ "$branch" = "t" ] && ( sh -c "$rest" ) ;; | |
| if) stack="$branch $stack" | |
| if [ "$branch" = "t" ] && eval "$rest"; then | |
| branch=t | |
| else | |
| branch=f | |
| fi ;; | |
| else) if [ "$branch" = "t" ]; then | |
| branch=f | |
| else | |
| read branch rest <<-END_OF_STACK | |
| $stack | |
| END_OF_STACK | |
| fi ;; | |
| fi) [ -z "$stack" ] && echo "Error! Extra fi." 1>&2 | |
| read branch stack <<-END_OF_STACK | |
| $stack | |
| END_OF_STACK | |
| ;; | |
| esac | |
| fi | |
| echo "$raw_input_line" >>config.new | |
| done | |
| [ "$prevcmd" = "*" ] && echo " */" >>$CONFIG_H | |
| [ -z "$stack" ] || echo "Error! Untermiated if." 1>&2 | |
| mv config.in config.old | |
| mv config.new config.in | |
| echo | |
| echo "The linux kernel is now hopefully configured for your setup." | |
| echo "Check the top-level Makefile for additional configuration," | |
| echo "and do a 'make dep ; make clean' if you want to be sure all" | |
| echo "the files are correctly re-made" | |
| echo | |
| exit 0 |