scripts/build/cc/gcc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jul 24 19:35:24 2011 +0200 (2011-07-24)
changeset 2900 369e2fbe9010
parent 2897 8e793413baae
child 2901 4fcedd2c14b2
permissions -rw-r--r--
cc-gcc: the frontends are responsible for mkdir/chdir

The build dir are created depending on the host (host for that specific
backend, not host for the toolchain). Only the frontends know what host
this is, so only the frontends can create non-ambiguous dirs.

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
yann@850
     1
# This file adds the function to build the gcc C compiler
yann@850
     2
# Copyright 2007 Yann E. MORIN
yann@850
     3
# Licensed under the GPL v2. See COPYING in the root of this package
yann@850
     4
yann@850
     5
# Download gcc
yann@850
     6
do_cc_get() {
yann@2302
     7
    local linaro_version
yann@2302
     8
    local linaro_series
yann@2302
     9
    local linaro_base_url="http://launchpad.net/gcc-linaro"
yann@2302
    10
yann@2302
    11
yann@2302
    12
    # Account for the Linaro versioning
yann@2302
    13
    linaro_version="$( echo "${CT_CC_VERSION}"      \
yann@2302
    14
                       |sed -r -e 's/^linaro-//;'   \
yann@2302
    15
                     )"
yann@2302
    16
    linaro_series="$( echo "${linaro_version}"      \
yann@2302
    17
                      |sed -r -e 's/-.*//;'         \
yann@2302
    18
                    )"
yann@2302
    19
yann@850
    20
    # Ah! gcc folks are kind of 'different': they store the tarballs in
yann@850
    21
    # subdirectories of the same name! That's because gcc is such /crap/ that
yann@850
    22
    # it is such /big/ that it needs being splitted for distribution! Sad. :-(
yann@850
    23
    # Arrgghh! Some of those versions does not follow this convention:
yann@850
    24
    # gcc-3.3.3 lives in releases/gcc-3.3.3, while gcc-2.95.* isn't in a
yann@850
    25
    # subdirectory! You bastard!
yann@1389
    26
    CT_GetFile "gcc-${CT_CC_VERSION}"                                                       \
yann@1389
    27
               {ftp,http}://ftp.gnu.org/gnu/gcc{,{,/releases}/gcc-${CT_CC_VERSION}}         \
yann@1389
    28
               ftp://ftp.irisa.fr/pub/mirrors/gcc.gnu.org/gcc/releases/gcc-${CT_CC_VERSION} \
yann@2302
    29
               ftp://ftp.uvsq.fr/pub/gcc/snapshots/${CT_CC_VERSION}                         \
yann@2302
    30
               "${linaro_base_url}/${linaro_series}/${linaro_version}/+download"
yann@1268
    31
yann@1129
    32
    # Starting with GCC 4.3, ecj is used for Java, and will only be
yann@1129
    33
    # built if the configure script finds ecj.jar at the top of the
yann@1129
    34
    # GCC source tree, which will not be there unless we get it and
yann@1129
    35
    # put it there ourselves
yann@1129
    36
    if [ "${CT_CC_LANG_JAVA_USE_ECJ}" = "y" ]; then
yann@1129
    37
        CT_GetFile ecj-latest .jar ftp://gcc.gnu.org/pub/java   \
yann@1129
    38
                                   ftp://sourceware.org/pub/java
yann@1129
    39
    fi
yann@850
    40
}
yann@850
    41
yann@850
    42
# Extract gcc
yann@850
    43
do_cc_extract() {
yann@1389
    44
    CT_Extract "gcc-${CT_CC_VERSION}"
yann@1901
    45
    CT_Patch "gcc" "${CT_CC_VERSION}"
yann@1268
    46
yann@1129
    47
    # Copy ecj-latest.jar to ecj.jar at the top of the GCC source tree
yann@1389
    48
    if [ "${CT_CC_LANG_JAVA_USE_ECJ}" = "y"                     \
yann@1389
    49
         -a ! -f "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/ecj.jar"   \
yann@1259
    50
       ]; then
yann@1389
    51
        CT_DoExecLog ALL cp -v "${CT_TARBALLS_DIR}/ecj-latest.jar" "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/ecj.jar"
yann@1129
    52
    fi
yann@850
    53
}
yann@850
    54
yann@850
    55
#------------------------------------------------------------------------------
yann@850
    56
# Core gcc pass 1
yann@850
    57
do_cc_core_pass_1() {
yann@2886
    58
    local -a core_opts
yann@2886
    59
    local do_core
yann@2886
    60
yann@850
    61
    # If we're building for bare metal, build the static core gcc,
yann@850
    62
    # with libgcc.
linux@1925
    63
    # In case we're not bare metal and building a canadian compiler, do nothing
yann@850
    64
    # In case we're not bare metal, and we're NPTL, build the static core gcc.
yann@850
    65
    # In any other case, do nothing.
linux@1925
    66
    case "${CT_BARE_METAL},${CT_CANADIAN},${CT_THREADS}" in
yann@2886
    67
        ,y,*)
yann@2886
    68
            ;;
yann@2886
    69
        ,,nptl)
yann@2886
    70
            do_core=y
yann@2886
    71
            core_opts+=( "mode=static" )
yann@2890
    72
            core_opts+=( "host=${CT_HOST}" )
yann@2888
    73
            core_opts+=( "complibs=${CT_COMPLIBS_DIR}" )
yann@2889
    74
            core_opts+=( "prefix=${CT_CC_CORE_STATIC_PREFIX_DIR}" )
yann@2891
    75
            core_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" )
yann@2886
    76
            ;;
yann@2886
    77
        *)
yann@2886
    78
            ;;
yann@850
    79
    esac
yann@2886
    80
yann@2886
    81
    if [ "${do_core}" = "y" ]; then
yann@2900
    82
        CT_DoStep INFO "Installing pass-1 core C compiler"
yann@2900
    83
        CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-core-pass-1"
yann@2900
    84
yann@2887
    85
        do_cc_core_backend "${core_opts[@]}"
yann@2900
    86
yann@2900
    87
        CT_Popd
yann@2900
    88
        CT_EndStep
yann@2886
    89
    fi
yann@850
    90
}
yann@850
    91
yann@850
    92
# Core gcc pass 2
yann@850
    93
