configure
author "Frederic Roussel" <fr.frasc@gmail.com>
Wed Nov 25 00:10:42 2009 -0800 (2009-11-25)
changeset 1654 489e9f2158fa
parent 1576 906b7509835e
parent 1571 2f44fac6b514
child 1660 991fc21dd3cf
permissions -rwxr-xr-x
patches/glibc: allows glibc2.9 to be compiled with binutils 2.20

the configure script had to be modified to accept as/ld at versions greater
than 2.19
Signed-off-by: Frederic Roussel <fr.frasc@gmail.com>
     1 #!/bin/sh
     2 
     3 myname="${0##*/}"
     4 
     5 VERSION=$( cat .version )
     6 DATE=$( date +%Y%m%d )
     7 
     8 PREFIX_DEFAULT=/usr/local
     9 
    10 BINDIR_set=
    11 LIBDIR_set=
    12 DOCDIR_set=
    13 MANDIR_set=
    14 LOCAL_set=
    15 FORCE=
    16 
    17 do_quit=
    18 
    19 # Simply print the error message, and exit. Obvious, he?
    20 do_error() {
    21     printf "${myname}: ${@}\n"
    22     exit 1
    23 }
    24 
    25 # Given an option string and the following argument,
    26 # echoes the value of the option.
    27 # If --var=val => echoes val and returns 0, meaning second arg was not consumed
    28 # If --var val => echoes val and returns non null, meaning second arg was used
    29 get_optval(){
    30     case "$1" in
    31         --*=?*)
    32             printf "${1#*=}"
    33             return 0
    34             ;;
    35         *)
    36             printf "${2}"
    37             return 1
    38             ;;
    39     esac
    40 }
    41 
    42 # The set_xxx functions will set the corresponding configuration variable
    43 # They return 0 if second arg was not consumed, and non-zero if it was consumed.
    44 set_prefix() {
    45     PREFIX="$( get_optval "$1" "$2" )"
    46 }
    47 set_bindir() {
    48     BINDIR_set=1
    49     BINDIR="$( get_optval "$1" "$2" )"
    50 }
    51 set_libdir() {
    52     LIBDIR_set=1
    53     LIBDIR="$( get_optval "$1" "$2" )"
    54 }
    55 set_docdir() {
    56     DOCDIR_set=1
    57     DOCDIR="$( get_optval "$1" "$2" )"
    58 }
    59 set_mandir() {
    60     MANDIR_set=1
    61     MANDIR="$( get_optval "$1" "$2" )"
    62 }
    63 set_tool() {
    64     local var_name="${1%%=*}"
    65     var_name="${var_name#--with-}"
    66     eval ${var_name}="\$( get_optval "$1" "$2" )"
    67 }
    68 
    69 # var_list is a list of variables, each one holding a path to a
    70 # tool, either detected by ./configure, or specified by the user.
    71 var_list=""
    72 
    73 # This function adds a variable name to the above list of variable names.
    74 # $1: the name of the variable to add to the list
    75 add_to_var_list() {
    76     var_list="${var_list} ${1}"
    77 }
    78 
    79 # A function to test for required tools/headers/libraries
    80 # Return 0 (true) if found, !0 (false) if not found
    81 #
    82 # $*: [prog|inc|lib]=<name[ name...]>
    83 #     the name(s) of tool(s) to test for
    84 #     mandatory
    85 #       eg: prog=bash   prog="curl wget"
    86 # $*: var=<var_name>
    87 #     the name of the variable to test and set
    88 #     optional
    89 #       eg: var=bash    if ${bash} is set and non-null, use that,
    90 #                       else check for bash and set bash=$(which bash)
    91 # $*: ver=<regexp>
    92 #     for each 'prog', test if $(prog --version) matches 'regexp'
    93 #     optional
    94 #       eg: ver='^GNU bash, version [34]\.'
    95 # $*: err=<error_message>
    96 #     the error message to print if tool is missing
    97 #     optional, defaults to: '${prog}: none found'
    98 #       eg: err="'bash' 3.x or above was not found"
    99 check_for() {
   100     local prog inc lib
   101     local var ver err
   102     local val
   103     local item
   104     local where
   105     local status
   106 
   107     for item in "${@}"; do
   108         case "${item}" in
   109             prog=*|inc=*|lib=*|var=*|ver=*|err=*)
   110                 eval ${item%%=*}="'${item#*=}'"
   111                 ;;
   112             *)  do_error "has_or_abort: incorrect parameters: '$@'";;
   113         esac
   114     done
   115 
   116     case "${prog}:${inc}:${lib}" in
   117         ?*::)
   118             for item in ${prog}; do
   119                 printf "Checking for '${item}'... "
   120                 if [ -n "${var}" ]; then
   121                     eval val="\${${var}}"
   122                     if [ -n "${val}" ]; then
   123                         printf "${val} (cached)\n"
   124                         add_to_var_list "${var}"
   125                         return 0
   126                     fi
   127                 fi
   128                 where="$( which "${item}" 2>/dev/null )"
   129                 if [ -z "${where}" ]; then
   130                     printf "no\n"
   131                     continue
   132                 elif [ -n "${ver}" ]; then
   133                     str=$( LC_ALL=C "${where}" --version 2>&1   \
   134                            |grep -E "${ver}"                    \
   135                            |head -n 1
   136                          )
   137                     if [ -z "${str}" ]; then
   138                         printf "no\n"
   139                         unset where
   140                         continue
   141                     fi
   142                 fi
   143                 status="${where}"
   144                 break
   145             done
   146             ;;
   147         :?*:)
   148             for item in ${inc}; do
   149                 printf "Checking for '${item}'... "
   150                 if printf "#include \"${item}\"" |gcc -x c -c - -o /dev/null >/dev/null 2>&1; then
   151                     where="${item}"
   152                     status=yes
   153                     break;
   154                 fi
   155                 printf "no\n"
   156             done
   157             ;;
   158         ::?*)
   159             for item in ${lib}; do
   160                 printf "Checking for '${item}'... "
   161                 where="$( gcc -print-file-name="${item}" )"
   162                 if [ "${where}" != "${item}" ]; then
   163                     where="$( readlink -e "${where}" )"
   164                     status=yes
   165                     break;
   166                 fi
   167                 printf "no\n"
   168             done
   169             ;;
   170     esac
   171 
   172     if [ -z "${status}" ]; then
   173         printf "\n${err:-${prog}${inc}${lib}: none found}\n\n"
   174         printf "Either you are missing entirely the needed tool,\n"
   175         printf "or the version you have is too old.\n"
   176         if [ -n "${var}" ]; then
   177             printf "You can give the path to this tool using: --with-${var}=PATH\n"
   178         fi
   179         printf "\n"
   180         return 1
   181     fi
   182 
   183     printf "${status}"
   184     if [ -n "${var}" ]; then
   185         eval ${var}='"'"${where}"'"'
   186         add_to_var_list "${var}"
   187     fi
   188     printf "\n"
   189 }
   190 
   191 # This function checks for a tool, and aborts if not found
   192 # See check_for(), above, for how to call has_or_abort
   193 has_or_abort() {
   194     if ! check_for "$@"; then
   195         # FORCE can be set in the environment
   196         [ -z "${FORCE}" ] && do_error "Bailing out..."
   197         printf "\n"
   198         printf "<*                                          *>\n"
   199         printf "<*            FORCE in action:              *>\n"
   200         printf "<* Continuing despite missing pre-requisite *>\n"
   201         printf "<*          Prepare for breakage            *>\n"
   202         printf "<*                                          *>\n"
   203         printf "\n"
   204     fi
   205 }
   206 
   207 do_help() {
   208     cat <<__EOF__
   209 \`configure' configures crosstool-NG-${VERSION} to adapt to many kind of systems.
   210 
   211 USAGE: ./configure [OPTION]...
   212 
   213 Defaults for the options are specified in brackets.
   214 
   215 Configuration:
   216   -h, --help              display this help and exit
   217       --force             force configure to continue, even in case
   218                           some pre-requisites are missing
   219 
   220 Installation directories:
   221   --prefix=PREFIX         install files in PREFIX [${PREFIX_DEFAULT}]
   222   --local                 don't install, and use current directory
   223 
   224 By default, \`make install' will install all the files in
   225 \`${PREFIX_DEFAULT}/bin', \`${PREFIX_DEFAULT}/lib' etc.  You can specify
   226 an installation prefix other than \`${PREFIX_DEFAULT}' using \`--prefix',
   227 for instance \`--prefix=\${HOME}'.
   228 
   229 For better control, use the options below.
   230 
   231 Fine tuning of the installation directories:
   232   --bindir=DIR            user executables [PREFIX/bin]
   233   --libdir=DIR            object code libraries [PREFIX/lib]
   234   --docdir=DIR            info documentation [PREFIX/share/doc]
   235   --mandir=DIR            man documentation [PREFIX/share/man]
   236 
   237 Optional Features:
   238   --with-install=PATH     Specify the full PATH to GNU install
   239   --with-make=PATH        Specify the full PATH to GNU make >= 3.80
   240   --with-grep=PATH        Specify the full PATH to GNU grep
   241   --with-sed=PATH         Specify the full PATH to GNU sed
   242   --with-bash=PATH        Specify the full PATH to bash >= 3.0
   243 __EOF__
   244 }
   245 
   246 #---------------------------------------------------------------------
   247 # Set user's options
   248 
   249 while [ $# -ne 0 ]; do
   250     case "$1" in
   251         --local)    LOCAL_set="y"; shift;;
   252         --prefix*)  set_prefix "$1" "$2" && shift || shift 2;;
   253         --bindir*)  set_bindir "$1" "$2" && shift || shift 2;;
   254         --libdir*)  set_libdir "$1" "$2" && shift || shift 2;;
   255         --docdir*)  set_docdir "$1" "$2" && shift || shift 2;;
   256         --mandir*)  set_mandir "$1" "$2" && shift || shift 2;;
   257         --with-*)   set_tool   "$1" "$2" && shift || shift 2;;
   258         --force)    FORCE=1; shift;;
   259         --help|-h)  do_help; exit 0;;
   260         *)          printf "Unrecognised option: '${1}'\n"; do_help; exit 1;;
   261     esac
   262 done
   263 
   264 # Use defaults
   265 [ -z "${PREFIX}" ] && set_prefix "" "${PREFIX_DEFAULT}"
   266 
   267 # Special case when installing locally
   268 if [ "${LOCAL_set}" = "y" ]; then
   269     set_prefix "" "$( pwd )"
   270     set_bindir "" "$( pwd )"
   271     set_libdir "" "$( pwd )"
   272     set_docdir "" "$( pwd )/docs"
   273     set_mandir "" "$( pwd )/docs"
   274 fi
   275 
   276 #---------------------------------------------------------------------
   277 # Some sanity checks, now
   278 
   279 # We check for grep and sed manually, because they are used in check_for()
   280 printf "Checking for 'grep'... "
   281 if [ -n "${grep}" ]; then
   282     printf "${grep} (cached)\n"
   283 else
   284     grep="$( which grep 2>/dev/null )"
   285     if [ -z "${grep}" ]; then
   286         printf "not found\n"
   287     else
   288         printf "${grep}\n"
   289         printf "Checking whether '${grep}' supports -E... "
   290         if echo 'foo' |"${grep}" -E 'foo' >/dev/null 2>&1; then
   291             printf "yes\n"
   292         else
   293             printf "no\n"
   294             grep=
   295         fi
   296     fi
   297 fi
   298 if [ -z "${grep}" ]; then
   299     printf "Either you are missing entirely the needed tool,\n"
   300     printf "or the version you have is too old.\n"
   301     printf "You can give the path to this tool using: --with-grep=PATH\n"
   302     do_error "Bailing out..."
   303 fi
   304 add_to_var_list grep
   305 
   306 printf "Checking for 'sed'... "
   307 if [ -n "${sed}" ]; then
   308     printf "${sed} (cached)\n"
   309 else
   310     sed="$( which sed 2>/dev/null )"
   311     if [ -z "${sed}" ]; then
   312         printf "not found\n"
   313     else
   314         printf "${sed}\n"
   315         printf "Checking whether '${sed}' supports -i and -e... "
   316         touch .ct-ng.sed.test
   317         if "${sed}" -r -i -e 's/foo/bar/' .ct-ng.sed.test >/dev/null 2>&1; then
   318             printf "yes\n"
   319         else
   320             printf "no\n"
   321             sed=
   322         fi
   323         rm -f .ct-ng.sed.test
   324     fi
   325 fi
   326 if [ -z "${sed}" ]; then
   327     printf "Either you are missing entirely the needed tool,\n"
   328     printf "or the version you have is too old.\n"
   329     printf "You can give the path to this tool using: --with-sed=PATH\n"
   330     do_error "Bailing out..."
   331 fi
   332 add_to_var_list sed
   333 
   334 # The regular list of tools we can now easily check for
   335 has_or_abort prog=bash                              \
   336              var=bash                               \
   337              ver='^GNU bash, version (3\.[1-9]|4)'  \
   338              err="'bash' 3.1 or above was not found"
   339 has_or_abort prog=cut
   340 has_or_abort prog=install var=install
   341 has_or_abort prog=make                                  \
   342              var=make                                   \
   343              ver='^GNU Make (3.[89][[:digit:]]|[4-9])'  \
   344              err="GNU 'make' 3.80 or above was not found"
   345 has_or_abort prog=gcc
   346 has_or_abort prog="awk gawk" ver='^GNU Awk' err="GNU 'awk' was not found"
   347 has_or_abort prog=bison
   348 has_or_abort prog=flex
   349 has_or_abort prog=makeinfo
   350 has_or_abort prog=automake                                                      \
   351              ver='\(GNU automake\) (1\.[[:digit:]]{2,}|[2-9][[:digit:]]*\.)'    \
   352              err="'automake' 1.10 or above was not found"
   353 has_or_abort prog=libtool                                                                           \
   354              ver='\(GNU libtool.*\) (2[[:digit:]]*\.|1\.6[[:digit:]]*\.|1\.5\.[2-9][[:digit:]]+)'   \
   355              err="'libtool' 1.5.26 or above was not found"
   356 has_or_abort prog=stat ver='GNU coreutils'
   357 has_or_abort prog="curl wget"
   358 has_or_abort prog=cvs
   359 has_or_abort prog=patch
   360 has_or_abort prog=tar
   361 has_or_abort prog=gzip
   362 has_or_abort prog=bzip2
   363 has_or_abort prog=lzma
   364 has_or_abort prog=readlink
   365 
   366 has_or_abort inc="ncurses/ncurses.h ncurses/curses.h ncurses.h curses.h"    \
   367              err="'ncurses' headers files were not found"
   368 
   369 ncurses_libs="$( for l in ncursesw ncurses curses; do   \
   370                      for x in so a dylib; do            \
   371                          printf "lib$l.$x ";            \
   372                      done;                              \
   373                  done                                   \
   374                )"
   375 has_or_abort lib="${ncurses_libs}"                  \
   376              err="'ncurses' library was not found"
   377 
   378 #---------------------------------------------------------------------
   379 # Compute the version string
   380 
   381 # If this version is n hg clone, try to get the revision number
   382 # If we can't get the revision number, use date
   383 case "${VERSION}" in
   384     *+hg|hg)
   385         has_or_abort prog=hg
   386         printf "Computing version string... "
   387         REVISION="$( hg id -n 2>/dev/null )"
   388         case "${REVISION}" in
   389             "")
   390                 VERSION="${VERSION}_unknown@$( date +%Y%m%d.%H%M%S )";;
   391             *)
   392                 VERSION="${VERSION}_$( hg id -b )@${REVISION%%+}_$( hg id -i )"
   393                 ;;
   394         esac
   395         # Arrange to have no / in the directory name, no need to create an
   396         # arbitrarily deep directory structure
   397         VERSION="$( printf "${VERSION}\n" |"${sed}" -r -e 's|/+|_|g;' )"
   398         ;;
   399 esac
   400 echo "${VERSION}"
   401 
   402 #---------------------------------------------------------------------
   403 # Compute and check install paths
   404 
   405 # Now we have the version string, we can build up the paths
   406 [ -z "${BINDIR_set}" ] && BINDIR="${PREFIX}/bin"
   407 [ -z "${LIBDIR_set}" ] && LIBDIR="${PREFIX}/lib/ct-ng-${VERSION}"
   408 [ -z "${DOCDIR_set}" ] && DOCDIR="${PREFIX}/share/doc/ct-ng-${VERSION}"
   409 [ -z "${MANDIR_set}" ] && MANDIR="${PREFIX}/share/man/man1"
   410 
   411 # Check that install PATHs are absolute
   412 for p in BIN LIB DOC MAN; do
   413     var="${p}DIR"
   414     eval v='"${'"${var}"'}"'
   415     case "${v}" in
   416         /*) ;;
   417         *)  do_error "'${var}' is not an absolute path: '${v}'"
   418     esac
   419 done
   420 
   421 #---------------------------------------------------------------------
   422 # That's all, folks!
   423 
   424 printf "Building up Makefile... "
   425 var_sed="$( for var_name in ${var_list}; do
   426                 eval echo 's,@@${var_name}@@,${'"${var_name}"'},g'
   427             done 
   428           )"
   429 "${sed}" -r -e "s,@@BINDIR@@,${BINDIR},g
   430                 s,@@LIBDIR@@,${LIBDIR},g
   431                 s,@@DOCDIR@@,${DOCDIR},g
   432                 s,@@MANDIR@@,${MANDIR},g
   433                 s,@@VERSION@@,${VERSION},g
   434                 s,@@DATE@@,${DATE},g
   435                 ${var_sed}
   436                 s,@@LOCAL@@,${LOCAL_set},g"  Makefile.in >Makefile
   437 echo "done"
   438 
   439 cat <<__EOF__
   440 
   441 crosstool-NG configured as follows:
   442   PREFIX='${PREFIX}'
   443   BINDIR='${BINDIR}'
   444   LIBDIR='${LIBDIR}'
   445   DOCDIR='${DOCDIR}'
   446   MANDIR='${MANDIR}'
   447 
   448 Now run:
   449   make
   450 __EOF__
   451 if [ "${LOCAL_set}" != "y" ]; then
   452     printf "  make install\n"
   453 fi