scripts/build/cc/gcc.sh
author "Yann E. MORIN" <yann.morin.1998@free.fr>
Sun May 05 00:01:05 2013 +0200 (2013-05-05)
changeset 3218 3709e61ad85b
parent 3215 4c63ce24fccd
child 3244 8ff20760e93b
permissions -rw-r--r--
complibs/cloog: add support for the ISL backend

CLooG 0.18+ will use ISL instead of PPL, so we have to configure
adequately depending of which backend is in use.

The Kconfig entries will decide for us which is selected, so we
can rely on either PPL xor ISL to be selected, not both.

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