configure
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Fri Sep 04 17:27:16 2009 +0200 (2009-09-04)
changeset 1512 439a6b292917
parent 1432 76f8feef64c4
parent 1477 232ba0dc96b1
child 1560 79a609170a83
permissions -rwxr-xr-x
TODO: update

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