Configure
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:12k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  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. # Make sure we're really running bash.
  53. #
  54. # I would really have preferred to write this script in a language with
  55. # better string handling, but alas, bash is the only scripting language
  56. # that I can be reasonable sure everybody has on their linux machine.
  57. #
  58. [ -z "$BASH" ] && { echo "Configure requires bash" 1>&2; exit 1; }
  59. # Disable filename globbing once and for all.
  60. # Enable function cacheing.
  61. set -f -h
  62. #
  63. # Dummy functions for use with a config.in modified for menuconf
  64. #
  65. function mainmenu_option () {
  66. :
  67. }
  68. function mainmenu_name () {
  69. :
  70. }
  71. function endmenu () {
  72. :
  73. }
  74. #
  75. # help prints the corresponding help text from Configure.help to stdout
  76. #
  77. #       help variable
  78. #
  79. function help () {
  80.   if [ -f Documentation/Configure.help ]
  81.   then
  82.      #first escape regexp special characters in the argument:
  83.      var=$(echo "$1"|sed 's/[][/.^$*]/\&/g')
  84.      #now pick out the right help text:
  85.      text=$(sed -n "/^$var[  ]*$/,${
  86. /^$var[  ]*$/c\
  87. ${var}:\
  88. /^#/b
  89. /^[^  ]/q
  90. /<file:\([^>]*\)>/s//\1/g
  91. p
  92.     }" Documentation/Configure.help)
  93.      if [ -z "$text" ]
  94.      then
  95.   echo; echo "  Sorry, no help available for this option yet.";echo
  96.      else
  97.   (echo; echo "$text") | ${PAGER:-more}
  98.      fi
  99.   else
  100.      echo;
  101.      echo "  Can't access the file Documentation/Configure.help which"
  102.      echo "  should contain the help texts."
  103.      echo
  104.   fi
  105. }
  106. #
  107. # readln reads a line into $ans.
  108. #
  109. # readln prompt default oldval
  110. #
  111. function readln () {
  112. if [ "$DEFAULT" = "-d" -a -n "$3" ]; then
  113. echo "$1"
  114. ans=$2
  115. else
  116. echo -n "$1"
  117. [ -z "$3" ] && echo -n "(NEW) "
  118. IFS='@' read ans || exit 1
  119. [ -z "$ans" ] && ans=$2
  120. fi
  121. }
  122. #
  123. # comment does some pretty-printing
  124. #
  125. # comment 'xxx'
  126. function comment () {
  127. echo "*"; echo "* $1" ; echo "*"
  128. (echo "" ; echo "#"; echo "# $1" ; echo "#") >>$CONFIG
  129. (echo "" ; echo "/*"; echo " * $1" ; echo " */") >>$CONFIG_H
  130. }
  131. #
  132. # define_bool sets the value of a boolean argument
  133. #
  134. # define_bool define value
  135. #
  136. function define_bool () {
  137. define_tristate $1 $2
  138. }
  139. function define_tristate () {
  140. case "$2" in
  141.  "y")
  142. echo "$1=y" >>$CONFIG
  143. echo "#define $1 1" >>$CONFIG_H
  144. ;;
  145.  "m")
  146. echo "$1=m" >>$CONFIG
  147. echo "#undef  $1" >>$CONFIG_H
  148. echo "#define $1_MODULE 1" >>$CONFIG_H
  149. ;;
  150.  "n")
  151. echo "# $1 is not set" >>$CONFIG
  152. echo "#undef  $1" >>$CONFIG_H
  153. ;;
  154. esac
  155. eval "$1=$2"
  156. }
  157. #
  158. # bool processes a boolean argument
  159. #
  160. # bool question define
  161. #
  162. function bool () {
  163. old=$(eval echo "${$2}")
  164. def=${old:-'n'}
  165. case "$def" in
  166.  "y" | "m") defprompt="Y/n/?"
  167.       def="y"
  168.       ;;
  169.  "n") defprompt="N/y/?"
  170.       ;;
  171. esac
  172. while :; do
  173.   readln "$1 ($2) [$defprompt] " "$def" "$old"
  174.   case "$ans" in
  175.     [yY] | [yY]es ) define_bool "$2" "y"
  176.     break;;
  177.     [nN] | [nN]o )  define_bool "$2" "n"
  178.     break;;
  179.     * )             help "$2"
  180.     ;;
  181.   esac
  182. done
  183. }
  184. #
  185. # tristate processes a tristate argument
  186. #
  187. # tristate question define
  188. #
  189. function tristate () {
  190. if [ "$CONFIG_MODULES" != "y" ]; then
  191.   bool "$1" "$2"
  192. else 
  193.   old=$(eval echo "${$2}")
  194.   def=${old:-'n'}
  195.   case "$def" in
  196.    "y") defprompt="Y/m/n/?"
  197. ;;
  198.    "m") defprompt="M/n/y/?"
  199. ;;
  200.    "n") defprompt="N/y/m/?"
  201. ;;
  202.   esac
  203.   while :; do
  204.     readln "$1 ($2) [$defprompt] " "$def" "$old"
  205.     case "$ans" in
  206.       [yY] | [yY]es ) define_tristate "$2" "y"
  207.       break ;;
  208.       [nN] | [nN]o )  define_tristate "$2" "n"
  209.       break ;;
  210.       [mM] )          define_tristate "$2" "m"
  211.       break ;;
  212.       * )             help "$2"
  213.       ;;
  214.     esac
  215.   done
  216. fi
  217. }
  218. #
  219. # dep_tristate processes a tristate argument that depends upon
  220. # another option or options.  If any of the options we depend upon is a
  221. # module, then the only allowable options are M or N.  If all are Y, then
  222. # this is a normal tristate.  This is used in cases where modules
  223. # are nested, and one module requires the presence of something
  224. # else in the kernel.
  225. #
  226. # dep_tristate question define default ...
  227. #
  228. function dep_tristate () {
  229. old=$(eval echo "${$2}")
  230. def=${old:-'n'}
  231. ques=$1
  232. var=$2
  233. need_module=0
  234. shift 2
  235. while [ $# -gt 0 ]; do
  236.   case "$1" in
  237.       n)
  238.       define_tristate "$var" "n"
  239.       return
  240.       ;;
  241.     m)
  242.       need_module=1
  243.       ;;
  244.   esac
  245.   shift
  246. done
  247. if [ $need_module = 1 ]; then
  248.    if [ "$CONFIG_MODULES" = "y" ]; then
  249. case "$def" in
  250.  "y" | "m") defprompt="M/n/?"
  251.       def="m"
  252.       ;;
  253.  "n") defprompt="N/m/?"
  254.       ;;
  255. esac
  256. while :; do
  257.   readln "$ques ($var) [$defprompt] " "$def" "$old"
  258.   case "$ans" in
  259.       [nN] | [nN]o )  define_tristate "$var" "n"
  260.       break ;;
  261.       [mM] )          define_tristate "$var" "m"
  262.       break ;;
  263.       [yY] | [yY]es ) echo 
  264.    echo "  This answer is not allowed, because it is not consistent with"
  265.    echo "  your other choices."
  266.    echo "  This driver depends on another one which you chose to compile"
  267.    echo "  as a module. This means that you can either compile this one"
  268.    echo "  as a module as well (with M) or leave it out altogether (N)."
  269.       echo
  270.       ;;
  271.       * )             help "$var"
  272.       ;;
  273.   esac
  274. done
  275.    fi
  276. else
  277.    tristate "$ques" "$var"
  278. fi
  279. }
  280. function dep_bool () {
  281. ques=$1
  282. var=$2
  283. shift 2
  284. while [ $# -gt 0 ]; do
  285.   case "$1" in
  286.     m | n)
  287.       define_bool "$var" "n"
  288.       return
  289.       ;;
  290.   esac
  291.   shift
  292. done
  293. bool "$ques" "$var"
  294. }
  295. function dep_mbool () {
  296. ques=$1
  297. var=$2
  298. shift 2
  299. while [ $# -gt 0 ]; do
  300.   case "$1" in
  301.     n)
  302.       define_bool "$var" "n"
  303.       return
  304.       ;;
  305.   esac
  306.   shift
  307. done
  308. bool "$ques" "$var"
  309. }
  310. #
  311. # define_int sets the value of a integer argument
  312. #
  313. # define_int define value
  314. #
  315. function define_int () {
  316. echo "$1=$2" >>$CONFIG
  317. echo "#define $1 ($2)" >>$CONFIG_H
  318. eval "$1=$2"
  319. }
  320. #
  321. # int processes an integer argument with optional limits
  322. #
  323. # int question define default [min max]
  324. #
  325. function int () {
  326. old=$(eval echo "${$2}")
  327. def=${old:-$3}
  328. if [ $# -gt 3 ]; then
  329.   min=$4
  330. else
  331.   min=-10000000    # !!
  332. fi
  333. if [ $# -gt 4 ]; then
  334.   max=$5
  335. else
  336.   max=10000000     # !!
  337. fi
  338. while :; do
  339.   readln "$1 ($2) [$def] " "$def" "$old"
  340.   if expr ( ( $ans + 0 ) >= $min ) & ( $ans <= $max ) >/dev/null 2>&1 ; then
  341.             define_int "$2" "$ans"
  342.     break
  343.           else
  344.     help "$2"
  345.           fi
  346. done
  347. }
  348. #
  349. # define_hex sets the value of a hexadecimal argument
  350. #
  351. # define_hex define value
  352. #
  353. function define_hex () {
  354. echo "$1=$2" >>$CONFIG
  355. echo "#define $1 0x${2#*[x,X]}" >>$CONFIG_H
  356. eval "$1=$2"
  357. }
  358. #
  359. # hex processes an hexadecimal argument
  360. #
  361. # hex question define default
  362. #
  363. function hex () {
  364. old=$(eval echo "${$2}")
  365. def=${old:-$3}
  366. def=${def#*[x,X]}
  367. while :; do
  368.   readln "$1 ($2) [$def] " "$def" "$old"
  369.   ans=${ans#*[x,X]}
  370.   if expr "$ans" : '[0-9a-fA-F][0-9a-fA-F]*$' > /dev/null; then
  371.     define_hex "$2" "$ans"
  372.     break
  373.   else
  374.     help "$2"
  375.   fi
  376. done
  377. }
  378. #
  379. # define_string sets the value of a string argument
  380. #
  381. # define_string define value
  382. #
  383. function define_string () {
  384. echo "$1="$2"" >>$CONFIG
  385. echo "#define $1 "$2"" >>$CONFIG_H
  386. eval "$1="$2""
  387. }
  388. #
  389. # string processes a string argument
  390. #
  391. # string question define default
  392. #
  393. function string () {
  394. old=$(eval echo "${$2}")
  395. def=${old:-$3}
  396. while :; do
  397.           if [ "$old" = "?" ]; then
  398.              readln "$1 ($2) [$def] " "$def" ""
  399.           else
  400.      readln "$1 ($2) [$def] " "$def" "$old"
  401.           fi
  402.   if [ "$ans" = "?" ]; then
  403.     help "$2"
  404.   else
  405.     break
  406.   fi
  407. done
  408. define_string "$2" "$ans"
  409. }
  410. #
  411. # choice processes a choice list (1-out-of-n)
  412. #
  413. # choice question choice-list default
  414. #
  415. # The choice list has a syntax of:
  416. # NAME WHITESPACE VALUE { WHITESPACE NAME WHITESPACE VALUE }
  417. # The user may enter any unique prefix of one of the NAMEs and
  418. # choice will define VALUE as if it were a boolean option.
  419. # VALUE must be in all uppercase.  Normally, VALUE is of the
  420. # form CONFIG_<something>.  Thus, if the user selects <something>,
  421. # the CPP symbol CONFIG_<something> will be defined and the
  422. # shell variable CONFIG_<something> will be set to "y".
  423. #
  424. function choice () {
  425. question="$1"
  426. choices="$2"
  427. old=
  428. def=$3
  429. # determine default answer:
  430. names=""
  431. set -- $choices
  432. firstvar=$2
  433. while [ -n "$2" ]; do
  434. if [ -n "$names" ]; then
  435. names="$names, $1"
  436. else
  437. names="$1"
  438. fi
  439. if [ "$(eval echo "${$2}")" = "y" ]; then
  440. old=$1
  441. def=$1
  442. fi
  443. shift; shift
  444. done
  445. val=""
  446. while [ -z "$val" ]; do
  447. ambg=n
  448. readln "$question ($names) [$def] " "$def" "$old"
  449. ans=$(echo $ans | tr a-z A-Z)
  450. set -- $choices
  451. while [ -n "$1" ]; do
  452. name=$(echo $1 | tr a-z A-Z)
  453. case "$name" in
  454. "$ans"* | */"$ans"* )
  455. case "$name" in
  456. "$ans" | */"$ans"/* | 
  457. "$ans"/* | */"$ans" )
  458. val="$2"
  459. break # exact match
  460. ;;
  461. esac
  462. if [ -n "$val" ]; then
  463. echo;echo 
  464. "  Sorry, "$ans" is ambiguous; please enter a longer string."
  465. echo
  466. val=""
  467. ambg=y
  468. break
  469. else
  470. val="$2"
  471. fi;;
  472. esac
  473. shift; shift
  474. done
  475. if [ "$val" = "" -a "$ambg" = "n" ]; then
  476. help "$firstvar"
  477. fi
  478. done
  479. set -- $choices
  480. while [ -n "$2" ]; do
  481. if [ "$2" = "$val" ]; then
  482. echo "  defined $val"
  483. define_bool "$2" "y"
  484. else
  485. define_bool "$2" "n"
  486. fi
  487. shift; shift
  488. done
  489. }
  490. CONFIG=.tmpconfig
  491. CONFIG_H=.tmpconfig.h
  492. trap "rm -f $CONFIG $CONFIG_H ; exit 1" 1 2
  493. #
  494. # Make sure we start out with a clean slate.
  495. #
  496. echo "#" > $CONFIG
  497. echo "# Automatically generated make config: don't edit" >> $CONFIG
  498. echo "#" >> $CONFIG
  499. echo "/*" > $CONFIG_H
  500. echo " * Automatically generated C config: don't edit" >> $CONFIG_H
  501. echo " */" >> $CONFIG_H
  502. echo "#define AUTOCONF_INCLUDED" >> $CONFIG_H
  503. DEFAULT=""
  504. if [ "$1" = "-d" ] ; then
  505. DEFAULT="-d"
  506. shift
  507. fi
  508. CONFIG_IN=./config.in
  509. if [ "$1" != "" ] ; then
  510. CONFIG_IN=$1
  511. fi
  512. DEFAULTS=arch/$ARCH/defconfig
  513. if [ -f .config ]; then
  514.   DEFAULTS=.config
  515. fi
  516. if [ -f $DEFAULTS ]; then
  517.   echo "#"
  518.   echo "# Using defaults found in" $DEFAULTS
  519.   echo "#"
  520.   . $DEFAULTS
  521.   sed -e 's/# (CONFIG_[^ ]*) is not.*/1=n/' <$DEFAULTS >.config-is-not.$$
  522.   . .config-is-not.$$
  523.   rm .config-is-not.$$
  524. else
  525.   echo "#"
  526.   echo "# No defaults found"
  527.   echo "#"
  528. fi
  529. . $CONFIG_IN
  530. rm -f .config.old
  531. if [ -f .config ]; then
  532. mv .config .config.old
  533. fi
  534. mv .tmpconfig .config
  535. mv .tmpconfig.h include/linux/autoconf.h
  536. echo
  537. echo "*** End of Linux kernel configuration."
  538. echo "*** Check the top-level Makefile for additional configuration."
  539. if [ ! -f .hdepend -o "$CONFIG_MODVERSIONS" = "y" ] ; then
  540.     echo "*** Next, you must run 'make dep'."
  541. else
  542.     echo "*** Next, you may run 'make bzImage', 'make bzdisk', or 'make install'."
  543. fi
  544. echo
  545. exit 0