configure
author Titus von Boxberg <titus@v9g.de>
Mon Aug 22 09:35:29 2011 +0200 (2011-08-22)
changeset 2629 8cadd5a4c611
parent 2625 b1be254591e7
child 2644 b6d2623c2e68
permissions -rwxr-xr-x
debug/gdb: correct compilation error when stpcpy is a define

On OSX stpcpy is a define which is not recognized by gdb's configure.
This results in a compilation error.

Reported-by: "Guylhem Aznar" <crossgcc@guylhem.net>
Signed-off-by: "Titus von Boxberg" <titus@v9g.de>
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@2621
    14
PROG_PFX=
yann@2622
    15
PROG_SFX=
yann@2623
    16
PROG_SED=
yann@285
    17
LOCAL_set=
yann@1311
    18
FORCE=
yann@182
    19
yann@641
    20
do_quit=
yann@614
    21
yann@673
    22
# Simply print the error message, and exit. Obvious, he?
yann@673
    23
do_error() {
yann@1333
    24
    printf "${myname}: ${@}\n"
yann@673
    25
    exit 1
yann@673
    26
}
yann@673
    27
yann@641
    28
# Given an option string and the following argument,
yann@641
    29
# echoes the value of the option.
yann@641
    30
# If --var=val => echoes val and returns 0, meaning second arg was not consumed
yann@641
    31
# If --var val => echoes val and returns non null, meaning second arg was used
yann@182
    32
get_optval(){
yann@182
    33
    case "$1" in
yann@182
    34
        --*=?*)
yann@1333
    35
            printf "${1#*=}"
yann@1105
    36
            return 0
yann@182
    37
            ;;
yann@182
    38
        *)
yann@1333
    39
            printf "${2}"
yann@1105
    40
            return 1
yann@182
    41
            ;;
yann@182
    42
    esac
yann@182
    43
}
yann@182
    44
yann@641
    45
# The set_xxx functions will set the corresponding configuration variable
yann@641
    46
# They return 0 if second arg was not consumed, and non-zero if it was consumed.
yann@182
    47
set_prefix() {
yann@1105
    48
    PREFIX="$( get_optval "$1" "$2" )"
yann@182
    49
}
yann@182
    50
set_bindir() {
yann@376
    51
    BINDIR_set=1
yann@1105
    52
    BINDIR="$( get_optval "$1" "$2" )"
yann@182
    53
}
yann@182
    54
set_libdir() {
yann@376
    55
    LIBDIR_set=1
yann@1105
    56
    LIBDIR="$( get_optval "$1" "$2" )"
yann@182
    57
}
yann@182
    58
set_docdir() {
yann@376
    59
    DOCDIR_set=1
yann@1105
    60
    DOCDIR="$( get_optval "$1" "$2" )"
yann@182
    61
}
yann@182
    62
set_mandir() {
yann@376
    63
    MANDIR_set=1
yann@1105
    64
    MANDIR="$( get_optval "$1" "$2" )"
yann@182
    65
}
yann@2621
    66
set_program_prefix() {
yann@2621
    67
    PROG_PFX="$( get_optval "$1" "$2" )"
yann@2621
    68
}
yann@2622
    69
set_program_suffix() {
yann@2622
    70
    PROG_SFX="$( get_optval "$1" "$2" )"
yann@2622
    71
}
yann@2623
    72
set_program_transform_name() {
yann@2623
    73
    PROG_SED="$( get_optval "$1" "$2" )"
yann@2623
    74
}
yann@1140
    75
set_tool() {
yann@1140
    76
    local var_name="${1%%=*}"
yann@1140
    77
    var_name="${var_name#--with-}"
yann@1140
    78
    eval ${var_name}="\$( get_optval "$1" "$2" )"
yann@614
    79
}
yann@614
    80
yann@1311
    81
# var_list is a list of variables, each one holding a path to a
yann@1311
    82
# tool, either detected by ./configure, or specified by the user.
yann@1311
    83
var_list=""
yann@2481
    84
kconfig_list=""
yann@1311
    85
yann@1311
    86
# This function adds a variable name to the above list of variable names.
yann@1311
    87
# $1: the name of the variable to add to the list
yann@1311
    88
add_to_var_list() {
yann@2481
    89
    local v
yann@2481
    90
    for v in ${var_list}; do
yann@2481
    91
        [ "${v}" = "${1}" ] && return 0
yann@2481
    92
    done
yann@1311
    93
    var_list="${var_list} ${1}"
yann@1311
    94
}
yann@2481
    95
add_to_kconfig_list() {
yann@2481
    96
    local k
yann@2481
    97
    for k in ${kconfig_list}; do
yann@2481
    98
        [ "${k}" = "${1}" ] && return 0
yann@2481
    99
    done
yann@2481
   100
    kconfig_list="${kconfig_list} ${1}"
yann@2481
   101
}
yann@1311
   102
yann@1311
   103
# A function to test for required tools/headers/libraries
yann@1560
   104
# Return 0 (true) if found, !0 (false) if not found
yann@1560
   105
#
yann@1311
   106
