#! /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 >$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