configure
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Apr 26 10:47:54 2009 +0000 (2009-04-26)
branch1.4
changeset 1308 5a2255049210
parent 1299 3448ac3f1a5d
child 1311 bcd9c49d74ef
child 1450 0505b0d5cd63
permissions -rwxr-xr-x
1.4: update version to 1.4.0+svn.

-------- diffstat follows --------
/branches/1.4/.version | 2 1 1 0 +-
1 file changed, 1 insertion(+), 1 deletion(-)
yann@182
     1
#!/bin/sh
yann@182
     2
yann@1105
     3
VERSION=$( cat .version )
yann@1105
     4
DATE=$( date +%Y%m%d )
yann@182
     5
yann@673
     6
# All absolutely required tools, one per line to ease diff.
yann@1299
     7
# See function 'has_or_abort', below, for syntax
yann@673
     8
#  - Hopefully, if gcc is present, then all associated tools will be
yann@673
     9
#  - makeinfo for building docs, even if discarded later on
yann@673
    10
#  - others obvious... :-/
yann@876
    11
#
yann@876
    12
# Format of a pattern to check for, one per line:
yann@1140
    13
#   pattern := var_name : tool_pattern  OR  tool_pattern
yann@1140
    14
#   tool_pattern := tool_test  OR  tool_pattern || tool_test
yann@1105
    15
#   tool_test := tool=regexp OR tool
yann@1105
    16
#   tool := basename of the tool  OR  absolute pathname to the tool
yann@1105
    17
#   regexp := valid grep(1) extended regular expression, $( tool --version)
yann@1105
    18
#             will be matched against this regexp.
yann@876
    19
#
yann@1106
    20
# In case a pattern list is given (eg foo || bar || buz), then tests are performed
yann@876
    21
# from left to right, stopping at the first matching test (like the shell
yann@876
    22
# would parse 'foo || bar || buz' ).
yann@876
    23
#
yann@876
    24
# Examples:
yann@1140
    25
#    bash:bash=^GNU bash, version 3\.
yann@1140
    26
#     - if ${bash} is set and non-null, does nothing
yann@1213
    27
#     - else ensures that bash exists in the PATH, and that $( bash --version )
yann@876
    28
#       matches the regexp '^GNU bash, version 3\.'
yann@1140
    29
#       - if so, then sets bash="$( which bash )"
yann@1106
    30
#    autoconf=(GNU Autoconf) || autoconf2.50
yann@1140
    31
#     - does not look at an existing variable
yann@1140
    32
#     - ensures that:
yann@1213
    33
#         - 'autoconf' is to be found in the PATH, and that $( autoconf --version )
yann@1105
    34
#           matches the regexp '(GNU Autoconf)' (which btw is the signature of
yann@1105
    35
#           autoconf >= 2.50),
yann@876
    36
#       OR that:
yann@876
    37
#         - 'autoconf2.50' is to be found in the PATH
yann@876
    38
#
yann@673
    39
TOOLS_TO_CHECK='
yann@1213
    40
bash:bash=^GNU bash, version [34]\.
yann@1106
    41
cut
yann@1106
    42
xargs
yann@1140
    43
install:install=GNU coreutils
yann@1140
    44
make:make=^GNU Make
yann@1105
    45
gcc
yann@1299
    46
awk
yann@1105
    47
bison
yann@1105
    48
flex
yann@1105
    49
makeinfo
yann@1106
    50
automake=\(GNU automake\) (1\.[[:digit:]]{2,}\.|[2-9][[:digit:]]*\.)
yann@1255
    51
libtool=\(GNU libtool.*\) (2[[:digit:]]*\.|1\.6[[:digit:]]*\.|1\.5\.[2-9][[:digit:]]+)
yann@1106
    52
curl || wget
yann@1105
    53
patch
yann@1105
    54
tar
yann@1105
    55
gzip
yann@1105
    56
bzip2
yann@673
    57
'
yann@673
    58
yann@183
    59
PREFIX_DEFAULT=/usr/local
yann@182
    60