# $*: [prog|inc|lib]=<name[ name...]>
yann@1311
   107
#     the name(s) of tool(s) to test for
yann@1311
   108
#     mandatory
yann@1311
   109
#       eg: prog=bash   prog="curl wget"
yann@1311
   110
# $*: var=<var_name>
yann@1311
   111
#     the name of the variable to test and set
yann@1311
   112
#     optional
yann@1311
   113
#       eg: var=bash    if ${bash} is set and non-null, use that,
yann@1311
   114
#                       else check for bash and set bash=$(which bash)
yann@1311
   115
# $*: ver=<regexp>
yann@1311
   116
#     for each 'prog', test if $(prog --version) matches 'regexp'
yann@1311
   117
#     optional
yann@1311
   118
#       eg: ver='^GNU bash, version [34]\.'
yann@2527
   119
# $*: lib_exts=<extension[ extension...]>
yann@2527
   120
#     the list of allowed library extension
yann@2527
   121
#     mandatory
yann@2527
   122
#       eg: lib_exts="so dylib"     lib_exts="so dylib a"
yann@1311
   123
# $*: err=<error_message>
yann@1311
   124
#     the error message to print if tool is missing
yann@1311
   125
#     optional, defaults to: '${prog}: none found'
yann@1311
   126
#       eg: err="'bash' 3.x or above was not found"
yann@2480
   127
#     Note: err may be printed by caller, not us
yann@2481
   128
# $*: kconfig=<var_name>
yann@2481
   129
#     the name of a variable to pass down to kconfig if
yann@2481
   130
#     the prog/inc/lib was found
yann@2481
   131
#     optional, defaults to none
yann@2481
   132
#       eg: kconfig=has_libncurses
yann@2528
   133
# $*: skip=[y|n|]
yann@2528
   134
#     if set to 'y', skip the test, but still register the
yann@2528
   135
#     kconfig and var variables; if 'n' or empty, do the
yann@2528
   136
#     test.
yann@2528
   137
#     optional, default to 'n'
yann@2528
   138
#       eg: skip="${static_link_ko}"
yann@1560
   139
check_for() {
yann@2527
   140
    local lib_exts
yann@2528
   141
    local skip
yann@1311
   142
    local val
yann@1311
   143
    local item
yann@1311
   144
    local where
yann@1312
   145
    local status
yann@2527
   146
    local ext
yann@1311
   147
yann@2481
   148
    # Note: prog/inc/lib and var/kconfig/ver/err are set here,
yann@2479
   149
    # but declared by the caller (because it needs it)
yann@1311
   150
    for item in "${@}"; do
yann@1311
   151
        case "${item}" in
yann@2528
   152
            prog=*|inc=*|lib=*|var=*|ver=*|err=*|kconfig=*|lib_exts=*|skip=*)
yann@2497
   153
                eval ${item%%=*}=\"${item#*=}\"
yann@1311
   154
                ;;
yann@2527
   155
            *)  do_error "check_for: incorrect parameters: '${item}'";;
yann@1311
   156
        esac
yann@1311
   157
    done
yann@1311
   158
benoit@2507
   159
    case "${prog}:${inc}:${lib}" in
benoit@2507
   160
        ?*:?*:|?*::?*|:?*:?*|?*:?*:?*)
benoit@2507
   161
            if [ -n "${var}" ]; then
benoit@2507
   162
                do_error "check_for: the use of var is not compatible with passing several of [prog|inc|lib] at once"
benoit@2507
   163
            fi
benoit@2507
   164
            ;;
benoit@2507
   165
        ::) do_error "check_for: [prog|inc|lib] is mandatory";;
benoit@2507
   166
    esac
benoit@2507
   167
yann@2528
   168
    if [ -n "${var}" ]; then
yann@2528
   169
        add_to_var_list "${var}"
yann@2528
   170
    fi
yann@2481
   171
    if [ -n "${kconfig}" ]; then
yann@2481
   172
        add_to_kconfig_list "${kconfig}"
yann@2481
   173
    fi
yann@2481
   174
yann@2528
   175
    if [ "${skip}" = "y" ]; then
yann@2528
   176
        return 0
yann@2528
   177
    fi
yann@2528
   178
benoit@2507
   179
    if [ -n "${prog}" ]; then
benoit@2507
   180
        for item in ${prog}; do
benoit@2507
   181
            printf "Checking for '${item}'... "
benoit@2507
   182
            if [ -n "${var}" ]; then
benoit@2507
   183
                eval val="\${${var}}"
benoit@2507
   184
                if [ -n "${val}" ]; then
yann@2528
   185
                    status="${val} (cached)\n"
titus@2625
   186
                    where="${val}"
yann@2528
   187
                    break
yann@1311
   188
                fi
benoit@2507
   189
            fi
benoit@2507
   190
            where="$( which "${item}" 2>/dev/null )"
benoit@2507
   191
            if [ -z "${where}" ]; then
benoit@2507
   192
                printf "no\n"
benoit@2507
   193
                continue
benoit@2507
   194
            elif [ -n "${ver}" ]; then
