scripts/build/cc/gcc.sh
author Daniel Price <daniel.price@gmail.com>
Tue Nov 20 16:59:17 2012 -0800 (2012-11-20)
changeset 3126 333d3e40cbd1
parent 3093 f5af323f7805
child 3131 bd172b161ff8
permissions -rw-r--r--
scripts: refine static linking check to better guide the user

The current mechanism to check if static linking is possible, and the mesage
displayed on failure, can be puzzling to the unsuspecting user.

Also, the current implementation is not using the existing infrastructure,
and is thus difficult to enhance with new tests.

So, switch to using the standard CT_DoExecLog infra, and use four tests to
check for the host compiler:
- check we can run it
- check it can build a trivial program
- check it can statically link that program
- check if it statically link with libstdc++

That should cover most of the problems. Hopefully.

(At the same time, fix a typo in a comment)

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