scripts/build/cc/gcc.sh
author Cody Schafer <dev@codyps.com>
Fri May 09 19:13:49 2014 -0700 (2014-05-09)
changeset 3312 4876ff97e039
parent 3311 e35fa03cd204
permissions -rw-r--r--
cc/gcc: allow CC_EXTRA_CONFIG_ARRAY on baremetal

The final bare-metal compiler is built using the core backend.
Currently the core uses the CC_CORE_EXTRA_CONFIG_ARRAY variable.

While this works as supposed to, this can leave the user puzzled
in the menuconfig, since all he can see is the core options, not
the final options.

Only show the core options if any of the core passes are needed,
and use the final options in the core-backend if we're issuing
the bare-metal compiler.

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