benoit@2507
   195
                str=$( LC_ALL=C "${where}" --version 2>&1   \
benoit@2507
   196
                       |grep -E "${ver}"                    \
benoit@2507
   197
                       |head -n 1
benoit@2507
   198
                     )
benoit@2507
   199
                if [ -z "${str}" ]; then
yann@1312
   200
                    printf "no\n"
benoit@2507
   201
                    unset where
yann@1311
   202
                    continue
yann@1311
   203
                fi
benoit@2507
   204
            fi
benoit@2507
   205
            status="${where}"
benoit@2507
   206
            break
benoit@2507
   207
        done
benoit@2507
   208
        if [ -z "${status}" ]; then
benoit@2507
   209
            return 1
benoit@2507
   210
        fi
benoit@2507
   211
        printf "${status}\n"
benoit@2507
   212
        unset status
yann@1560
   213
    fi
yann@1560
   214
benoit@2507
   215
    if [ -n "${inc}" ]; then
benoit@2507
   216
        for item in ${inc}; do
benoit@2507
   217
            printf "Checking for '${item}'... "
benoit@2507
   218
            if printf "#include \"${item}\"" |gcc -x c -c - -o /dev/null >/dev/null 2>&1; then
benoit@2507
   219
                where="${item}"
benoit@2507
   220
                status=yes
benoit@2507
   221
                break;
benoit@2507
   222
            fi
benoit@2507
   223
            printf "no\n"
benoit@2507
   224
        done
benoit@2507
   225
        if [ -z "${status}" ]; then
benoit@2507
   226
            return 1
benoit@2507
   227
        fi
benoit@2507
   228
        printf "${status}\n"
benoit@2507
   229
        unset status
benoit@2507
   230
    fi
benoit@2507
   231
benoit@2507
   232
    if [ -n "${lib}" ]; then
yann@2527
   233
        if [ -z "${lib_exts}" ]; then
yann@2527
   234
            do_error "check_for: no library extension specified for '${lib}'"
yann@2527
   235
        fi
benoit@2507
   236
        for item in ${lib}; do
yann@2527
   237
            for ext in ${lib_exts}; do
yann@2527
   238
                printf "Checking for '${item}.${ext}'... "
yann@2527
   239
                where="$( gcc -print-file-name="${item}.${ext}" )"
yann@2527
   240
                if [ "${where}" != "${item}.${ext}" ]; then
yann@2527
   241
                    where="$( readlink "${where}" )"
yann@2527
   242
                    status=yes
yann@2527
   243
                    break 2;
yann@2527
   244
                fi
yann@2527
   245
                printf "no\n"
yann@2527
   246
            done
benoit@2507
   247
        done
benoit@2507
   248
        if [ -z "${status}" ]; then
benoit@2507
   249
            return 1
benoit@2507
   250
        fi
benoit@2507
   251
        printf "${status}\n"
benoit@2507
   252
        unset status
benoit@2507
   253
    fi
benoit@2507
   254
yann@1560
   255
    if [ -n "${var}" ]; then
yann@1560
   256
        eval ${var}='"'"${where}"'"'
yann@1560
   257
    fi
yann@2481
   258
    if [ -n "${kconfig}" ]; then
yann@2481
   259
        eval ${kconfig}=y
yann@2481
   260
    fi
yann@1560
   261
}
yann@1560
   262
yann@1560
   263
# This function checks for a tool, and aborts if not found
yann@1560
   264
# See check_for(), above, for how to call has_or_abort
yann@1560
   265
has_or_abort() {
yann@2479
   266
    # We declare these 6 variables here, although they are
yann@2479
   267
    # set in check_for(), called below
yann@2479
   268
    local prog inc lib
yann@2481
   269
    local var ver err kconfig
yann@2479
   270
yann@1560
   271
    if ! check_for "$@"; then
yann@2524
   272
        printf " * A mandatory dependency is missing, or version mis-match:\n"
yann@2524
   273
        printf " * - ${err:-${prog}${inc}${lib}: none found}\n"
yann@2479
   274
        if [ -n "${var}" ]; then
yann@2498
   275
            printf " * --> You can give the path to this tool using: --with-${var}=PATH\n"
yann@2479
   276
        fi
yann@2479
   277
        printf "\n"
yann@2479
   278
        # Bail out if --force is not specified
yann@1312
   279
        [ -z "${FORCE}" ] && do_error "Bailing out..."
yann@1312
   280
        printf "<*                                          *>\n"
yann@1312
   281
        printf "<*            FORCE in action:              *>\n"
yann@1312
   282
        printf "<* Continuing despite missing pre-requisite *>\n"
yann@1312
   283
        printf "<*          Prepare for breakage            *>\n"
yann@1312
   284
        printf "<*                                          *>\n"
yann@1312
   285
        printf "\n"
yann@1312
   286
    fi
yann@1311
   287
}
yann@1311
   288
yann@2480
   289
# This function checks for a tool, and warns if not found
yann@2480
   290
# See check_for(), above, for how to call has_or_abort
yann@2480
   291
# Note: if err is not set, then no error message is printed
yann@2480
   292
