configure
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sat Sep 24 21:47:47 2011 +0200 (2011-09-24)
branch1.11
changeset 2679 9fd11a562b78
parent 2203 ac3e215141a1
permissions -rwxr-xr-x
1.11: close branch

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
     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 "${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         # Skip, auto-stuff compatibility
   261         --build=*|--host=*|--infodir=*|--datadir=*|--sysconfdir=*|--localstatedir=*) shift;;
   262         --build|--host|--infodir|--datadir|--sysconfdir|--localstatedir)             shift 2;;
   263         --enable-shared|--disable-shared|--enable-static|--disable-static)           shift;;
   264         *)          printf "Unrecognised option: '${1}'\n"; do_help; exit 1;;
   265     esac
   266 done
   267 
   268 # Use defaults
   269 [ -z "${PREFIX}" ] && set_prefix "" "${PREFIX_DEFAULT}"
   270 
   271 # Special case when installing locally
   272 if [ "${LOCAL_set}" = "y" ]; then
   273     set_prefix "" "$( pwd )"
   274     set_bindir "" "$( pwd )"
   275     set_libdir "" "$( pwd )"
   276     set_docdir "" "$( pwd )/docs"
   277     set_mandir "" "$( pwd )/docs"
   278 fi
   279 
   280 #---------------------------------------------------------------------
   281 # Some sanity checks, now
   282 
   283 # We check for grep and sed manually, because they are used in check_for()
   284 printf "Checking for 'grep'... "
   285 if [ -n "${grep}" ]; then
   286     printf "${grep} (cached)\n"
   287 else
   288     grep="$( which grep 2>/dev/null )"
   289     if [ -z "${grep}" ]; then
   290         printf "not found\n"
   291     else
   292         printf "${grep}\n"
   293         printf "Checking whether '${grep}' supports -E... "
   294         if echo 'foo' |"${grep}" -E 'foo' >/dev/null 2>&1; then
   295             printf "yes\n"
   296         else
   297             printf "no\n"
   298             grep=
   299         fi
   300     fi
   301 fi
   302 if [ -z "${grep}" ]; then
   303     printf "Either you are missing entirely the needed tool,\n"
   304     printf "or the version you have is too old.\n"
   305     printf "You can give the path to this tool using: --with-grep=PATH\n"
   306     do_error "Bailing out..."
   307 fi
   308 add_to_var_list grep
   309 
   310 printf "Checking for 'sed'... "
   311 if [ -n "${sed}" ]; then
   312     printf "${sed} (cached)\n"
   313 else
   314     sed="$( which sed 2>/dev/null )"
   315     if [ -z "${sed}" ]; then
   316         printf "not found\n"
   317     else
   318         printf "${sed}\n"
   319         printf "Checking whether '${sed}' supports -i and -e... "
   320         touch .ct-ng.sed.test
   321         if "${sed}" -r -i -e 's/foo/bar/' .ct-ng.sed.test >/dev/null 2>&1; then
   322             printf "yes\n"
   323         else
   324             printf "no\n"
   325             sed=
   326         fi
   327         rm -f .ct-ng.sed.test
   328     fi
   329 fi
   330 if [ -z "${sed}" ]; then
   331     printf "Either you are missing entirely the needed tool,\n"
   332     printf "or the version you have is too old.\n"
   333     printf "You can give the path to this tool using: --with-sed=PATH\n"
   334     do_error "Bailing out..."
   335 fi
   336 add_to_var_list sed
   337 
   338 # The regular list of tools we can now easily check for
   339 has_or_abort prog=bash                              \
   340              var=bash                               \
   341              ver='^GNU bash, version (3\.[1-9]|4)'  \
   342              err="'bash' 3.1 or above was not found"
   343 has_or_abort prog=cut
   344 has_or_abort prog=install var=install
   345 has_or_abort prog=make                                  \
   346              var=make                                   \
   347              ver='^GNU Make (3.[89][[:digit:]]|[4-9])'  \
   348              err="GNU 'make' 3.80 or above was not found"
   349 has_or_abort prog=gcc
   350 has_or_abort prog="awk gawk" ver='^GNU Awk' err="GNU 'awk' was not found"
   351 has_or_abort prog=bison
   352 has_or_abort prog=flex
   353 has_or_abort prog=makeinfo
   354 has_or_abort prog=automake                                                      \
   355              ver='\(GNU automake\) (1\.[[:digit:]]{2,}|[2-9][[:digit:]]*\.)'    \
   356              err="'automake' 1.10 or above was not found"
   357 has_or_abort prog=libtool                                                                           \
   358              var=libtool                                                                            \
   359              ver='\(GNU libtool.*\) (2[[:digit:]]*\.|1\.6[[:digit:]]*\.|1\.5\.[2-9][[:digit:]]+)'   \
   360              err="'libtool' 1.5.26 or above was not found"
   361 has_or_abort prog=stat
   362 has_or_abort prog="curl wget"
   363 has_or_abort prog=cvs
   364 has_or_abort prog=patch
   365 has_or_abort prog=tar
   366 has_or_abort prog=gzip
   367 has_or_abort prog=bzip2
   368 has_or_abort prog=lzma
   369 has_or_abort prog=readlink
   370 has_or_abort prog=objcopy var=objcopy
   371 has_or_abort prog=objdump var=objdump
   372 has_or_abort prog=readelf var=readelf
   373 has_or_abort prog=patch var=patch
   374 
   375 has_or_abort inc="ncurses/ncurses.h ncurses/curses.h ncurses.h curses.h"    \
   376              err="'ncurses' headers files were not found"
   377 
   378 ncurses_libs="$( for l in ncursesw ncurses curses; do   \
   379                      for x in so a dylib; do            \
   380                          printf "lib$l.$x ";            \
   381                      done;                              \
   382                  done                                   \
   383                )"
   384 has_or_abort lib="${ncurses_libs}"                  \
   385              err="'ncurses' library was not found"
   386 
   387 #---------------------------------------------------------------------
   388 # Compute the version string
   389 
   390 # If this version is n hg clone, try to get the revision number
   391 # If we can't get the revision number, use date
   392 printf "Computing version string... "
   393 case "${VERSION}" in
   394     *+hg|hg)
   395         REVISION="$( hg id -n 2>/dev/null || true )"
   396         case "${REVISION}" in
   397             "")
   398                 VERSION="${VERSION}_unknown@$( date +%Y%m%d.%H%M%S )";;
   399             *)
   400                 VERSION="${VERSION}_$( hg id -b )@${REVISION%%+}_$( hg id -i )"
   401                 ;;
   402         esac
   403         # Arrange to have no / in the directory name, no need to create an
   404         # arbitrarily deep directory structure
   405         VERSION="$( printf "${VERSION}\n" |"${sed}" -r -e 's|/+|_|g;' )"
   406         ;;
   407 esac
   408 printf "${VERSION}\n"
   409 
   410 #---------------------------------------------------------------------
   411 # Compute and check install paths
   412 
   413 # Now we have the version string, we can build up the paths
   414 [ -z "${BINDIR_set}" ] && BINDIR="${PREFIX}/bin"
   415 [ -z "${LIBDIR_set}" ] && LIBDIR="${PREFIX}/lib"
   416 [ -z "${DOCDIR_set}" ] && DOCDIR="${PREFIX}/share/doc"
   417 [ -z "${MANDIR_set}" ] && MANDIR="${PREFIX}/share/man"
   418 
   419 # Install support files in our own sub-dir, so as not to mangle (system)
   420 # files and dirs, but only if not --local
   421 if [ -z "${LOCAL_set}" ]; then
   422     LIBDIR="${LIBDIR}/ct-ng-${VERSION}"
   423     DOCDIR="${DOCDIR}/ct-ng-${VERSION}"
   424 fi
   425 
   426 # Check that install PATHs are absolute
   427 for p in BIN LIB DOC MAN; do
   428     var="${p}DIR"
   429     eval v='"${'"${var}"'}"'
   430     case "${v}" in
   431         /*) ;;
   432         *)  do_error "'${var}' is not an absolute path: '${v}'"
   433     esac
   434 done
   435 
   436 #---------------------------------------------------------------------
   437 # That's all, folks!
   438 
   439 printf "Building up Makefile... "
   440 var_sed="$( for var_name in ${var_list}; do
   441                 eval echo 's,@@${var_name}@@,${'"${var_name}"'},g'
   442             done 
   443           )"
   444 "${sed}" -r -e "s,@@BINDIR@@,${BINDIR},g
   445                 s,@@LIBDIR@@,${LIBDIR},g
   446                 s,@@DOCDIR@@,${DOCDIR},g
   447                 s,@@MANDIR@@,${MANDIR},g
   448                 s,@@VERSION@@,${VERSION},g
   449                 s,@@DATE@@,${DATE},g
   450                 ${var_sed}
   451                 s,@@LOCAL@@,${LOCAL_set},g"  Makefile.in >Makefile
   452 echo "done"
   453 
   454 cat <<__EOF__
   455 
   456 crosstool-NG configured as follows:
   457   PREFIX='${PREFIX}'
   458   BINDIR='${BINDIR}'
   459   LIBDIR='${LIBDIR}'
   460   DOCDIR='${DOCDIR}'
   461   MANDIR='${MANDIR}'
   462 
   463 Now run:
   464   make
   465 __EOF__
   466 if [ "${LOCAL_set}" != "y" ]; then
   467     printf "  make install\n"
   468 fi