do_cc_core_pass_2() {
yann@2886
    94
    local -a core_opts
yann@2886
    95
    local do_core
yann@2886
    96
yann@850
    97
    # In case we're building for bare metal, do nothing, we already have
yann@850
    98
    # our compiler.
linux@1925
    99
    # In case we're not bare metal and building a canadian compiler, do nothing
yann@892
   100
    # In case we're NPTL, build the shared core gcc and the target libgcc.
yann@892
   101
    # In any other case, build the static core gcc and, if using gcc-4.3+,
yann@892
   102
    # also build the target libgcc.
linux@1925
   103
    case "${CT_BARE_METAL},${CT_CANADIAN},${CT_THREADS}" in
bryanhundven@2212
   104
        y,*,*)
yann@2886
   105
            do_core=y
yann@2890
   106
            core_opts+=( "host=${CT_HOST}" )
yann@2893
   107
            core_opts+=( "mode=static" )
yann@2893
   108
            core_opts+=( "prefix=${CT_CC_CORE_STATIC_PREFIX_DIR}" )
yann@2888
   109
            core_opts+=( "complibs=${CT_COMPLIBS_DIR}" )
yann@2891
   110
            core_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" )
bryanhundven@2212
   111
            ;;
yann@1983
   112
        ,y,*)   ;;
linux@1925
   113
        ,,nptl)
yann@2886
   114
            do_core=y
yann@2886
   115
            core_opts+=( "mode=shared" )
yann@2890
   116
            core_opts+=( "host=${CT_HOST}" )
yann@2886
   117
            core_opts+=( "build_libgcc=yes" )
yann@2888
   118
            core_opts+=( "complibs=${CT_COMPLIBS_DIR}" )
yann@2889
   119
            core_opts+=( "prefix=${CT_CC_CORE_SHARED_PREFIX_DIR}" )
yann@2891
   120
            core_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" )
yann@892
   121
            ;;
bryanhundven@2212
   122
        ,,win32)
yann@2886
   123
            do_core=y
yann@2886
   124
            core_opts+=( "mode=static" )
yann@2890
   125
            core_opts+=( "host=${CT_HOST}" )
yann@2886
   126
            core_opts+=( "build_libgcc=yes" )
yann@2888
   127
            core_opts+=( "complibs=${CT_COMPLIBS_DIR}" )
yann@2889
   128
            core_opts+=( "prefix=${CT_CC_CORE_STATIC_PREFIX_DIR}" )
yann@2891
   129
            core_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" )
bartvdrmeulen@2017
   130
            ;;
yann@2886
   131
        *)
yann@2886
   132
            do_core=y
yann@2886
   133
            core_opts+=( "mode=static" )
yann@2890
   134
            core_opts+=( "host=${CT_HOST}" )
yann@2888
   135
            core_opts+=( "complibs=${CT_COMPLIBS_DIR}" )
yann@2889
   136
            core_opts+=( "prefix=${CT_CC_CORE_STATIC_PREFIX_DIR}" )
yann@2891
   137
            core_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" )
yann@2886
   138
            if [ "${CT_CC_GCC_4_3_or_later}" = "y" ]; then
yann@2886
   139
                core_opts+=( "build_libgcc=yes" )
yann@892
   140
            fi
yann@892
   141
            ;;
yann@850
   142
    esac
yann@2886
   143
yann@2886
   144
    if [ "${do_core}" = "y" ]; then
yann@2900
   145
        CT_DoStep INFO "Installing pass-2 core C compiler"
yann@2900
   146
        CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-core-pass-2"
yann@2900
   147
yann@2887
   148
        do_cc_core_backend "${core_opts[@]}"
yann@2900
   149
yann@2900
   150
        CT_Popd
yann@2900
   151
        CT_EndStep
yann@2886
   152
    fi
yann@850
   153
}
yann@850
   154
yann@850
   155
#------------------------------------------------------------------------------
yann@850
   156
# Build core gcc
yann@2897
   157
# This function is used to build the core C compiler.
yann@2897
   158
# Usage: do_cc_core_backend param=value [...]
yann@2897
   159
#   Parameter           : Definition                                : Type      : Default
yann@2897
   160
#   mode                : build a 'static', 'shared' or 'baremetal' : string    : (none)
yann@2897
   161
#   host                : the machine the core will run on          : tuple     : (none)
yann@2897
   162
#   prefix              : dir prefix to install into                : dir       : (none)
yann@2897
   163
#   complibs            : dir where complibs are isntalled          : dir       : (none)
yann@2897
   164
#   build_libgcc        : build libgcc or not                       : bool      : no
yann@2897
   165
#   build_libstdcxx     : build libstdc++ or not                    : bool      : no
yann@2897
   166
#   build_staticlinked  : build statically linked or not            : bool      : no
yann@2897
   167
#   build_manuals       : whether to build manuals or not           : bool      : no
yann@2897
   168
#   cflags              : host CFLAGS to use                        : string    : (empty)
yann@2887
   169
# Usage: do_cc_core_backend mode=[static|shared|baremetal] build_libgcc=[yes|no] build_staticlinked=[yes|no]
yann@2887
   170
do_cc_core_backend() {
yann@850
   171
    local mode
yann@1980
   172
    local build_libgcc=no
yann@1983
   173
    local build_libstdcxx=no
bryanhundven@2212
   174
    local build_staticlinked=no
michael@2765
   175
    local build_manuals=no
yann@2890
   176
    local host
yann@2889
   177
    local prefix
yann@2888
   178
    local complibs
yann@1107
   179
    local lang_opt
yann@2891
   180
    local cflags
yann@1479
   181
    local tmp
yann@2368
   182
    local -a host_libstdcxx_flags
yann@1479
   183
    local -a extra_config
bryanhundven@2212
   184
    local -a core_LDFLAGS
yann@1981
   185
    local -a core_targets
yann@2884
   186
    local arg
yann@850
   187
yann@2884
   188
    for arg in "$@"; do
yann@2884
   189
        eval "${arg// /\\ }"
yann@1980
   190
    done
yann@850
   191
yann@2900
   192
    CT_DoLog EXTRA "Configuring core C compiler"
yann@2900
   193
yann@1107
   194
    lang_opt=c
yann@850
   195
    case "${mode}" in
yann@850
   196
        static)
yann@1479
   197
            extra_config+=("--with-newlib")
yann@1479
   198
            extra_config+=("--enable-threads=no")
yann@1479
   199
            extra_config+=("--disable-shared")
yann@1983
   200
            copy_headers=y  # For baremetal, as there's no headers to copy,
yann@1983
   201
                            # we copy an empty directory. So, who cares?
yann@850
   202
            ;;
yann@850
   203
        shared)
yann@1479
   204
            extra_config+=("--enable-shared")
yann@850
   205
            copy_headers=y
yann@850
   206
            ;;
yann@850
   207
        baremetal)
yann@1479
   208
            extra_config+=("--with-newlib")
