1 #! /bin/sh
2 #
3 # This script is used to configure the Linux kernel.
4 #
5 # It was inspired by the challenge in the original Configure script
6 # to ``do something better'', combined with the actual need to ``do
7 # something better'' because the old configure script wasn't flexible
8 # enough.
9 #
10 # Raymond Chen was the original author of Configure.
11 # Michael Elizabeth Chastain (mec@shout.net) is the current maintainer.
12 #
13 # 050793 - use IFS='@' to get around a bug in a pre-version of bash-1.13
14 # with an empty IFS.
15 #
16 # 030995 (storner@osiris.ping.dk) - added support for tri-state answers,
17 # for selecting modules to compile.
18 #
19 # 180995 Bernhard Kaindl (bkaindl@ping.at) - added dummy functions for
20 # use with a config.in modified for make menuconfig.
21 #
22 # 301195 (boldt@math.ucsb.edu) - added help text support
23 #
24 # 281295 Paul Gortmaker - make tri_state functions collapse to boolean
25 # if module support is not enabled.
26 #
27 # 010296 Aaron Ucko (ucko@vax1.rockhurst.edu) - fix int and hex to accept
28 # arbitrary ranges
29 #
30 # 150296 Dick Streefland (dicks@tasking.nl) - report new configuration
31 # items and ask for a value even when doing a "make oldconfig"
32 #
33 # 200396 Tom Dyas (tdyas@eden.rutgers.edu) - when the module option is
34 # chosen for an item, define the macro <option_name>_MODULE
35 #
36 # 090397 Axel Boldt (boldt@math.ucsb.edu) - avoid ? and + in regular
37 # expressions for GNU expr since version 1.15 and up use \? and \+.
38 #
39 # 300397 Phil Blundell (pjb27@cam.ac.uk) - added support for min/max
40 # arguments to "int", allow dep_tristate to take a list of dependencies
41 # rather than just one.
42 #
43 # 090398 Axel Boldt (boldt@math.ucsb.edu) - allow for empty lines in help
44 # texts.
45 #
46 # 102598 Michael Chastain (mec@shout.net) - put temporary files in
47 # current directory, not in /tmp.
48 #
49 # 24 January 1999, Michael Elizabeth Chastain, <mec@shout.net>
50 # - Improve the exit message (Jeff Ronne).
51
52 #
53 # Make sure we're really running bash.
54 #
55 # I would really have preferred to write this script in a language with
56 # better string handling, but alas, bash is the only scripting language
57 # that I can be reasonable sure everybody has on their linux machine.
58 #
59 [ -z "$BASH" ] && { echo "Configure requires bash" 1>&2; exit 1; }
60
61 # Disable filename globbing once and for all.
62 # Enable function cacheing.
63 set -f -h
64
65 #
66 # Dummy functions for use with a config.in modified for menuconf
67 #
68 function mainmenu_option () {
69 :
70 }
71 function mainmenu_name () {
72 :
73 }
74 function endmenu () {
75 :
76 }
77
78 #
79 # help prints the corresponding help text from Configure.help to stdout
80 #
81 # help variable
82 #
83 function help () {
84 if [ -f Documentation/Configure.help ]
85 then
86 #first escape regexp special characters in the argument:
87 var=$(echo "$1"|sed 's/[][\/.^$*]/\\&/g')
88 #now pick out the right help text:
89 text=$(sed -n "/^$var[ ]*\$/,\${
90 /^$var[ ]*\$/c\\
91 ${var}:\\
92
93 /^#/b
94 /^[^ ]/q
95 p
96 }" Documentation/Configure.help)
97 if [ -z "$text" ]
98 then
99 echo; echo " Sorry, no help available for this option yet.";echo
100 else
101 (echo; echo "$text") | ${PAGER:-more}
102 fi
103 else
104 echo;
105 echo " Can't access the file Documentation/Configure.help which"
106 echo " should contain the help texts."
107 echo
108 fi
109 }
110
111
112 #
113 # readln reads a line into $ans.
114 #
115 # readln prompt default oldval
116 #
117 function readln () {
118 if [ "$DEFAULT" = "-d" -a -n "$3" ]; then
119 echo "$1"
120 ans=$2
121 else
122 echo -n "$1"
123 [ -z "$3" ] && echo -n "(NEW) "
124 IFS='@' read ans || exit 1
125 [ -z "$ans" ] && ans=$2
126 fi
127 }
128
129 #
130 # comment does some pretty-printing
131 #
132 # comment 'xxx'
133 #
134 function comment () {
135 echo "*"; echo "* $1" ; echo "*"
136 (echo "" ; echo "#"; echo "# $1" ; echo "#") >>$CONFIG
137 (echo "" ; echo "/*"; echo " * $1" ; echo " */") >>$CONFIG_H
138 }
139
140 #
141 # define_bool sets the value of a boolean argument
142 #
143 # define_bool define value
144 #
145 function define_bool () {
146 define_tristate $1 $2
147 }
148
149 function define_tristate () {
150 case "$2" in
151 "y")
152 echo "$1=y" >>$CONFIG
153 echo "#define $1 1" >>$CONFIG_H
154 ;;
155
156 "m")
157 echo "$1=m" >>$CONFIG
158 echo "#undef $1" >>$CONFIG_H
159 echo "#define $1_MODULE 1" >>$CONFIG_H
160 ;;
161
162 "n")
163 echo "# $1 is not set" >>$CONFIG
164 echo "#undef $1" >>$CONFIG_H
165 ;;
166 esac
167 eval "$1=$2"
168 }
169
170 #
171 # bool processes a boolean argument
172 #
173 # bool question define
174 #
175 function bool () {
176 old=$(eval echo "\${$2}")
177 def=${old:-'n'}
178 case "$def" in
179 "y" | "m") defprompt="Y/n/?"
180 def="y"
181 ;;
182 "n") defprompt="N/y/?"
183 ;;
184 esac
185 while :; do
186 readln "$1 ($2) [$defprompt] " "$def" "$old"
187 case "$ans" in
188 [yY] | [yY]es ) define_bool "$2" "y"
189 break;;
190 [nN] | [nN]o ) define_bool "$2" "n"
191 break;;
192 * ) help "$2"
193 ;;
194 esac
195 done
196 }
197
198 #
199 # tristate processes a tristate argument
200 #
201 # tristate question define
202 #
203 function tristate () {
204 if [ "$CONFIG_MODULES" != "y" ]; then
205 bool "$1" "$2"
206 else
207 old=$(eval echo "\${$2}")
208 def=${old:-'n'}
209 case "$def" in
210 "y") defprompt="Y/m/n/?"
211 ;;
212 "m") defprompt="M/n/y/?"
213 ;;
214 "n") defprompt="N/y/m/?"
215 ;;
216 esac
217 while :; do
218 readln "$1 ($2) [$defprompt] " "$def" "$old"
219 case "$ans" in
220 [yY] | [yY]es ) define_tristate "$2" "y"
221 break ;;
222 [nN] | [nN]o ) define_tristate "$2" "n"
223 break ;;
224 [mM] ) define_tristate "$2" "m"
225 break ;;
226 * ) help "$2"
227 ;;
228 esac
229 done
230 fi
231 }
232
233 #
234 # dep_tristate processes a tristate argument that depends upon
235 # another option or options. If any of the options we depend upon is a
236 # module, then the only allowable options are M or N. If all are Y, then
237 # this is a normal tristate. This is used in cases where modules
238 # are nested, and one module requires the presence of something
239 # else in the kernel.
240 #
241 # dep_tristate question define default ...
242 #
243 function dep_tristate () {
244 old=$(eval echo "\${$2}")
245 def=${old:-'n'}
246 ques=$1
247 var=$2
248 need_module=0
249 shift 2
250 while [ $# -gt 0 ]; do
251 case "$1" in
252 n)
253 define_tristate "$var" "n"
254 return
255 ;;
256 m)
257 need_module=1
258 ;;
259 esac
260 shift
261 done
262
263 if [ $need_module = 1 ]; then
264 if [ "$CONFIG_MODULES" = "y" ]; then
265 case "$def" in
266 "y" | "m") defprompt="M/n/?"
267 def="m"
268 ;;
269 "n") defprompt="N/m/?"
270 ;;
271 esac
272 while :; do
273 readln "$ques ($var) [$defprompt] " "$def" "$old"
274 case "$ans" in
275 [nN] | [nN]o ) define_tristate "$var" "n"
276 break ;;
277 [mM] ) define_tristate "$var" "m"
278 break ;;
279 [yY] | [yY]es ) echo
280 echo " This answer is not allowed, because it is not consistent with"
281 echo " your other choices."
282 echo " This driver depends on another one which you chose to compile"
283 echo " as a module. This means that you can either compile this one"
284 echo " as a module as well (with M) or leave it out altogether (N)."
285 echo
286 ;;
287 * ) help "$var"
288 ;;
289 esac
290 done
291 fi
292 else
293 tristate "$ques" "$var"
294 fi
295 }
296
297 function dep_bool () {
298 ques=$1
299 var=$2
300 shift 2
301 while [ $# -gt 0 ]; do
302 case "$1" in
303 m | n)
304 define_bool "$var" "n"
305 return
306 ;;
307 esac
308 shift
309 done
310
311 bool "$ques" "$var"
312 }
313
314 function dep_mbool () {
315 ques=$1
316 var=$2
317 shift 2
318 while [ $# -gt 0 ]; do
319 case "$1" in
320 n)
321 define_bool "$var" "n"
322 return
323 ;;
324 esac
325 shift
326 done
327
328 bool "$ques" "$var"
329 }
330
331 #
332 # define_int sets the value of a integer argument
333 #
334 # define_int define value
335 #
336 function define_int () {
337 echo "$1=$2" >>$CONFIG
338 echo "#define $1 ($2)" >>$CONFIG_H
339 eval "$1=$2"
340 }
341
342 #
343 # int processes an integer argument with optional limits
344 #
345 # int question define default [min max]
346 #
347 function int () {
348 old=$(eval echo "\${$2}")
349 def=${old:-$3}
350 if [ $# -gt 3 ]; then
351 min=$4
352 else
353 min=-10000000 # !!
354 fi
355 if [ $# -gt 4 ]; then
356 max=$5
357 else
358 max=10000000 # !!
359 fi
360 while :; do
361 readln "$1 ($2) [$def] " "$def" "$old"
362 if expr \( \( $ans + 0 \) \>= $min \) \& \( $ans \<= $max \) >/dev/null 2>&1 ; then
363 define_int "$2" "$ans"
364 break
365 else
366 help "$2"
367 fi
368 done
369 }
370
371 #
372 # define_hex sets the value of a hexadecimal argument
373 #
374 # define_hex define value
375 #
376 function define_hex () {
377 echo "$1=$2" >>$CONFIG
378 echo "#define $1 0x${2#*[x,X]}" >>$CONFIG_H
379 eval "$1=$2"
380 }
381
382 #
383 # hex processes an hexadecimal argument
384 #
385 # hex question define default
386 #
387 function hex () {
388 old=$(eval echo "\${$2}")
389 def=${old:-$3}
390 def=${def#*[x,X]}
391 while :; do
392 readln "$1 ($2) [$def] " "$def" "$old"
393 ans=${ans#*[x,X]}
394 if expr "$ans" : '[0-9a-fA-F][0-9a-fA-F]*$' > /dev/null; then
395 define_hex "$2" "$ans"
396 break
397 else
398 help "$2"
399 fi
400 done
401 }
402
403 #
404 # define_string sets the value of a string argument
405 #
406 # define_string define value
407 #
408 function define_string () {
409 echo "$1=\"$2\"" >>$CONFIG
410 echo "#define $1 \"$2\"" >>$CONFIG_H
411 eval "$1=\"$2\""
412 }
413
414 #
415 # string processes a string argument
416 #
417 # string question define default
418 #
419 function string () {
420 old=$(eval echo "\${$2}")
421 def=${old:-$3}
422 while :; do
423 if [ "$old" = "?" ]; then
424 readln "$1 ($2) [$def] " "$def" ""
425 else
426 readln "$1 ($2) [$def] " "$def" "$old"
427 fi
428 if [ "$ans" = "?" ]; then
429 help "$2"
430 else
431 break
432 fi
433 done
434 define_string "$2" "$ans"
435 }
436 #
437 # choice processes a choice list (1-out-of-n)
438 #
439 # choice question choice-list default
440 #
441 # The choice list has a syntax of:
442 # NAME WHITESPACE VALUE { WHITESPACE NAME WHITESPACE VALUE }
443 # The user may enter any unique prefix of one of the NAMEs and
444 # choice will define VALUE as if it were a boolean option.
445 # VALUE must be in all uppercase. Normally, VALUE is of the
446 # form CONFIG_<something>. Thus, if the user selects <something>,
447 # the CPP symbol CONFIG_<something> will be defined and the
448 # shell variable CONFIG_<something> will be set to "y".
449 #
450 function choice () {
451 question="$1"
452 choices="$2"
453 old=
454 def=$3
455
456 # determine default answer:
457 names=""
458 set -- $choices
459 firstvar=$2
460 while [ -n "$2" ]; do
461 if [ -n "$names" ]; then
462 names="$names, $1"
463 else
464 names="$1"
465 fi
466 if [ "$(eval echo \"\${$2}\")" = "y" ]; then
467 old=$1
468 def=$1
469 fi
470 shift; shift
471 done
472
473 val=""
474 while [ -z "$val" ]; do
475 ambg=n
476 readln "$question ($names) [$def] " "$def" "$old"
477 ans=$(echo $ans | tr a-z A-Z)
478 set -- $choices
479 while [ -n "$1" ]; do
480 name=$(echo $1 | tr a-z A-Z)
481 case "$name" in
482 "$ans"* | */"$ans"* )
483 case "$name" in
484 "$ans" | */"$ans"/* | \
485 "$ans"/* | */"$ans" )
486 val="$2"
487 break # exact match
488 ;;
489 esac
490 if [ -n "$val" ]; then
491 echo;echo \
492 " Sorry, \"$ans\" is ambiguous; please enter a longer string."
493 echo
494 val=""
495 ambg=y
496 break
497 else
498 val="$2"
499 fi;;
500 esac
501 shift; shift
502 done
503 if [ "$val" = "" -a "$ambg" = "n" ]; then
504 help "$firstvar"
505 fi
506 done
507 set -- $choices
508 while [ -n "$2" ]; do
509 if [ "$2" = "$val" ]; then
510 echo " defined $val"
511 define_bool "$2" "y"
512 else
513 define_bool "$2" "n"
514 fi
515 shift; shift
516 done
517 }
518
519 CONFIG=.tmpconfig
520 CONFIG_H=.tmpconfig.h
521 trap "rm -f $CONFIG $CONFIG_H ; exit 1" 1 2
522
523 #
524 # Make sure we start out with a clean slate.
525 #
526 echo "#" > $CONFIG
527 echo "# Automatically generated make config: don't edit" >> $CONFIG
528 echo "#" >> $CONFIG
529
530 echo "/*" > $CONFIG_H
531 echo " * Automatically generated C config: don't edit" >> $CONFIG_H
532 echo " */" >> $CONFIG_H
533 echo "#define AUTOCONF_INCLUDED" >> $CONFIG_H
534
535 DEFAULT=""
536 if [ "$1" = "-d" ] ; then
537 DEFAULT="-d"
538 shift
539 fi
540
541 CONFIG_IN=./config.in
542 if [ "$1" != "" ] ; then
543 CONFIG_IN=$1
544 fi
545
546 DEFAULTS=arch/$ARCH/defconfig
547 if [ -f .config ]; then
548 DEFAULTS=.config
549 fi
550
551 if [ -f $DEFAULTS ]; then
552 echo "#"
553 echo "# Using defaults found in" $DEFAULTS
554 echo "#"
555 . $DEFAULTS
556 sed -e 's/# \(CONFIG_[^ ]*\) is not.*/\1=n/' <$DEFAULTS >.config-is-not.$$
557 . .config-is-not.$$
558 rm .config-is-not.$$
559 else
560 echo "#"
561 echo "# No defaults found"
562 echo "#"
563 fi
564
565 . $CONFIG_IN
566
567 rm -f .config.old
568 if [ -f .config ]; then
569 mv .config .config.old
570 fi
571 mv .tmpconfig .config
572 mv .tmpconfig.h include/linux/autoconf.h
573
574 echo
575 echo "*** End of Linux kernel configuration."
576 echo "*** Check the top-level Makefile for additional configuration."
577 if [ ! -f .hdepend -o "$CONFIG_MODVERSIONS" = "y" ] ; then
578 echo "*** Next, you must run 'make dep'."
579 else
580 echo "*** Next, you may run 'make bzImage', 'make bzdisk', or 'make install'."
581 fi
582 echo
583
584 exit 0
This page was automatically generated by the
LXR engine.
Visit the LXR main site for more
information.