yann@182
    61
BINDIR_set=
yann@182
    62
LIBDIR_set=
yann@182
    63
DOCDIR_set=
yann@182
    64
MANDIR_set=
yann@285
    65
LOCAL_set=
yann@182
    66
yann@641
    67
do_quit=
yann@614
    68
yann@673
    69
# Simply print the error message, and exit. Obvious, he?
yann@673
    70
do_error() {
yann@673
    71
    echo "${@}"
yann@673
    72
    exit 1
yann@673
    73
}
yann@673
    74
yann@673
    75
# A small function to test for existence of various tools
yann@876
    76
# Usage: has_or_abort test_pattern (see top of file, TOOLS_TO_CHECK, for
yann@876
    77
#                                   complete pattern format)
yann@673
    78
has_or_abort() {
yann@1140
    79
    local save_IFS
yann@1140
    80
    local var_name
yann@1140
    81
    local var_value
yann@1140
    82
    local tool_pattern
yann@1140
    83
    local field
yann@1140
    84
yann@1151
    85
    var_name="$( echo "${1}" |"${sed}" -r -e 's/^(([^=:]+):.+|[^:=]+=.+|[^:=]+)$/\2/;' )"
yann@1140
    86
    field="${var_name:+2}"
yann@1140
    87
    field="${field:-1}"
yann@1140
    88
    tool_pattern="$( echo "${1}" |cut -d : -f ${field}- |"${sed}" -r -e 's/ *\|\| */\n/g;' )"
yann@1140
    89
yann@1105
    90
    save_IFS="${IFS}"
yann@1140
    91
    # Set IFS to \n only
yann@1106
    92
    IFS='
yann@1106
    93
'
yann@1106
    94
    for item in ${tool_pattern}; do
yann@1105
    95
        case "${item}" in
yann@1105
    96
            *=*)
yann@1105
    97
                tool="${item%%=*}"
yann@1105
    98
                regexp="${item#*=}"
yann@1105
    99
                ;;
yann@1105
   100
            *)  tool="${item}"
yann@1105
   101
                regexp=
yann@1105
   102
                ;;
yann@1105
   103
        esac
yann@1140
   104
yann@1105
   105
        printf "Checking for '${tool}'... "
yann@1140
   106
        if [ -n "${var_name}" ]; then
yann@1140
   107
            eval var_value='"${'"${var_name}"'}"'
yann@1140
   108
            if [ -n "${var_value}" ]; then
yann@1140
   109
                echo "${var_value} (cached)"
yann@1140
   110
                return 0
yann@1140
   111
            fi
yann@1140
   112
        fi
yann@1105
   113
        where=$( which "${tool}" 2>/dev/null )
yann@1105
   114
        if [ -z "${where}" ]; then
yann@1105
   115
            echo "not found"
yann@1105
   116
            where=
yann@1105
   117
            continue
yann@1106
   118
        elif [ -n "${regexp}" ]; then
yann@1106
   119
            tool_version=$( ${tool} --version 2>&1 )
yann@1106
   120
            str=$( echo "${tool_version}" |"${grep}" -E "${regexp}" |head -n 1 )
yann@1106
   121
            if [ -z "${str}" ]; then
yann@1106
   122
                echo "not found"
yann@1106
   123
                where=""
yann@1106
   124
                continue
yann@1105
   125
            fi
yann@1105
   126
        fi
yann@1106
   127
        break
yann@1140
   128
    done
yann@1106
   129
    if [ -z "${where}" ]; then
yann@1106
   130
        for item in ${tool_pattern}; do
yann@1106
   131
            case "${item}" in
yann@1106
   132
                *=*)
yann@1106
   133
                    tool="${item%%=*}"
yann@1106
   134
                    regexp="${item#*=}"
yann@1106
   135
                    ;;
yann@1106
   136
                *)  tool="${item}"
yann@1106
   137
                    regexp=
yann@1106
   138
                    ;;
yann@1106
   139
            esac