yann@1479
   209
            extra_config+=("--enable-threads=no")
yann@1479
   210
            extra_config+=("--disable-shared")
yann@1107
   211
            [ "${CT_CC_LANG_CXX}" = "y" ] && lang_opt="${lang_opt},c++"
yann@850
   212
            copy_headers=n
yann@850
   213
            ;;
yann@1980
   214
        *)
yann@1980
   215
            CT_Abort "Internal Error: 'mode' must be one of: 'static', 'shared' or 'baremetal', not '${mode:-(empty)}'"
yann@1980
   216
            ;;
yann@850
   217
    esac
yann@850
   218
benoit@2487
   219
    if [ "${CT_CC_GCC_HAS_PKGVERSION_BUGURL}" = "y" ]; then
benoit@2487
   220
        # Bare metal delivers the core compiler as final compiler, so add version info and bugurl
benoit@2503
   221
        extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
benoit@2503
   222
        [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
benoit@2487
   223
    fi
linux@1898
   224
yann@850
   225
    if [ "${copy_headers}" = "y" ]; then
yann@850
   226
        CT_DoLog DEBUG "Copying headers to install area of bootstrap gcc, so it can build libgcc2"
yann@2889
   227
        CT_DoExecLog ALL cp -a "${CT_HEADERS_DIR}" "${prefix}/${CT_TARGET}/include"
yann@850
   228
    fi
yann@850
   229
yann@1479
   230
    for tmp in ARCH ABI CPU TUNE FPU FLOAT; do
yann@1479
   231
        eval tmp="\${CT_ARCH_WITH_${tmp}}"
yann@1479
   232
        if [ -n "${tmp}" ]; then
yann@1479
   233
            extra_config+=("${tmp}")
yann@1479
   234
        fi
yann@1479
   235
    done
yann@850
   236
    if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
yann@1479
   237
        extra_config+=("--enable-__cxa_atexit")
yann@850
   238
    else
yann@1479
   239
        extra_config+=("--disable-__cxa_atexit")
yann@850
   240
    fi
yann@850
   241
bryanhundven@2212
   242
    # *** WARNING ! ***
bryanhundven@2212
   243
    # Keep this full if-else-if-elif-fi-fi block in sync
bryanhundven@2212
   244
    # with the same block in do_cc, below.
bryanhundven@2212
   245
    if [ "${build_staticlinked}" = "yes" ]; then
bryanhundven@2212
   246
        core_LDFLAGS+=("-static")
yann@2368
   247
        host_libstdcxx_flags+=("-static-libgcc")
yann@2368
   248
        host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++")
yann@2368
   249
        host_libstdcxx_flags+=("-lm")
bryanhundven@2212
   250
        # Companion libraries are build static (eg !shared), so
bryanhundven@2212
   251
        # the libstdc++ is not pulled automatically, although it
bryanhundven@2212
   252
        # is needed. Shoe-horn it in our LDFLAGS
bryanhundven@2212
   253
        # Ditto libm on some Fedora boxen
yann@2360
   254
        core_LDFLAGS+=("-lstdc++")
yann@2360
   255
        core_LDFLAGS+=("-lm")
bryanhundven@2212
   256
    else
bryanhundven@2212
   257
        if [ "${CT_CC_STATIC_LIBSTDCXX}" = "y" ]; then
bryanhundven@2212
   258
            # this is from CodeSourcery arm-2010q1-202-arm-none-linux-gnueabi.src.tar.bz2
bryanhundven@2212
   259
            # build script
yann@2491
   260
            # INFO: if the host gcc is gcc-4.5 then presumably we could use -static-libstdc++,
yann@2491
   261
            #       see http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01635.html
yann@2368
   262
            host_libstdcxx_flags+=("-static-libgcc")
yann@2368
   263
            host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++,-Bdynamic")
yann@2368
   264
            host_libstdcxx_flags+=("-lm")
bryanhundven@2212
   265
        elif [ "${CT_COMPLIBS_SHARED}" != "y" ]; then
bryanhundven@2212
   266
            # When companion libraries are build static (eg !shared),
bryanhundven@2212
   267
            # the libstdc++ is not pulled automatically, although it
bryanhundven@2212
   268
            # is needed. Shoe-horn it in our LDFLAGS
bryanhundven@2212
   269
            # Ditto libm on some Fedora boxen
bryanhundven@2212
   270
            core_LDFLAGS+=("-lstdc++")
bryanhundven@2212
   271
            core_LDFLAGS+=("-lm")
bryanhundven@2212
   272
        fi
yann@1892
   273
    fi
bryanhundven@2212
   274
yann@1893
   275
    if [ "${CT_CC_GCC_USE_GMP_MPFR}" = "y" ]; then
yann@2888
   276
        extra_config+=("--with-gmp=${complibs}")
yann@2888
   277
        extra_config+=("--with-mpfr=${complibs}")
yann@1893
   278
    fi
yann@2122
   279
    if [ "${CT_CC_GCC_USE_MPC}" = "y" ]; then
yann@2888
   280
        extra_config+=("--with-mpc=${complibs}")
yann@2122
   281
    fi
yann@2122
   282
    if [ "${CT_CC_GCC_USE_GRAPHITE}" = "y" ]; then
yann@2888
   283
        extra_config+=("--with-ppl=${complibs}")
yann@2368
   284
        # With PPL 0.11+, also pull libpwl if needed
yann@2368
   285
        if [ "${CT_PPL_NEEDS_LIBPWL}" = "y" ]; then
yann@2888
   286
            host_libstdcxx_flags+=("-L${complibs}/lib")
yann@2368
   287
            host_libstdcxx_flags+=("-lpwl")
yann@2368
   288
        fi
yann@2888
   289
        extra_config+=("--with-cloog=${complibs}")
yann@2123
   290
    elif [ "${CT_CC_GCC_HAS_GRAPHITE}" = "y" ]; then
yann@2123
   291
        extra_config+=("--with-ppl=no")
yann@2123
   292
        extra_config+=("--with-cloog=no")
yann@2014
   293
    fi
yann@2122
   294
    if [ "${CT_CC_GCC_USE_LTO}" = "y" ]; then
yann@2888
   295
        extra_config+=("--with-libelf=${complibs}")
yann@2142
   296
        extra_config+=("--enable-lto")
yann@2123
   297
    elif [ "${CT_CC_GCC_HAS_LTO}" = "y" ]; then
yann@2123
   298
        extra_config+=("--with-libelf=no")
yann@2142
   299
        extra_config+=("--disable-lto")
yann@1920
   300
    fi
yann@1893
   301
yann@2368
   302
    if [ ${#host_libstdcxx_flags[@]} -ne 0 ]; then
yann@2368
   303
        extra_config+=("--with-host-libstdcxx=${host_libstdcxx_flags[*]}")
yann@2368
   304
    fi
yann@2368
   305
titus@1972
   306
    if [ "${CT_CC_GCC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then
titus@1972
   307
        extra_config+=("--enable-target-optspace")
titus@1972
   308
    fi
titus@1972
   309
yann@2143
   310
    case "${CT_CC_GCC_LDBL_128}" in
yann@2153
   311
        y)  extra_config+=("--with-long-double-128");;
yann@2153
   312
        m)  ;;
yann@2143
   313
        "") extra_config+=("--without-long-double-128");;
yann@2143
   314
    esac
yann@2143
   315
yann@2521
   316
    if [ "${CT_CC_GCC_BUILD_ID}" = "y" ]; then
yann@2521
   317
        extra_config+=( --enable-linker-build-id )
yann@2521
   318
    fi
yann@2521
   319
yann@2522
   320
    case "${CT_CC_GCC_LNK_HASH_STYLE}" in
yann@2522
   321
        "") ;;