has_or_warn() {
yann@2480
   293
    # We declare these 6 variables here, although they are
yann@2480
   294
    # set in check_for(), called below
yann@2480
   295
    local prog inc lib
yann@2481
   296
    local var ver err kconfig
yann@2480
   297
yann@2480
   298
    if ! check_for "$@"; then
yann@2524
   299
        printf " * An optional dependency is missing, some features will be disabled"
yann@2524
   300
        printf "${err:+:\n * - ${err}}\n"
yann@2480
   301
        if [ -n "${var}" ]; then
yann@2498
   302
            printf " * --> You can give the path to this tool using: --with-${var}=PATH\n"
yann@2480
   303
        fi
yann@2480
   304
    fi
yann@2480
   305
}
yann@2480
   306
yann@183
   307
do_help() {
yann@183
   308
    cat <<__EOF__
yann@1140
   309
\`configure' configures crosstool-NG-${VERSION} to adapt to many kind of systems.
yann@183
   310
yann@183
   311
USAGE: ./configure [OPTION]...
yann@183
   312
yann@183
   313
Defaults for the options are specified in brackets.
yann@183
   314
yann@183
   315
Configuration:
yann@1105
   316
  -h, --help              display this help and exit
yann@1311
   317
      --force             force configure to continue, even in case
yann@1311
   318
                          some pre-requisites are missing
yann@615
   319
yann@615
   320
Installation directories:
yann@185
   321
  --prefix=PREFIX         install files in PREFIX [${PREFIX_DEFAULT}]
yann@285
   322
  --local                 don't install, and use current directory
yann@183
   323
yann@183
   324
By default, \`make install' will install all the files in
yann@183
   325
\`${PREFIX_DEFAULT}/bin', \`${PREFIX_DEFAULT}/lib' etc.  You can specify
yann@183
   326
an installation prefix other than \`${PREFIX_DEFAULT}' using \`--prefix',
yann@183
   327
for instance \`--prefix=\${HOME}'.
yann@183
   328
yann@183
   329
For better control, use the options below.
yann@2619
   330
Note: options marked as \`ignored' are recognised, but not acted upon, as
yann@2619
   331
they make no sense for crosstool-NG, or they are not implemented yet.
yann@183
   332
yann@183
   333
Fine tuning of the installation directories:
yann@683
   334
  --bindir=DIR            user executables [PREFIX/bin]
yann@683
   335
  --libdir=DIR            object code libraries [PREFIX/lib]
yann@683
   336
  --docdir=DIR            info documentation [PREFIX/share/doc]
yann@683
   337
  --mandir=DIR            man documentation [PREFIX/share/man]
yann@2619
   338
  --infodir=DIR           info documentation [DATAROOTDIR/info] (ignored)
yann@2619
   339
  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
yann@2619
   340
                          (ignored)
yann@2619
   341
  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc] (ignored)
yann@2619
   342
  --localstatedir=DIR     modifiable single-machine data [PREFIX/var] (ignored)
yann@2619
   343
yann@2619
   344
Program names:
yann@2619
   345
  --program-prefix=PREFIX            prepend PREFIX to installed program names
yann@2622
   346
  --program-suffix=SUFFIX            append SUFFIX to installed program names
yann@2623
   347
  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
yann@2619
   348
yann@2619
   349
System types:
yann@2619
   350
  --build=BUILD     configure for building on BUILD [guessed] (ignored)
yann@2619
   351
  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
yann@2619
   352
                    (ignored)
yann@614
   353
yann@614
   354
Optional Features:
yann@2619
   355
  --enable-shared[=PKGS]  build shared libraries [default=yes] (ignored)
yann@2619
   356
  --enable-static[=PKGS]  build static libraries [default=yes] (ignored)
yann@2619
   357
yann@2619
   358
Optional Packages:
yann@1140
   359
  --with-install=PATH     Specify the full PATH to GNU install
yann@1311
   360
  --with-make=PATH        Specify the full PATH to GNU make >= 3.80
yann@1140
   361
  --with-grep=PATH        Specify the full PATH to GNU grep
yann@1140
   362
  --with-sed=PATH         Specify the full PATH to GNU sed
yann@1140
   363
  --with-bash=PATH        Specify the full PATH to bash >= 3.0
yann@183
   364
__EOF__
yann@183
   365
}
yann@183
   366
yann@376
   367
#---------------------------------------------------------------------
yann@376
   368
# Set user's options
yann@376
   369
yann@182
   370
while [ $# -ne 0 ]; do
yann@182
   371
    case "$1" in
yann@1297
   372
        --local)    LOCAL_set="y"; shift;;
yann@182
   373
        --prefix*)  set_prefix "$1" "$2" && shift || shift 2;;
yann@182
   374
        --bindir*)  set_bindir "$1" "$2" && shift || shift 2;;
yann@182
   375
        --libdir*)  set_libdir "$1" "$2" && shift || shift 2;;
yann@182
   376
        --docdir*)  set_docdir "$1" "$2" && shift || shift 2;;
yann@182
   377
        --mandir*)  set_mandir "$1" "$2" && shift || shift 2;;
yann@1140
   378
        --with-*)   set_tool   "$1" "$2" && shift || shift 2;;
yann@2621
   379
        --program-prefix=*|--program-prefix)
yann@2621
   380
                    set_program_prefix "$1" "$2" && shift || shift 2
yann@2621
   381
                    ;;
yann@2622
   382
        --program-suffix=*|--program-suffix)
yann@2622
   383
                    set_program_suffix "$1" "$2" && shift || shift 2
yann@2622
   384
                    ;;
yann@2623
   385
        --program-transform-name=*|--program-transform-name)
yann@2623
   386
                    set_program_transform_name "$1" "$2" && shift || shift 2
yann@2623
   387
                    ;;
yann@1311
   388
        --force)    FORCE=1; shift;;
yann@183
   389
        --help|-h)  do_help; exit 0;;
blueness@1739
   390
        # Skip, auto-stuff compatibility
blueness@1739
   391
        --build=*|--host=*|--infodir=*|--datadir=*|--sysconfdir=*|--localstatedir=*) shift;;
blueness@1739
   392
        --build|--host|--infodir|--datadir|--sysconfdir|--localstatedir)             shift 2;;
yann@2551
   393
        --enable-shared|--disable-shared|--enable-static|--disable-static)           shift;;
yann@1333
   394
        *)          printf "Unrecognised option: '${1}'\n"; do_help; exit 1;;
yann@182
   395
    esac
yann@182
   396
done
yann@182
   397
yann@641
   398
# Use defaults
yann@185
   399
[ -z "${PREFIX}" ] && set_prefix "" "${PREFIX_DEFAULT}"
yann@641
   400
yann@641
   401
# Special case when installing locally
yann@1297
   402
if [ "${LOCAL_set}" = "y" ]; then
yann@1105
   403
    set_prefix "" "$( pwd )"
yann@1105
   404
    set_bindir "" "$( pwd )"
yann@1105
   405
    set_libdir "" "$( pwd )"
yann@1105
   406
    set_docdir "" "$( pwd )/docs"
yann@1105
   407
    set_mandir "" "$( pwd )/docs"
yann@2621
   408
    set_program_prefix "" ""
yann@2622
   409
    set_program_suffix "" ""
yann@2623
   410
    set_program_transform_name "" ""
yann@285
   411
fi
yann@183
   412
yann@376
   413
#---------------------------------------------------------------------
yann@1140
   414
# Some sanity checks, now
yann@1106
   415
yann@1560
   416
# We check for grep and sed manually, because they are used in check_for()
yann@1140
   417
printf "Checking for 'grep'... "
yann@1140
   418
if [ -n "${grep}" ]; then
yann@1333
   419
    printf "${grep} (cached)\n"
yann@1140
   420
else
yann@1140
   421
    grep="$( which grep 2>/dev/null )"
yann@1187
   422
    if [ -z "${grep}" ]; then
yann@1333
   423
        printf "not found\n"
yann@1187
   424
    else
yann@1333
   425
        printf "${grep}\n"
yann@1187
   426
        printf "Checking whether '${grep}' supports -E... "
yann@1187
   427
        if echo 'foo' |"${grep}" -E 'foo' >/dev/null 2>&1; then
yann@1333
   428
            printf "yes\n"
yann@1187
   429
        else
yann@1333
   430
            printf "no\n"
yann@1187
   431
            grep=
yann@1187
   432
        fi
yann@1187
   433
    fi
yann@1106
   434
fi
yann@1187
   435
if [ -z "${grep}" ]; then
yann@1333
   436
    printf "Either you are missing entirely the needed tool,\n"
yann@1333
   437
    printf "or the version you have is too old.\n"
yann@1333
   438
    printf "You can give the path to this tool using: --with-grep=PATH\n"
yann@1187
   439
    do_error "Bailing out..."
yann@1140
   440
fi
yann@1311
   441
add_to_var_list grep
yann@1140
   442
yann@1140
   443
printf "Checking for 'sed'... "
yann@1140
   444
if [ -n "${sed}" ]; then
yann@1333
   445
    printf "${sed} (cached)\n"
yann@1140
   446
else
yann@1140
   447
    sed="$( which sed 2>/dev/null )"
yann@1187
   448
    if [ -z "${sed}" ]; then
yann@1333
   449
        printf "not found\n"
yann@1187
   450
    else
yann@1333
   451
        printf "${sed}\n"
rpjday@1288
   452
        printf "Checking whether '${sed}' supports -i and -e... "
yann@1187
   453
        touch .ct-ng.sed.test
yann@1187
   454
        if "${sed}" -r -i -e 's/foo/bar/' .ct-ng.sed.test >/dev/null 2>&1; then
yann@1333
   455
            printf "yes\n"
yann@1187
   456
        else
yann@1333
   457
            printf "no\n"
yann@1187
   458
            sed=
yann@1187
   459
        fi
yann@1187
   460
        rm -f .ct-ng.sed.test
yann@1187
   461
    fi
yann@1140
   462
fi
yann@1187
   463
if [ -z "${sed}" ]; then
yann@1333
   464
    printf "Either you are missing entirely the needed tool,\n"
yann@1333
   465
    printf "or the version you have is too old.\n"
yann@1333
   466
    printf "You can give the path to this tool using: --with-sed=PATH\n"
yann@1187
   467
    do_error "Bailing out..."
yann@1140
   468
fi
yann@1311
   469
add_to_var_list sed
yann@1140
   470
yann@1311
   471
# The regular list of tools we can now easily check for
yann@1311
   472
has_or_abort prog=bash                              \
yann@1311
   473
             var=bash                               \
yann@1477
   474
             ver='^GNU bash, version (3\.[1-9]|4)'  \
yann@1477
   475
             err="'bash' 3.1 or above was not found"
yann@1311
   476
has_or_abort prog=cut
yann@1311
   477
has_or_abort prog=install var=install
yann@1311
   478
has_or_abort prog=make                                  \
yann@1311
   479
             var=make                                   \
yann@1311
   480
             ver='^GNU Make (3.[89][[:digit:]]|[4-9])'  \
yann@1311
   481
             err="GNU 'make' 3.80 or above was not found"
yann@1311
   482
has_or_abort prog=gcc
yann@1431
   483
has_or_abort prog="awk gawk" ver='^GNU Awk' err="GNU 'awk' was not found"
yann@1311
   484
has_or_abort prog=bison
yann@1311
   485
has_or_abort prog=flex
yann@1311
   486
has_or_abort prog=makeinfo
yann@1311
   487
has_or_abort prog=automake                                                      \
oron@1432
   488
             ver='\(GNU automake\) (1\.[[:digit:]]{2,}|[2-9][[:digit:]]*\.)'    \
yann@1311
   489
             err="'automake' 1.10 or above was not found"
yann@1311
   490
has_or_abort prog=libtool                                                                           \
titus@1969
   491
             var=libtool                                                                            \
yann@1311
   492
             ver='\(GNU libtool.*\) (2[[:digit:]]*\.|1\.6[[:digit:]]*\.|1\.5\.[2-9][[:digit:]]+)'   \
yann@1311
   493
             err="'libtool' 1.5.26 or above was not found"
titus@2626
   494
has_or_abort prog=libtoolize                                                                        \
titus@2626
   495
             var=libtoolize                                                                         \
titus@2626
   496
             ver='\(GNU libtool.*\) (2[[:digit:]]*\.|1\.6[[:digit:]]*\.|1\.5\.[2-9][[:digit:]]+)'   \
titus@2626
   497
             err="'libtoolize' 1.5.26 or above was not found"
titus@1957
   498
has_or_abort prog=stat
yann@2203
   499
has_or_abort prog="curl wget"
yann@1311
   500
has_or_abort prog=patch
yann@1311
   501
has_or_abort prog=tar
yann@1311
   502
has_or_abort prog=gzip
yann@1311
   503
has_or_abort prog=bzip2
yann@2607
   504
has_or_warn  prog=xz                                        \
yann@2607
   505
             kconfig=has_xzutils                            \
yann@2607
   506
             err="xz-comoressed tarballs will not be used"
yann@1313
   507
has_or_abort prog=readlink
titus@1962
   508
has_or_abort prog=objcopy var=objcopy
titus@1962
   509
has_or_abort prog=objdump var=objdump
titus@1962
   510
has_or_abort prog=readelf var=readelf
titus@1962
   511
has_or_abort prog=patch var=patch
yann@2535
   512
has_or_warn  prog=cvs                                                   \
yann@2535
   513
             kconfig=has_cvs                                            \
yann@2535
   514
             err="it will not be possible to use newlib cvs snapshots"
yann@2591
   515
has_or_warn  prog=svn                               \
yann@2540
   516
             kconfig=has_svn                        \
yann@2540
   517
             err="subversion is required to download eglibc"
yann@1311
   518
yann@2525
   519
# Host system checks
yann@2525
   520
yann@2525
   521
printf "Checking for host system... "
yann@2525
   522
host="$( uname -s )"
yann@2525
   523
printf "%s\n" "${host}"
yann@2525
   524
case "${host}" in
yann@2525
   525
    Linux)  ;;
yann@2525
   526
    Cygwin) ;;
yann@2525
   527
    *)
yann@2525
   528
        printf " * Runing under %s is not fully tested\n" "${host}"
yann@2525
   529
        printf " * You may encounter some weird behavior\n"
yann@2525
   530
        ;;
yann@2525
   531
esac
yann@2525
   532
yann@2526
   533
printf "Checking if static linking is possible... "
yann@2526
   534
static_link_ok=""
yann@2526
   535
case "${host}" in
yann@2526
   536
    Darwin) ;;
yann@2526
   537
    *)  tmp=.static.tmp
yann@2534
   538
        if gcc -xc - -static -o "${tmp}" >/dev/null 2>&1 <<-_EOF_
yann@2526
   539
				int main() { return 0; }
yann@2526
   540
			_EOF_
yann@2526
   541
        then
yann@2526
   542
            static_link_ok="y"
yann@2526
   543
        fi
yann@2526
   544
        rm -f "${tmp}"
yann@2526
   545
        ;;
yann@2526
   546
esac
yann@2526
   547
if [ "${static_link_ok}" = "y" ]; then
yann@2528
   548
    static_link_ko=""
yann@2526
   549
    printf "yes\n"
yann@2526
   550
else
yann@2528
   551
    static_link_ko="y"
yann@2526
   552
    printf "no\n"
yann@2526
   553
    printf " * An optional host feature is missing, some features will be disabled:\n"
yann@2526
   554
    printf " * - It will not be possible to statically link toolchain's binaries\n"
yann@2526
   555
fi
yann@2526
   556
add_to_kconfig_list static_link_ok
yann@2526
   557
yann@2526
   558
# Library checks
yann@2528
   559
libs_exts="so dylib"
yann@2528
   560
if [ "${static_link_ok}" = "y" ]; then
yann@2534
   561
    libs_exts="${libs_exts} a"
yann@2528
   562
fi
yann@2527
   563
yann@2509
   564
ncurses_hdrs="ncurses/ncurses.h ncurses/curses.h ncurses.h curses.h"
yann@2527
   565
ncurses_libs="libncursesw libncurses libcurses"
yann@2509
   566
has_or_abort lib="${ncurses_libs}"                                          \
yann@2527
   567
             lib_exts="${libs_exts}"                                        \
yann@2509
   568
             inc="${ncurses_hdrs}"                                          \
yann@2506
   569
             err="The 'ncurses' library is needed fo the menuconfig frontend"
yann@1106
   570
yann@2527
   571
has_or_abort lib="libstdc++"            \
yann@2527
   572
             lib_exts="${libs_exts}"    \
yann@2506
   573
             err="The 'libstdc++' library is needed to build gcc"
yann@2499
   574
yann@2500
   575
# Yes, we may be checking twice for libstdc++.a
yann@2500
   576
# The first is because we need one instance of libstdc++ (shared or static)
yann@2500
   577
# because it is needed for PPL; the second is because the static version is
yann@2500
   578
# required for static-linking, and if missing, the option is removed.
yann@2528
   579
has_or_warn  lib="libstdc++"                \
yann@2528
   580
             lib_exts="a"                   \
yann@2500
   581
             err="static 'libstdc++' is needed to statically link the toolchain's executables" \
yann@2528
   582
             kconfig=has_static_libstdcxx   \
yann@2528
   583
             skip="${static_link_ko}"
yann@2500
   584
yann@2527
   585
has_or_warn  inc="expat.h"              \
yann@2527
   586
             lib="libexpat"             \
yann@2527
   587
             lib_exts="${libs_exts}"    \
benoit@2508
   588
             err="The 'expat' header file and library are needed to link cross-gdb's executables" \
benoit@2508
   589
             kconfig=has_expat
benoit@2508
   590
benoit@2508
   591
# Yes, we may be checking twice for libexpat.a
benoit@2508
   592
# The first is because we need one instance of libexpat (shared or static)
benoit@2508
   593
# because it is needed for cross-gdb; the second is because the static version
benoit@2508
   594
# is required for static-linking, and if missing, the option is removed.
yann@2528
   595
has_or_warn  lib="libexpat"             \
yann@2528
   596
             lib_exts="a"               \
benoit@2508
   597
             err="static 'expat' is needed to statically link cross-gdb's executables" \
yann@2528
   598
             kconfig=has_static_expat   \
yann@2528
   599
             skip="${static_link_ko}"
benoit@2508
   600
benoit@2508
   601
for v in 7 6 5 4; do
yann@2527
   602
    python_incs="${python_incs} python2.${v}/Python.h"
yann@2527
   603
    python_libs="${python_libs} libpython2.${v}"
benoit@2508
   604
done
yann@2527
   605
has_or_warn  inc="${python_incs}"       \
yann@2527
   606
             lib="${python_libs}"       \
yann@2527
   607
             lib_exts="${libs_exts}"    \
benoit@2508
   608
             err="The 'python' header file and library are needed for some features of cross-gdb"
benoit@2508
   609
yann@1106
   610
#---------------------------------------------------------------------
yann@1106
   611
# Compute the version string
yann@376
   612
yann@1576
   613
# If this version is n hg clone, try to get the revision number
yann@435
   614
# If we can't get the revision number, use date
yann@2498
   615
printf "\nComputing version string... "
yann@435
   616
case "${VERSION}" in
Yann@1409
   617
    *+hg|hg)
yann@1740
   618
        REVISION="$( hg id -n 2>/dev/null || true )"
yann@1105
   619
        case "${REVISION}" in
Yann@1409
   620
            "")
yann@1105
   621
                VERSION="${VERSION}_unknown@$( date +%Y%m%d.%H%M%S )";;
yann@1105
   622
            *)
yann@1430
   623
                VERSION="${VERSION}_$( hg id -b )@${REVISION%%+}_$( hg id -i )"
yann@1105
   624
                ;;
yann@1105
   625
        esac
yann@1105
   626
        # Arrange to have no / in the directory name, no need to create an
yann@1105
   627
        # arbitrarily deep directory structure
yann@1333
   628
        VERSION="$( printf "${VERSION}\n" |"${sed}" -r -e 's|/+|_|g;' )"
yann@444
   629
        ;;
yann@435
   630
esac
yann@1740
   631
printf "${VERSION}\n"
yann@435
   632
yann@1106
   633
#---------------------------------------------------------------------
yann@1106
   634
# Compute and check install paths
yann@1106
   635
yann@614
   636
# Now we have the version string, we can build up the paths
yann@554
   637
[ -z "${BINDIR_set}" ] && BINDIR="${PREFIX}/bin"
yann@1660
   638
[ -z "${LIBDIR_set}" ] && LIBDIR="${PREFIX}/lib"
yann@1660
   639
[ -z "${DOCDIR_set}" ] && DOCDIR="${PREFIX}/share/doc"
yann@2026
   640
[ -z "${MANDIR_set}" ] && MANDIR="${PREFIX}/share/man"
yann@554
   641
yann@1660
   642
# Install support files in our own sub-dir, so as not to mangle (system)
yann@1660
   643
# files and dirs, but only if not --local
yann@1660
   644
if [ -z "${LOCAL_set}" ]; then
yann@1660
   645
    LIBDIR="${LIBDIR}/ct-ng-${VERSION}"
yann@1660
   646
    DOCDIR="${DOCDIR}/ct-ng-${VERSION}"
yann@1660
   647
fi
yann@1660
   648
yann@1047
   649
# Check that install PATHs are absolute
yann@1047
   650
for p in BIN LIB DOC MAN; do
yann@1105
   651
    var="${p}DIR"
yann@1105
   652
    eval v='"${'"${var}"'}"'
yann@1105
   653
    case "${v}" in
yann@1105
   654
        /*) ;;
yann@2621
   655
        *)  do_error "'${var}' is not an absolute path: '${v}'";;
yann@1105
   656
    esac
yann@1047
   657
done
yann@2621
   658
case "${PROG_PFX}" in
yann@2621
   659
    */*)    do_error "program prefix '${PROG_PFX}' contains a '/'";;
yann@2621
   660
esac
yann@2622
   661
case "${PROG_SFX}" in
yann@2622
   662
    */*)    do_error "program suffix '${PROG_SFX}' contains a '/'";;
yann@2622
   663
esac
yann@1047
   664
yann@1106
   665
#---------------------------------------------------------------------
yann@1106
   666
# That's all, folks!
yann@614
   667
yann@641
   668
printf "Building up Makefile... "
yann@1140
   669
var_sed="$( for var_name in ${var_list}; do
yann@1140
   670
                eval echo 's,@@${var_name}@@,${'"${var_name}"'},g'
yann@2481
   671
            done
yann@1140
   672
          )"
yann@2481
   673
kconfig_sed="s/@@KCONFIG@@/$( for k_name in ${kconfig_list}; do
yann@2481
   674
                                  eval printf \"${k_name}=\${${k_name}} \"
yann@2481
   675
                              done
yann@2481
   676
                            )/"
yann@2481
   677
"${sed}" -r -e "s,@@BINDIR@@,${BINDIR},g"       \
yann@2481
   678
            -e "s,@@LIBDIR@@,${LIBDIR},g"       \
yann@2481
   679
            -e "s,@@DOCDIR@@,${DOCDIR},g"       \
yann@2481
   680
            -e "s,@@MANDIR@@,${MANDIR},g"       \
yann@2621
   681
            -e "s,@@PROG_PFX@@,${PROG_PFX},g"   \
yann@2622
   682
            -e "s,@@PROG_SFX@@,${PROG_SFX},g"   \
yann@2623
   683
            -e "s,@@PROG_SED@@,${PROG_SED},g"   \
yann@2481
   684
            -e "s,@@VERSION@@,${VERSION},g"     \
yann@2481
   685
            -e "s,@@DATE@@,${DATE},g"           \
yann@2481
   686
            -e "s,@@LOCAL@@,${LOCAL_set},g"     \
yann@2481
   687
            -e "${var_sed}"                     \
yann@2481
   688
            -e "${kconfig_sed}"                 \
yann@2481
   689
         Makefile.in                            \
yann@2481
   690
         >Makefile
yann@673
   691
echo "done"
yann@185
   692
yann@185
   693
cat <<__EOF__
yann@673
   694
yann@197
   695
crosstool-NG configured as follows:
yann@554
   696
  PREFIX='${PREFIX}'
yann@554
   697
  BINDIR='${BINDIR}'
yann@554
   698
  LIBDIR='${LIBDIR}'
yann@554
   699
  DOCDIR='${DOCDIR}'
yann@554
   700
  MANDIR='${MANDIR}'
yann@2621
   701
  PROG_PFX='${PROG_PFX}'
yann@2622
   702
  PROG_SFX='${PROG_SFX}'
yann@2623
   703
  PROG_SED='${PROG_SED}'
yann@1106
   704
yann@1106
   705
Now run:
yann@1106
   706
  make
yann@185
   707
__EOF__
yann@1298
   708
if [ "${LOCAL_set}" != "y" ]; then
yann@1297
   709
    printf "  make install\n"
yann@1297
   710
fi