yann@1151
   140
            printf "  could not find '${tool}'"
yann@1151
   141
            [ -n "${regexp}" ] && printf " matching regexp '${regexp}'"
yann@1151
   142
            echo
yann@1106
   143
        done
yann@1106
   144
        echo "Either you are missing entirely the needed tool,"
rpjday@1288
   145
        echo "or the version you have is too old."
yann@1151
   146
        if [ -n "${var_name}" ]; then
yann@1151
   147
            echo "You can give the path to this tool using: --with-${var_name}=PATH"
yann@1151
   148
        fi
yann@1132
   149
        # FORCE can be set in the environment
yann@1132
   150
        [ -z "${FORCE}" ] && do_error "Bailing out..."
yann@1140
   151
    else
yann@1140
   152
        echo "${where}"
yann@1140
   153
        if [ -n "${var_name}" ]; then
yann@1140
   154
            eval ${var_name}='"'"${where}"'"'
yann@1140
   155
        fi
yann@1106
   156
    fi
yann@1105
   157
    IFS="${save_IFS}"
yann@673
   158
    return 0
yann@673
   159
}
yann@673
   160
yann@641
   161
# Given an option string and the following argument,
yann@641
   162
# echoes the value of the option.
yann@641
   163
# If --var=val => echoes val and returns 0, meaning second arg was not consumed
yann@641
   164
# If --var val => echoes val and returns non null, meaning second arg was used
yann@182
   165
get_optval(){
yann@182
   166
    case "$1" in
yann@182
   167
        --*=?*)
yann@1140
   168
            echo "${1#*=}"
yann@1105
   169
            return 0
yann@182
   170
            ;;
yann@182
   171
        *)
yann@182
   172
            echo "${2}"
yann@1105
   173
            return 1
yann@182
   174
            ;;
yann@182
   175
    esac
yann@182
   176
}
yann@182
   177
yann@641
   178
# The set_xxx functions will set the corresponding configuration variable
yann@641
   179
# They return 0 if second arg was not consumed, and non-zero if it was consumed.
yann@182
   180
set_prefix() {
yann@1105
   181
    PREFIX="$( get_optval "$1" "$2" )"
yann@182
   182
}
yann@182
   183
set_bindir() {
yann@376
   184
    BINDIR_set=1
yann@1105
   185
    BINDIR="$( get_optval "$1" "$2" )"
yann@182
   186
}
yann@182
   187
set_libdir() {
yann@376
   188
    LIBDIR_set=1
yann@1105
   189
    LIBDIR="$( get_optval "$1" "$2" )"
yann@182
   190
}
yann@182
   191
set_docdir() {
yann@376
   192
    DOCDIR_set=1
yann@1105
   193
    DOCDIR="$( get_optval "$1" "$2" )"
yann@182
   194
}
yann@182
   195
set_mandir() {
yann@376
   196
    MANDIR_set=1
yann@1105
   197
    MANDIR="$( get_optval "$1" "$2" )"
yann@182
   198
}
yann@1140
   199
set_tool() {
yann@1140
   200
    local var_name="${1%%=*}"
yann@1140
   201
    var_name="${var_name#--with-}"
yann@1140
   202
    eval ${var_name}="\$( get_optval "$1" "$2" )"
yann@614
   203
}
yann@614
   204
yann@183
   205