yann@2522
   322
        *)  extra_config+=( "--with-linker-hash-style=${CT_CC_GCC_LNK_HASH_STYLE}" );;
yann@2522
   323
    esac
yann@2522
   324
yann@2532
   325
    case "${CT_ARCH}" in
yann@2532
   326
        mips)
yann@2532
   327
            case "${CT_CC_GCC_mips_llsc}" in
yann@2532
   328
                y)  extra_config+=( --with-llsc );;
yann@2532
   329
                m)  ;;
yann@2532
   330
                *)  extra_config+=( --without-llsc );;
yann@2532
   331
            esac
yann@2532
   332
            case "${CT_CC_GCC_mips_synci}" in
yann@2532
   333
                y)  extra_config+=( --with-synci );;
yann@2532
   334
                m)  ;;
yann@2532
   335
                *)  extra_config+=( --without-synci );;
yann@2532
   336
            esac
yann@2532
   337
            if [ "${CT_CC_GCC_mips_plt}" ]; then
yann@2532
   338
                extra_config+=( --with-mips-plt )
yann@2532
   339
            fi
yann@2532
   340
            ;; # ARCH is mips
yann@2523
   341
    esac
yann@2523
   342
yann@2545
   343
    extra_config+=(--disable-libgomp)
yann@2545
   344
    extra_config+=(--disable-libmudflap)
yann@2545
   345
