scripts/build/cc/gcc.sh
author Johannes Stezenbach <js@sig21.net>
Tue Oct 30 00:22:25 2012 +0000 (2012-10-30)
changeset 3097 5c67476c7342
parent 3088 7f5a3382968f
child 3119 1c56c03b7ed5
permissions -rw-r--r--
scripts/functions: fix endless loop in debug-shell with IO redirection

CT_DEBUG_INTERACTIVE is disabled when stdin, stdout or
stderr are redirected, but the check is only done at
the start of the build and doesn't catch when individual
build commands use redirection. When stdin is redirected
it will cause the debug shell to exit immediately, causing
and endless loop. Thus, save the stdin/our/err file handles
and restore them before invoking the debug shell.

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