do_help() {
yann@183
   206
    cat <<__EOF__
yann@1140
   207
\`configure' configures crosstool-NG-${VERSION} to adapt to many kind of systems.
yann@183
   208
yann@183
   209
USAGE: ./configure [OPTION]...
yann@183
   210
yann@183
   211
Defaults for the options are specified in brackets.
yann@183
   212
yann@183
   213
Configuration:
yann@1105
   214
  -h, --help              display this help and exit
yann@615
   215
yann@615
   216
Installation directories:
yann@185
   217
  --prefix=PREFIX         install files in PREFIX [${PREFIX_DEFAULT}]
yann@285
   218
  --local                 don't install, and use current directory
yann@183
   219
yann@183
   220
By default, \`make install' will install all the files in
yann@183
   221
\`${PREFIX_DEFAULT}/bin', \`${PREFIX_DEFAULT}/lib' etc.  You can specify
yann@183
   222
an installation prefix other than \`${PREFIX_DEFAULT}' using \`--prefix',
yann@183
   223
for instance \`--prefix=\${HOME}'.
yann@183
   224
yann@183
   225
For better control, use the options below.
yann@183
   226
yann@183
   227
Fine tuning of the installation directories:
yann@683
   228
  --bindir=DIR            user executables [PREFIX/bin]
yann@683
   229
  --libdir=DIR            object code libraries [PREFIX/lib]
yann@683
   230
  --docdir=DIR            info documentation [PREFIX/share/doc]
yann@683
   231
  --mandir=DIR            man documentation [PREFIX/share/man]
yann@614
   232
yann@614
   233
Optional Features:
yann@1140
   234
  --with-install=PATH     Specify the full PATH to GNU install
yann@1140
   235
  --with-make=PATH        Specify the full PATH to GNU make
yann@1140
   236
  --with-grep=PATH        Specify the full PATH to GNU grep
yann@1140
   237
  --with-sed=PATH         Specify the full PATH to GNU sed
yann@1140
   238
  --with-bash=PATH        Specify the full PATH to bash >= 3.0
yann@183
   239
__EOF__
yann@183
   240
}
yann@183
   241
yann@376
   242
#---------------------------------------------------------------------
yann@376
   243
# Set user's options
yann@376
   244
yann@182
   245
while [ $# -ne 0 ]; do
yann@182
   246
    case "$1" in
yann@1297
   247
        --local)    LOCAL_set="y"; shift;;
yann@182
   248
        --prefix*)  set_prefix "$1" "$2" && shift || shift 2;;
yann@182
   249
        --bindir*)  set_bindir "$1" "$2" && shift || shift 2;;
yann@182
   250
        --libdir*)  set_libdir "$1" "$2" && shift || shift 2;;
yann@182
   251
        --docdir*)  set_docdir "$1" "$2" && shift || shift 2;;
yann@182
   252
        --mandir*)  set_mandir "$1" "$2" && shift || shift 2;;
yann@1140
   253
        --with-*)   set_tool   "$1" "$2" && shift || shift 2;;
yann@183
   254
        --help|-h)  do_help; exit 0;;
yann@1140
   255
        *)          echo "Unrecognised option: '${1}'"; do_help; exit 1;;
yann@182
   256
    esac
yann@182
   257
done
yann@182
   258
yann@641
   259
# Use defaults
yann@185
   260
[ -z "${PREFIX}" ] && set_prefix "" "${PREFIX_DEFAULT}"
yann@641
   261
yann@641
   262
# Special case when installing locally
yann@1297
   263
if [ "${LOCAL_set}" = "y" ]; then
yann@1105
   264
    set_prefix "" "$( pwd )"
yann@1105
   265
    set_bindir "" "$( pwd )"
yann@1105
   266
    set_libdir "" "$( pwd )"
yann@1105
   267
    set_docdir "" "$( pwd )/docs"
yann@1105
   268
    set_mandir "" "$( pwd )/docs"
yann@285
   269
fi
yann@183
   270
yann@376
   271
#---------------------------------------------------------------------
yann@1140
   272
# Some sanity checks, now
yann@1106
   273
yann@1140
   274
# We check for grep and sed manually, because they are used in has_or_abort
yann@1140
   275
printf "Checking for 'grep'... "
yann@1140
   276
if [ -n "${grep}" ]; then
yann@1140
   277
    echo "${grep} (cached)"
yann@1140
   278
else
yann@1140
   279
    grep="$( which grep 2>/dev/null )"
yann@1187
   280
    if [ -z "${grep}" ]; then
yann@1187
   281
        echo "not found"
yann@1187
   282
    else
yann@1187
   283
        echo "${grep}"
yann@1187
   284
        printf "Checking whether '${grep}' supports -E... "
yann@1187
   285
        if echo 'foo' |"${grep}" -E 'foo' >/dev/null 2>&1; then
yann@1187
   286
            echo "yes"
yann@1187
   287
        else
yann@1187
   288
            echo "no"
yann@1187
   289
            grep=
yann@1187
   290
        fi
yann@1187
   291
    fi
yann@1106
   292
fi
yann@1187
   293
if [ -z "${grep}" ]; then
yann@1187
   294
    echo "Either you are missing entirely the needed tool,"
rpjday@1288
   295
    echo "or the version you have is too old."
yann@1187
   296
    echo "You can give the path to this tool using: --with-grep=PATH"
yann@1187
   297
    do_error "Bailing out..."
yann@1140
   298
fi
yann@1140
   299
yann@1140
   300
printf "Checking for 'sed'... "
yann@1140
   301
if [ -n "${sed}" ]; then
yann@1140
   302
    echo "${sed} (cached)"
yann@1140
   303
else
yann@1140
   304
    sed="$( which sed 2>/dev/null )"
yann@1187
   305
    if [ -z "${sed}" ]; then
yann@1187
   306
        echo "not found"
yann@1187
   307
    else
yann@1187
   308
        echo "${sed}"
rpjday@1288
   309
        printf "Checking whether '${sed}' supports -i and -e... "
yann@1187
   310
        touch .ct-ng.sed.test
yann@1187
   311
        if "${sed}" -r -i -e 's/foo/bar/' .ct-ng.sed.test >/dev/null 2>&1; then
yann@1187
   312
            echo "yes"
yann@1187
   313
        else
yann@1187
   314
            echo "no"
yann@1187
   315
            sed=
yann@1187
   316
        fi
yann@1187
   317
        rm -f .ct-ng.sed.test
yann@1187
   318
    fi
yann@1140
   319
fi
yann@1187
   320
if [ -z "${sed}" ]; then
yann@1187
   321
    echo "Either you are missing entirely the needed tool,"
rpjday@1288
   322
    echo "or the version you have is too old."
yann@1187
   323
    echo "You can give the path to this tool using: --with-sed=PATH"
yann@1187
   324
    do_error "Bailing out..."
yann@1140
   325
fi
yann@1140
   326
yann@1140
   327
# Check the existence of absolutely required tools
yann@1140
   328
save_IFS="${IFS}"
yann@1140
   329
IFS='
yann@1140
   330
'
yann@1140
   331
for tool in ${TOOLS_TO_CHECK}; do
yann@1140
   332
    has_or_abort "${tool}"
yann@1140
   333
done
yann@1140
   334
IFS="${save_IFS}"
yann@1106
   335
yann@1106
   336
#---------------------------------------------------------------------
yann@1106
   337
# Compute the version string
yann@376
   338
yann@435
   339
# If this version is a svn snapshot, try to get the revision number
yann@435
   340
# If we can't get the revision number, use date
yann@641
   341
printf "Computing version string... "
yann@435
   342
case "${VERSION}" in
yann@1105
   343
    *+svn|svn)
yann@1105
   344
        REVISION="$( LC_ALL=C svnversion )"
yann@1105
   345
        case "${REVISION}" in
yann@1105
   346
            exported)
yann@1105
   347
                VERSION="${VERSION}_unknown@$( date +%Y%m%d.%H%M%S )";;
yann@1105
   348
            *)
yann@1105
   349
                URL="$( LC_ALL=C svn info 2>/dev/null   \
yann@1105
   350
                                 |egrep 'URL: '         \
yann@1105
   351
                                 |cut -d ' ' -f 2-      \
yann@1105
   352
                      )"
yann@1106
   353
                ROOT="$( LC_ALL=C svn info 2>/dev/null      \
yann@1106
   354
                         |"${grep}" '^Repository Root: '    \
yann@1106
   355
                         |cut -d ' ' -f 3-                  \
yann@1105
   356
                       )"
yann@1105
   357
                VERSION="${VERSION}${URL#${ROOT}}@${REVISION}"
yann@1105
   358
                ;;
yann@1105
   359
        esac
yann@1105
   360
        # Arrange to have no / in the directory name, no need to create an
yann@1105
   361
        # arbitrarily deep directory structure
yann@1106
   362
        VERSION="$( echo "${VERSION}" |"${sed}" -r -e 's|/+|_|g;' )"
yann@444
   363
        ;;
yann@435
   364
esac
yann@553
   365
echo "${VERSION}"
yann@435
   366
yann@1106
   367
#---------------------------------------------------------------------
yann@1106
   368
# Compute and check install paths
yann@1106
   369
yann@614
   370
# Now we have the version string, we can build up the paths
yann@554
   371
[ -z "${BINDIR_set}" ] && BINDIR="${PREFIX}/bin"
yann@554
   372
[ -z "${LIBDIR_set}" ] && LIBDIR="${PREFIX}/lib/ct-ng-${VERSION}"
yann@554
   373
[ -z "${DOCDIR_set}" ] && DOCDIR="${PREFIX}/share/doc/ct-ng-${VERSION}"
yann@554
   374
[ -z "${MANDIR_set}" ] && MANDIR="${PREFIX}/share/man/man1"
yann@554
   375
yann@1047
   376
# Check that install PATHs are absolute
yann@1047
   377
for p in BIN LIB DOC MAN; do
yann@1105
   378
    var="${p}DIR"
yann@1105
   379
    eval v='"${'"${var}"'}"'
yann@1105
   380
    case "${v}" in
yann@1105
   381
        /*) ;;
yann@1105
   382
        *)  do_error "'${var}' is not an absolute path: '${v}'"
yann@1105
   383
    esac
yann@1047
   384
done
yann@1047
   385
yann@1106
   386
#---------------------------------------------------------------------
yann@1106
   387
# That's all, folks!
yann@614
   388
yann@641
   389
printf "Building up Makefile... "
yann@1140
   390
var_list="grep
yann@1140
   391
          sed
yann@1140
   392
          $( printf "${TOOLS_TO_CHECK}"                                 \
yann@1151
   393
             |"${sed}" -r -e 's/^(([^=:]+):.+|[^:=]+=.+|[^:=]+)$/\2/;'
yann@1140
   394
           )"
yann@1140
   395
var_sed="$( for var_name in ${var_list}; do
yann@1140
   396
                eval echo 's,@@${var_name}@@,${'"${var_name}"'},g'
yann@1140
   397
            done 
yann@1140
   398
          )"
yann@1106
   399
"${sed}" -r -e "s,@@BINDIR@@,${BINDIR},g
yann@1106
   400
                s,@@LIBDIR@@,${LIBDIR},g
yann@1106
   401
                s,@@DOCDIR@@,${DOCDIR},g
yann@1106
   402
                s,@@MANDIR@@,${MANDIR},g
yann@1106
   403
                s,@@VERSION@@,${VERSION},g
yann@1106
   404
                s,@@DATE@@,${DATE},g
yann@1140
   405
                ${var_sed}
yann@1106
   406
                s,@@LOCAL@@,${LOCAL_set},g"  Makefile.in >Makefile
yann@673
   407
echo "done"
yann@185
   408
yann@185
   409
cat <<__EOF__
yann@673
   410
yann@197
   411
crosstool-NG configured as follows:
yann@554
   412
  PREFIX='${PREFIX}'
yann@554
   413
  BINDIR='${BINDIR}'
yann@554
   414
  LIBDIR='${LIBDIR}'
yann@554
   415
  DOCDIR='${DOCDIR}'
yann@554
   416
  MANDIR='${MANDIR}'
yann@1106
   417
yann@1106
   418
Now run:
yann@1106
   419
  make
yann@185
   420
__EOF__
yann@1298
   421
if [ "${LOCAL_set}" != "y" ]; then
yann@1297
   422
    printf "  make install\n"
yann@1297
   423
fi