configure
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Thu Mar 26 18:47:34 2009 +0000 (2009-03-26)
changeset 1268 5594b05bc2d8
parent 1213 61e11b37185a
child 1288 07b12579841d
permissions -rwxr-xr-x
Add support for building toolchains with gcc-4.4 snapshots.
Initial patch by Dmitry PLOTNIKOV: http://sourceware.org/ml/crossgcc/2009-03/msg00053.html
It [the toolchain] uses current ct-ng (nightly snapshot 20090324, latest
release 1.3.2 work also), glibc 2.9 (from CVS), binutils 2.19 and latest
snapshot of GCC 4.4.0 (as of March 20, 2009).

We have successfully built linux kernel 2.6.29 and a lot of other stuff
with this toolchain.

Here's the patch that adds GCC 4.4.0 to the ct-ng menu and enables it to
download a 4.4.0 snapshot from ftp.

Patch was adpated by me, mostly to better fit the configuration layout.

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