scripts/build/cc/gcc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jul 17 22:43:07 2011 +0200 (2011-07-17)
changeset 2893 a8a65758664f
parent 2892 aa934ec4b4ee
child 2894 7c6f2d990384
permissions -rw-r--r--
cc/gcc: do not use the core pass-2 to build the baremetal compiler

In case we build a baremetal compiler, use the standard passes:
- core_cc is used to build the C library;
- as such, it is meant to run on build, not host;
- the final compiler is meant to run on host;

As the current final compiler step can not build a baremetal compiler,
call the core backend from the final step.

NB: Currently, newlib is built during the start_files pass, so we have
to have a core compiler by then... Once we can build the baremetal
compiler from the final cc step, then we can move the newlib build to
the proper step, and then get rid of the core pass-1 static compiler...

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