zhenqiang@2780
   346
    [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
zhenqiang@2780
   347
zhenqiang@2782
   348
    [ "${CT_CC_GCC_DISABLE_PCH}" = "y" ] && extra_config+=("--disable-libstdcxx-pch")
zhenqiang@2782
   349
yann@2814
   350
    if [ "${CT_CC_GCC_SYSTEM_ZLIB}" = "y" ]; then
yann@2814
   351
        extra_config+=("--with-system-zlib")
yann@2814
   352
    fi
yann@2814
   353
yann@2817
   354
    if [ "${CT_MULTILIB}" = "y" ]; then
yann@2817
   355
        extra_config+=("--enable-multilib")
yann@2817
   356
    else
yann@2817
   357
        extra_config+=("--disable-multilib")
yann@2817
   358
    fi
yann@2817
   359
yann@1893
   360
    CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
yann@1892
   361
yann@850
   362
    # Use --with-local-prefix so older gccs don't look in /usr/local (http://gcc.gnu.org/PR10532)
yann@2355
   363
    CT_DoExecLog CFG                                \
yann@1041
   364
    CC_FOR_BUILD="${CT_BUILD}-gcc"                  \
yann@2891
   365
    CFLAGS="${cflags}"                              \
bryanhundven@2212
   366
    LDFLAGS="${core_LDFLAGS[*]}"                    \
yann@1389
   367
    "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure"  \
yann@1041
   368
        --build=${CT_BUILD}                         \
yann@2890
   369
        --host=${host}                              \
yann@850
   370
        --target=${CT_TARGET}                       \
yann@2889
   371
        --prefix="${prefix}"                        \
yann@850
   372
        --with-local-prefix="${CT_SYSROOT_DIR}"     \
yann@2043
   373
        --disable-libmudflap                        \
yann@850
   374
        ${CC_CORE_SYSROOT_ARG}                      \
yann@1479
   375
        "${extra_config[@]}"                        \
yann@1107
   376
        --enable-languages="${lang_opt}"            \
yann@2467
   377
        "${CT_CC_CORE_EXTRA_CONFIG_ARRAY[@]}"
yann@850
   378
yann@850
   379
    if [ "${build_libgcc}" = "yes" ]; then
yann@850
   380
        # HACK: we need to override SHLIB_LC from gcc/config/t-slibgcc-elf-ver or
yann@850
   381
        # gcc/config/t-libunwind so -lc is removed from the link for
yann@850
   382
        # libgcc_s.so, as we do not have a target -lc yet.
yann@850
   383
        # This is not as ugly as it appears to be ;-) All symbols get resolved
yann@850
   384
        # during the glibc build, and we provide a proper libgcc_s.so for the
yann@850
   385
        # cross toolchain during the final gcc build.
yann@850
   386
        #
yann@850
   387
        # As we cannot modify the source tree, nor override SHLIB_LC itself
yann@850
   388
        # during configure or make, we have to edit the resultant
yann@850
   389
        # gcc/libgcc.mk itself to remove -lc from the link.
yann@850
   390
        # This causes us to have to jump through some hoops...
yann@850
   391
        #
yann@850
   392
        # To produce libgcc.mk to edit we firstly require libiberty.a,
yann@850
   393
        # so we configure then build it.
yann@850
   394
        # Next we have to configure gcc, create libgcc.mk then edit it...
yann@850
   395
        # So much easier if we just edit the source tree, but hey...
yann@1389
   396
        if [ ! -f "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/gcc/BASE-VER" ]; then
yann@2676
   397
            CT_DoExecLog CFG make ${JOBSFLAGS} configure-libiberty
yann@2275
   398
            CT_DoExecLog ALL make ${JOBSFLAGS} -C libiberty libiberty.a
yann@2676
   399
            CT_DoExecLog CFG make ${JOBSFLAGS} configure-gcc configure-libcpp
yann@2275
   400
            CT_DoExecLog ALL make ${JOBSFLAGS} all-libcpp
yann@850
   401
        else
yann@2676
   402
            CT_DoExecLog CFG make ${JOBSFLAGS} configure-gcc configure-libcpp configure-build-libiberty
yann@2275
   403
            CT_DoExecLog ALL make ${JOBSFLAGS} all-libcpp all-build-libiberty
yann@850
   404
        fi
yann@850
   405
        # HACK: gcc-4.2 uses libdecnumber to build libgcc.mk, so build it here.
yann@1389
   406
        if [ -d "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/libdecnumber" ]; then
yann@2676
   407
            CT_DoExecLog CFG make ${JOBSFLAGS} configure-libdecnumber
yann@2275
   408
            CT_DoExecLog ALL make ${JOBSFLAGS} -C libdecnumber libdecnumber.a
yann@850
   409
        fi
yann@850
   410
yann@850
   411
        # Starting with GCC 4.3, libgcc.mk is no longer built,
yann@850
   412
        # and libgcc.mvars is used instead.
yann@850
   413
yann@892
   414
        if [ "${CT_CC_GCC_4_3_or_later}" = "y" ]; then
yann@850
   415
            libgcc_rule="libgcc.mvars"
yann@1981
   416
            core_targets=( gcc target-libgcc )
yann@850
   417
        else
yann@850
   418
            libgcc_rule="libgcc.mk"
yann@1981
   419
            core_targets=( gcc )
yann@850
   420
        fi
yann@850
   421
linux@1926
   422
        # On bare metal and canadian build the host-compiler is used when
linux@1926
   423
        # actually the build-system compiler is required. Choose the correct
linux@1926
   424
        # compilers for canadian build and use the defaults on other
linux@1926
   425
        # configurations.
linux@1926
   426
        if [ "${CT_BARE_METAL},${CT_CANADIAN}" = "y,y" ]; then
linux@1926
   427
            repair_cc="CC_FOR_BUILD=${CT_BUILD}-gcc \
linux@1926
   428
                       GCC_FOR_TARGET=${CT_TARGET}-gcc"
linux@1926
   429
        else
linux@1926
   430
            repair_cc=""
linux@1926
   431
        fi
linux@1926
   432
yann@2275
   433
        CT_DoExecLog ALL make ${JOBSFLAGS} -C gcc ${libgcc_rule} \
linux@1926
   434
                              ${repair_cc}
yann@850
   435
        sed -r -i -e 's@-lc@@g' gcc/${libgcc_rule}
yann@850
   436
    else # build_libgcc
yann@1981
   437
        core_targets=( gcc )
yann@850
   438
    fi   # ! build libgcc
yann@1983
   439
    if [    "${build_libstdcxx}" = "yes"    \
yann@1983
   440
         -a "${CT_CC_LANG_CXX}"  = "y"      \
yann@1983
   441
       ]; then
yann@1983
   442
        core_targets+=( target-libstdc++-v3 )
yann@1983
   443
    fi
yann@850
   444
yann@2900
   445
    CT_DoLog EXTRA "Building core C compiler"
yann@2275
   446
    CT_DoExecLog ALL make ${JOBSFLAGS} "${core_targets[@]/#/all-}"
yann@850
   447
yann@2900
   448
    CT_DoLog EXTRA "Installing core C compiler"
yann@2676
   449
    CT_DoExecLog ALL make ${JOBSFLAGS} "${core_targets[@]/#/install-}"
yann@850
   450
yann@2894
   451
    if [ "${build_manuals}" = "yes" ]; then
michael@2765
   452
        CT_DoLog EXTRA "Building the GCC manuals"
michael@2765
   453
        CT_DoExecLog ALL make pdf html
michael@2765
   454
        CT_DoLog EXTRA "Installing the GCC manuals"
michael@2765
   455
        CT_DoExecLog ALL make install-{pdf,html}-gcc
michael@2765
   456
    fi
michael@2765
   457
yann@1269
   458
    # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
yann@1269
   459
    # to call the C compiler with the same, somewhat canonical name.
linux@1924
   460
    # check whether compiler has an extension
yann@2889
   461
    file="$( ls -1 "${prefix}/bin/${CT_TARGET}-gcc."* 2>/dev/null || true )"
linux@1924
   462
    [ -z "${file}" ] || ext=".${file##*.}"
yann@2889
   463
    CT_DoExecLog ALL ln -sfv "${CT_TARGET}-gcc${ext}" "${prefix}/bin/${CT_TARGET}-cc${ext}"
yann@1269
   464
yann@2818
   465
    if [ "${CT_MULTILIB}" = "y" ]; then
yann@2818
   466
        multilibs=( $( "${core_prefix_dir}/bin/${CT_TARGET}-gcc" -print-multi-lib   \
yann@2818
   467
                       |tail -n +2 ) )
yann@2818
   468
        if [ ${#multilibs[@]} -ne 0 ]; then
yann@2818
   469
            CT_DoLog EXTRA "gcc configured with these multilibs (besides the default):"
yann@2818
   470
            for i in "${multilibs[@]}"; do
yann@2818
   471
                dir="${i%%;*}"
yann@2818
   472
                flags="${i#*;}"
yann@2818
   473
                CT_DoLog EXTRA "   ${flags//@/ -}  -->  ${dir}/"
yann@2818
   474
            done
yann@2818
   475
        else
yann@2818
   476
            CT_DoLog WARN "gcc configured for multilib, but none available"
yann@2818
   477
        fi
yann@2818
   478
    fi
yann@850
   479
}
yann@850
   480
yann@850
   481
#------------------------------------------------------------------------------
yann@850
   482
# Build final gcc
yann@850
   483
do_cc() {
yann@2892
   484
    local -a final_opts
yann@2893
   485
    local final_backend
yann@2892
   486
yann@2892
   487
    final_opts+=( "host=${CT_HOST}" )
yann@2892
   488
    final_opts+=( "prefix=${CT_PREFIX_DIR}" )
yann@2892
   489
    final_opts+=( "complibs=${CT_COMPLIBS_DIR}" )
yann@2892
   490
    final_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" )
yann@2894
   491
    if [ "${CT_BUILD_MANUALS}" = "y" ]; then
yann@2894
   492
        final_opts+=( "build_manuals=yes" )
yann@2894
   493
    fi
yann@2893
   494
    if [ "${CT_BARE_METAL}" = "y" ]; then
yann@2893
   495
        final_opts+=( "mode=baremetal" )
yann@2893
   496
        final_opts+=( "build_libgcc=yes" )
yann@2893
   497
        final_opts+=( "build_libstdcxx=yes" )
yann@2893
   498
        if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
yann@2893
   499
            final_opts+=( "build_staticlinked=yes" )
yann@2893
   500
        fi
yann@2893
   501
        final_backend=do_cc_core_backend
yann@2893
   502
    else
yann@2893
   503
        final_backend=do_cc_backend
yann@2893
   504
    fi
yann@2892
   505
yann@2900
   506
    CT_DoStep INFO "Installing final compiler"
yann@2900
   507
    CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-final"
yann@2900
   508
yann@2893
   509
    "${final_backend}" "${final_opts[@]}"
yann@2900
   510
yann@2900
   511
    CT_Popd
yann@2900
   512
    CT_EndStep
yann@2892
   513
}
yann@2892
   514
yann@2892
   515
#------------------------------------------------------------------------------
yann@2897
   516
# Build the final gcc
yann@2897
   517
# Usage: do_cc_backend param=value [...]
yann@2892
   518
#   Parameter     : Definition                          : Type      : Default
yann@2892
   519
#   host          : the host we run onto                : tuple     : (none)
yann@2892
   520
#   prefix        : the runtime prefix                  : dir       : (none)
yann@2892
   521
#   complibs      : the companion libraries prefix      : dir       : (none)
yann@2892
   522
#   cflags        : the host CFLAGS                     : string    : (empty)
yann@2894
   523
#   build_manuals : whether to build manuals or not     : bool      : no
yann@2892
   524
do_cc_backend() {
yann@2892
   525
    local host
yann@2892
   526
    local prefix
yann@2892
   527
    local complibs
yann@2892
   528
    local cflags
yann@2894
   529
    local build_manuals
yann@2368
   530
    local -a host_libstdcxx_flags
yann@1479
   531
    local -a extra_config
bryanhundven@2211
   532
    local -a final_LDFLAGS
yann@1479
   533
    local tmp
yann@2892
   534
    local arg
yann@1479
   535
yann@2892
   536
    for arg in "$@"; do
yann@2892
   537
        eval "${arg// /\\ }"
yann@2892
   538
    done
yann@2892
   539
yann@850
   540
    CT_DoLog EXTRA "Configuring final compiler"
yann@850
   541
yann@850
   542
    # Enable selected languages
yann@850
   543
    lang_opt="c"
yann@850
   544
    [ "${CT_CC_LANG_CXX}" = "y"      ] && lang_opt="${lang_opt},c++"
yann@850
   545
    [ "${CT_CC_LANG_FORTRAN}" = "y"  ] && lang_opt="${lang_opt},fortran"
yann@850
   546
    [ "${CT_CC_LANG_ADA}" = "y"      ] && lang_opt="${lang_opt},ada"
yann@850
   547
    [ "${CT_CC_LANG_JAVA}" = "y"     ] && lang_opt="${lang_opt},java"
yann@850
   548
    [ "${CT_CC_LANG_OBJC}" = "y"     ] && lang_opt="${lang_opt},objc"
yann@850
   549
    [ "${CT_CC_LANG_OBJCXX}" = "y"   ] && lang_opt="${lang_opt},obj-c++"
yann@850
   550
    CT_Test "Building ADA language is not yet supported. Will try..." "${CT_CC_LANG_ADA}" = "y"
yann@850
   551
    CT_Test "Building Objective-C language is not yet supported. Will try..." "${CT_CC_LANG_OBJC}" = "y"
yann@850
   552
    CT_Test "Building Objective-C++ language is not yet supported. Will try..." "${CT_CC_LANG_OBJCXX}" = "y"
yann@850
   553
    CT_Test "Building ${CT_CC_LANG_OTHERS//,/ } language(s) is not yet supported. Will try..." -n "${CT_CC_LANG_OTHERS}"
yann@850
   554
    lang_opt=$(echo "${lang_opt},${CT_CC_LANG_OTHERS}" |sed -r -e 's/,+/,/g; s/,*$//;')
yann@850
   555
yann@1479
   556
    extra_config+=("--enable-languages=${lang_opt}")
yann@1479
   557
    for tmp in ARCH ABI CPU TUNE FPU FLOAT; do
yann@1479
   558
        eval tmp="\${CT_ARCH_WITH_${tmp}}"
yann@1479
   559
        if [ -n "${tmp}" ]; then
yann@1479
   560
            extra_config+=("${tmp}")
yann@1479
   561
        fi
yann@1479
   562
    done
yann@1479
   563
benoit@2487
   564
    [ "${CT_SHARED_LIBS}" = "y" ] || extra_config+=("--disable-shared")
benoit@2487
   565
    if [ "${CT_CC_GCC_HAS_PKGVERSION_BUGURL}" = "y" ]; then
benoit@2503
   566
        extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
benoit@2503
   567
        [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
benoit@2487
   568
    fi
yann@2042
   569
    case "${CT_CC_GCC_SJLJ_EXCEPTIONS}" in
yann@2042
   570
        y)  extra_config+=("--enable-sjlj-exceptions");;
yann@2042
   571
        m)  ;;
yann@2042
   572
        "") extra_config+=("--disable-sjlj-exceptions");;
yann@2042
   573
    esac
yann@850
   574
    if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
yann@1479
   575
        extra_config+=("--enable-__cxa_atexit")
yann@850
   576
    else
yann@1479
   577
        extra_config+=("--disable-__cxa_atexit")
yann@850
   578
    fi
benoit@2475
   579
    if [ -n "${CT_CC_ENABLE_CXX_FLAGS}" ]; then
benoit@2475
   580
        extra_config+=("--enable-cxx-flags=${CT_CC_ENABLE_CXX_FLAGS}")
yann@1484
   581
    fi
yann@2043
   582
    if [ "${CT_CC_GCC_LIBMUDFLAP}" = "y" ]; then
yann@2043
   583
        extra_config+=(--enable-libmudflap)
yann@2043
   584
    else
yann@2043
   585
        extra_config+=(--disable-libmudflap)
yann@2043
   586
    fi
yann@2145
   587
    if [ "${CT_CC_GCC_LIBGOMP}" = "y" ]; then
yann@2145
   588
        extra_config+=(--enable-libgomp)
yann@2145
   589
    else
yann@2145
   590
        extra_config+=(--disable-libgomp)
yann@2145
   591
    fi
yann@2146
   592
    if [ "${CT_CC_GCC_LIBSSP}" = "y" ]; then
yann@2146
   593
        extra_config+=(--enable-libssp)
yann@2146
   594
    else
yann@2146
   595
        extra_config+=(--disable-libssp)
yann@2146
   596
    fi
yann@1893
   597
bryanhundven@2212
   598
    # *** WARNING ! ***
bryanhundven@2212
   599
    # Keep this full if-else-if-elif-fi-fi block in sync
bryanhundven@2212
   600
    # with the same block in do_cc_core, above.
bryanhundven@2211
   601
    if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
bryanhundven@2211
   602
        final_LDFLAGS+=("-static")
yann@2368
   603
        host_libstdcxx_flags+=("-static-libgcc")
yann@2368
   604
        host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++")
yann@2368
   605
        host_libstdcxx_flags+=("-lm")
bryanhundven@2211
   606
        # Companion libraries are build static (eg !shared), so
js@2045
   607
        # the libstdc++ is not pulled automatically, although it
js@2045
   608
        # is needed. Shoe-horn it in our LDFLAGS
dwatkins@2070
   609
        # Ditto libm on some Fedora boxen
bryanhundven@2211
   610
        final_LDFLAGS+=("-lstdc++")
bryanhundven@2211
   611
        final_LDFLAGS+=("-lm")
bryanhundven@2211
   612
    else
bryanhundven@2211
   613
        if [ "${CT_CC_STATIC_LIBSTDCXX}" = "y" ]; then
bryanhundven@2211
   614
            # this is from CodeSourcery arm-2010q1-202-arm-none-linux-gnueabi.src.tar.bz2
bryanhundven@2211
   615
            # build script
yann@2491
   616
            # INFO: if the host gcc is gcc-4.5 then presumably we could use -static-libstdc++,
yann@2491
   617
            #       see http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01635.html
yann@2368
   618
            host_libstdcxx_flags+=("-static-libgcc")
yann@2368
   619
            host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++,-Bdynamic")
yann@2368
   620
            host_libstdcxx_flags+=("-lm")
bryanhundven@2211
   621
        elif [ "${CT_COMPLIBS_SHARED}" != "y" ]; then
bryanhundven@2211
   622
            # When companion libraries are build static (eg !shared),
bryanhundven@2211
   623
            # the libstdc++ is not pulled automatically, although it
bryanhundven@2211
   624
            # is needed. Shoe-horn it in our LDFLAGS
bryanhundven@2211
   625
            # Ditto libm on some Fedora boxen
bryanhundven@2211
   626
            final_LDFLAGS+=("-lstdc++")
bryanhundven@2211
   627
            final_LDFLAGS+=("-lm")
bryanhundven@2211
   628
        fi
yann@1893
   629
    fi
bryanhundven@2211
   630
lacombar@1880
   631
    if [ "${CT_CC_GCC_USE_GMP_MPFR}" = "y" ]; then
yann@2892
   632
        extra_config+=("--with-gmp=${complibs}")
yann@2892
   633
        extra_config+=("--with-mpfr=${complibs}")
yann@1848
   634
    fi
yann@2122
   635
    if [ "${CT_CC_GCC_USE_MPC}" = "y" ]; then
yann@2892
   636
        extra_config+=("--with-mpc=${complibs}")
yann@2122
   637
    fi
yann@2122
   638
    if [ "${CT_CC_GCC_USE_GRAPHITE}" = "y" ]; then
yann@2892
   639
        extra_config+=("--with-ppl=${complibs}")
yann@2368
   640
        # With PPL 0.11+, also pull libpwl if needed
yann@2368
   641
        if [ "${CT_PPL_NEEDS_LIBPWL}" = "y" ]; then
yann@2892
   642
            host_libstdcxx_flags+=("-L${complibs}/lib")
yann@2368
   643
            host_libstdcxx_flags+=("-lpwl")
yann@2368
   644
        fi
yann@2892
   645
        extra_config+=("--with-cloog=${complibs}")
yann@2123
   646
    elif [ "${CT_CC_GCC_HAS_GRAPHITE}" = "y" ]; then
yann@2123
   647
        extra_config+=("--with-ppl=no")
yann@2123
   648
        extra_config+=("--with-cloog=no")
yann@2014
   649
    fi
yann@2122
   650
    if [ "${CT_CC_GCC_USE_LTO}" = "y" ]; then
yann@2892
   651
        extra_config+=("--with-libelf=${complibs}")
yann@2123
   652
    elif [ "${CT_CC_GCC_HAS_LTO}" = "y" ]; then
yann@2123
   653
        extra_config+=("--with-libelf=no")
yann@1920
   654
    fi
yann@850
   655
yann@2368
   656
    if [ ${#host_libstdcxx_flags[@]} -ne 0 ]; then
yann@2368
   657
        extra_config+=("--with-host-libstdcxx=${host_libstdcxx_flags[*]}")
yann@2368
   658
    fi
yann@2368
   659
lacombar@1881
   660
    if [ "${CT_THREADS}" = "none" ]; then
lacombar@1881
   661
        extra_config+=("--disable-threads")
lacombar@1881
   662
        if [ "${CT_CC_GCC_4_2_or_later}" = y ]; then
yann@2145
   663
            CT_Test "Disabling libgomp for no-thread gcc>=4.2" "${CT_CC_GCC_LIBGOMP}" = "Y"
lacombar@1881
   664
            extra_config+=("--disable-libgomp")
lacombar@1881
   665
        fi
lacombar@1881
   666
    else
bartvdrmeulen@2017
   667
        if [ "${CT_THREADS}" = "win32" ]; then
bartvdrmeulen@2017
   668
            extra_config+=("--enable-threads=win32")
bartvdrmeulen@2017
   669
            extra_config+=("--disable-win32-registry")
bartvdrmeulen@2017
   670
        else
bartvdrmeulen@2017
   671
            extra_config+=("--enable-threads=posix")
bartvdrmeulen@2017
   672
        fi
lacombar@1881
   673
    fi
lacombar@1881
   674
titus@1972
   675
    if [ "${CT_CC_GCC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then
titus@1972
   676
        extra_config+=("--enable-target-optspace")
titus@1972
   677
    fi
yann@1991
   678
    if [ "${CT_CC_GCC_DISABLE_PCH}" = "y" ]; then
yann@1991
   679
        extra_config+=("--disable-libstdcxx-pch")
yann@1991
   680
    fi
titus@1972
   681
yann@2143
   682
    case "${CT_CC_GCC_LDBL_128}" in
yann@2153
   683
        y)  extra_config+=("--with-long-double-128");;
yann@2153
   684
        m)  ;;
yann@2143
   685
        "") extra_config+=("--without-long-double-128");;
yann@2143
   686
    esac
yann@2143
   687
yann@2521
   688
    if [ "${CT_CC_GCC_BUILD_ID}" = "y" ]; then
yann@2521
   689
        extra_config+=( --enable-linker-build-id )
yann@2521
   690
    fi
yann@2521
   691
yann@2522
   692
    case "${CT_CC_GCC_LNK_HASH_STYLE}" in
yann@2522
   693
        "") ;;
yann@2522
   694
        *)  extra_config+=( "--with-linker-hash-style=${CT_CC_GCC_LNK_HASH_STYLE}" );;
yann@2522
   695
    esac
yann@2522
   696
yann@2287
   697
    if [ "${CT_CC_GCC_ENABLE_PLUGINS}" = "y" ]; then
yann@2287
   698
        extra_config+=( --enable-plugin )
yann@2287
   699
    fi
yann@2287
   700
    if [ "${CT_CC_GCC_GOLD}" = "y" ]; then
yann@2248
   701
        extra_config+=( --enable-gold )
yann@2248
   702
    fi
yann@2248
   703
yann@2532
   704
    case "${CT_ARCH}" in
yann@2532
   705
        mips)
yann@2532
   706
            case "${CT_CC_GCC_mips_llsc}" in
yann@2532
   707
                y)  extra_config+=( --with-llsc );;
yann@2532
   708
                m)  ;;
yann@2532
   709
                *)  extra_config+=( --without-llsc );;
yann@2532
   710
            esac
yann@2532
   711
            case "${CT_CC_GCC_mips_synci}" in
yann@2532
   712
                y)  extra_config+=( --with-synci );;
yann@2532
   713
                m)  ;;
yann@2532
   714
                *)  extra_config+=( --without-synci );;
yann@2532
   715
            esac
yann@2532
   716
            if [ "${CT_CC_GCC_mips_plt}" ]; then
yann@2532
   717
                extra_config+=( --with-mips-plt )
yann@2532
   718
            fi
yann@2532
   719
            ;; # ARCH is mips
yann@2532
   720
    esac
yann@2532
   721
zhenqiang@2780
   722
    [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
zhenqiang@2780
   723
yann@2814
   724
    if [ "${CT_CC_GCC_SYSTEM_ZLIB}" = "y" ]; then
yann@2814
   725
        extra_config+=("--with-system-zlib")
yann@2814
   726
    fi
yann@2814
   727
yann@2817
   728
    if [ "${CT_MULTILIB}" = "y" ]; then
yann@2817
   729
        extra_config+=("--enable-multilib")
yann@2817
   730
    else
yann@2817
   731
        extra_config+=("--disable-multilib")
yann@2817
   732
    fi
yann@2817
   733
yann@1479
   734
    CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
yann@850
   735
yann@2355
   736
    CT_DoExecLog CFG                                \
yann@1122
   737
    CC_FOR_BUILD="${CT_BUILD}-gcc"                  \
yann@2892
   738
    CFLAGS="${cflags}"                              \
bryanhundven@2211
   739
    LDFLAGS="${final_LDFLAGS[*]}"                   \
yann@1122
   740
    CFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"         \
yann@1122
   741
    CXXFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"       \
yann@1122
   742
    LDFLAGS_FOR_TARGET="${CT_TARGET_LDFLAGS}"       \
yann@1389
   743
    "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure"  \
yann@1122
   744
        --build=${CT_BUILD}                         \
yann@2892
   745
        --host=${host}                              \
yann@1122
   746
        --target=${CT_TARGET}                       \
yann@2892
   747
        --prefix="${prefix}"                        \
yann@1122
   748
        ${CC_SYSROOT_ARG}                           \
yann@1479
   749
        "${extra_config[@]}"                        \
yann@1122
   750
        --with-local-prefix="${CT_SYSROOT_DIR}"     \
yann@1122
   751
        --enable-c99                                \
yann@1122
   752
        --enable-long-long                          \
yann@2467
   753
        "${CT_CC_EXTRA_CONFIG_ARRAY[@]}"
yann@850
   754
yann@850
   755
    if [ "${CT_CANADIAN}" = "y" ]; then
yann@850
   756
        CT_DoLog EXTRA "Building libiberty"
yann@2275
   757
        CT_DoExecLog ALL make ${JOBSFLAGS} all-build-libiberty
yann@850
   758
    fi
yann@850
   759
yann@850
   760
    CT_DoLog EXTRA "Building final compiler"
yann@2275
   761
    CT_DoExecLog ALL make ${JOBSFLAGS} all
yann@850
   762
yann@850
   763
    CT_DoLog EXTRA "Installing final compiler"
yann@2676
   764
    CT_DoExecLog ALL make ${JOBSFLAGS} install
yann@850
   765
yann@2894
   766
    if [ "${build_manuals}" = "yes" ]; then
michael@2765
   767
        CT_DoLog EXTRA "Building the GCC manuals"
michael@2765
   768
        CT_DoExecLog ALL make ${JOBSFLAGS} pdf html
michael@2765
   769
        CT_DoLog EXTRA "Installing the GCC manuals"
michael@2765
   770
        CT_DoExecLog ALL make install-{pdf,html}-gcc
michael@2765
   771
    fi
michael@2765
   772
yann@850
   773
    # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
yann@850
   774
    # to call the C compiler with the same, somewhat canonical name.
linux@1924
   775
    # check whether compiler has an extension
bartvdrmeulen@2031
   776
    file="$( ls -1 "${CT_PREFIX_DIR}/bin/${CT_TARGET}-gcc."* 2>/dev/null || true )"
linux@1924
   777
    [ -z "${file}" ] || ext=".${file##*.}"
yann@2550
   778
    CT_DoExecLog ALL ln -sfv "${CT_TARGET}-gcc${ext}" "${CT_PREFIX_DIR}/bin/${CT_TARGET}-cc${ext}"
yann@850
   779
yann@2818
   780
    if [ "${CT_MULTILIB}" = "y" ]; then
yann@2818
   781
        multilibs=( $( "${CT_PREFIX_DIR}/bin/${CT_TARGET}-gcc" -print-multi-lib \
yann@2818
   782
                       |tail -n +2 ) )
yann@2818
   783
        if [ ${#multilibs[@]} -ne 0 ]; then
yann@2818
   784
            CT_DoLog EXTRA "gcc configured with these multilibs (besides the default):"
yann@2818
   785
            for i in "${multilibs[@]}"; do
yann@2818
   786
                dir="${i%%;*}"
yann@2818
   787
                flags="${i#*;}"
yann@2818
   788
                CT_DoLog EXTRA "   ${flags//@/ -}  -->  ${dir}/"
yann@2818
   789
            done
yann@2818
   790
        else
yann@2818
   791
            CT_DoLog WARN "gcc configured for multilib, but none available"
yann@2818
   792
        fi
yann@2818
   793
    fi
yann@850
   794
}