scripts/build/cc/gcc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Fri Aug 19 00:52:05 2011 +0200 (2011-08-19)
changeset 2614 814ea73df7e0
parent 2545 484f5cf55902
child 2676 af542a04bf69
permissions -rw-r--r--
scripts: simplify and fix the toolchain config script

The script that is installed, and which sole purpose is to dump
the .config that was used to build the toolchain, is pure insanity.

Let's make it much, much more simpler...

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@850
    58
    # If we're building for bare metal, build the static core gcc,
yann@850
    59
    # with libgcc.
linux@1925
    60
    # In case we're not bare metal and building a canadian compiler, do nothing
yann@850
    61
    # In case we're not bare metal, and we're NPTL, build the static core gcc.
yann@850
    62
    # In any other case, do nothing.
linux@1925
    63
    case "${CT_BARE_METAL},${CT_CANADIAN},${CT_THREADS}" in
yann@1983
    64
        y,*,*)  do_cc_core mode=static;;
linux@1925
    65
        ,y,*)   ;;
yann@1980
    66
        ,,nptl) do_cc_core mode=static;;
yann@850
    67
        *)      ;;
yann@850
    68
    esac
yann@850
    69
}
yann@850
    70
yann@850
    71
# Core gcc pass 2
yann@850
    72
do_cc_core_pass_2() {
yann@850
    73
    # In case we're building for bare metal, do nothing, we already have
yann@850
    74
    # our compiler.
linux@1925
    75
    # In case we're not bare metal and building a canadian compiler, do nothing
yann@892
    76
    # In case we're NPTL, build the shared core gcc and the target libgcc.
yann@892
    77
    # In any other case, build the static core gcc and, if using gcc-4.3+,
yann@892
    78
    # also build the target libgcc.
linux@1925
    79
    case "${CT_BARE_METAL},${CT_CANADIAN},${CT_THREADS}" in
bryanhundven@2212
    80
        y,*,*)
bryanhundven@2212
    81
            if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
bryanhundven@2212
    82
                do_cc_core mode=baremetal build_libgcc=yes build_libstdcxx=yes build_staticlinked=yes
bryanhundven@2212
    83
            else
bryanhundven@2212
    84
                do_cc_core mode=baremetal build_libgcc=yes build_libstdcxx=yes
bryanhundven@2212
    85
            fi
bryanhundven@2212
    86
            ;;
yann@1983
    87
        ,y,*)   ;;
linux@1925
    88
        ,,nptl)
yann@892
    89
            do_cc_core mode=shared build_libgcc=yes
yann@892
    90
            ;;
bryanhundven@2212
    91
        ,,win32)
bryanhundven@2212
    92
            do_cc_core mode=static build_libgcc=yes
bartvdrmeulen@2017
    93
            ;;
yann@892
    94
        *)  if [ "${CT_CC_GCC_4_3_or_later}" = "y" ]; then
yann@892
    95
                do_cc_core mode=static build_libgcc=yes
yann@892
    96
            else
yann@1980
    97
                do_cc_core mode=static
yann@892
    98
            fi
yann@892
    99
            ;;
yann@850
   100
    esac
yann@850
   101
}
yann@850
   102
yann@850
   103
#------------------------------------------------------------------------------
yann@850
   104
# Build core gcc
yann@850
   105
# This function is used to build both the static and the shared core C conpiler,
yann@850
   106
# with or without the target libgcc. We need to know wether:
yann@850
   107
#  - we're building static, shared or bare metal: mode=[static|shared|baremetal]
bryanhundven@2212
   108
#  - we need to build libgcc or not             : build_libgcc=[yes|no]       (default: no)
bryanhundven@2212
   109
#  - we need to build libstdc++ or not          : build_libstdcxx=[yes|no]    (default: no)
bryanhundven@2212
   110
#  - we need to build statically linked or not  : build_staticlinked=[yes|no] (default: no)
bryanhundven@2212
   111
# Usage: do_cc_core mode=[static|shared|baremetal] build_libgcc=[yes|no] build_staticlinked=[yes|no]
yann@850
   112
do_cc_core() {
yann@850
   113
    local mode
yann@1980
   114
    local build_libgcc=no
yann@1983
   115
    local build_libstdcxx=no
bryanhundven@2212
   116
    local build_staticlinked=no
yann@850
   117
    local core_prefix_dir
yann@1107
   118
    local lang_opt
yann@1479
   119
    local tmp
yann@2368
   120
    local -a host_libstdcxx_flags
yann@1479
   121
    local -a extra_config
bryanhundven@2212
   122
    local -a core_LDFLAGS
yann@1981
   123
    local -a core_targets
yann@850
   124
yann@1980
   125
    while [ $# -ne 0 ]; do
yann@2541
   126
        eval "${1// /\\ }"
yann@1980
   127
        shift
yann@1980
   128
    done
yann@850
   129
yann@1107
   130
    lang_opt=c
yann@850
   131
    case "${mode}" in
yann@850
   132
        static)
yann@850
   133
            core_prefix_dir="${CT_CC_CORE_STATIC_PREFIX_DIR}"
yann@1479
   134
            extra_config+=("--with-newlib")
yann@1479
   135
            extra_config+=("--enable-threads=no")
yann@1479
   136
            extra_config+=("--disable-shared")
yann@1983
   137
            copy_headers=y  # For baremetal, as there's no headers to copy,
yann@1983
   138
                            # we copy an empty directory. So, who cares?
yann@850
   139
            ;;
yann@850
   140
        shared)
yann@850
   141
            core_prefix_dir="${CT_CC_CORE_SHARED_PREFIX_DIR}"
yann@1479
   142
            extra_config+=("--enable-shared")
yann@850
   143
            copy_headers=y
yann@850
   144
            ;;
yann@850
   145
        baremetal)
yann@850
   146
            core_prefix_dir="${CT_PREFIX_DIR}"
yann@1479
   147
            extra_config+=("--with-newlib")
yann@1479
   148
            extra_config+=("--enable-threads=no")
yann@1479
   149
            extra_config+=("--disable-shared")
yann@1107
   150
            [ "${CT_CC_LANG_CXX}" = "y" ] && lang_opt="${lang_opt},c++"
yann@850
   151
            copy_headers=n
yann@850
   152
            ;;
yann@1980
   153
        *)
yann@1980
   154
            CT_Abort "Internal Error: 'mode' must be one of: 'static', 'shared' or 'baremetal', not '${mode:-(empty)}'"
yann@1980
   155
            ;;
yann@850
   156
    esac
yann@850
   157
yann@1980
   158
    CT_DoStep INFO "Installing ${mode} core C compiler"
yann@1980
   159
    mkdir -p "${CT_BUILD_DIR}/build-cc-core-${mode}"
yann@1980
   160
    cd "${CT_BUILD_DIR}/build-cc-core-${mode}"
yann@1980
   161
benoit@2487
   162
    if [ "${CT_CC_GCC_HAS_PKGVERSION_BUGURL}" = "y" ]; then
benoit@2487
   163
        # Bare metal delivers the core compiler as final compiler, so add version info and bugurl
benoit@2503
   164
        extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
benoit@2503
   165
        [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
benoit@2487
   166
    fi
linux@1898
   167
yann@850
   168
    if [ "${copy_headers}" = "y" ]; then
yann@850
   169
        CT_DoLog DEBUG "Copying headers to install area of bootstrap gcc, so it can build libgcc2"
yann@1979
   170
        CT_DoExecLog ALL cp -a "${CT_HEADERS_DIR}" "${core_prefix_dir}/${CT_TARGET}/include"
yann@850
   171
    fi
yann@850
   172
yann@850
   173
    CT_DoLog EXTRA "Configuring ${mode} core C compiler"
yann@850
   174
yann@1479
   175
    for tmp in ARCH ABI CPU TUNE FPU FLOAT; do
yann@1479
   176
        eval tmp="\${CT_ARCH_WITH_${tmp}}"
yann@1479
   177
        if [ -n "${tmp}" ]; then
yann@1479
   178
            extra_config+=("${tmp}")
yann@1479
   179
        fi
yann@1479
   180
    done
yann@850
   181
    if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
yann@1479
   182
        extra_config+=("--enable-__cxa_atexit")
yann@850
   183
    else
yann@1479
   184
        extra_config+=("--disable-__cxa_atexit")
yann@850
   185
    fi
yann@850
   186
bryanhundven@2212
   187
    # *** WARNING ! ***
bryanhundven@2212
   188
    # Keep this full if-else-if-elif-fi-fi block in sync
bryanhundven@2212
   189
    # with the same block in do_cc, below.
bryanhundven@2212
   190
    if [ "${build_staticlinked}" = "yes" ]; then
bryanhundven@2212
   191
        core_LDFLAGS+=("-static")
yann@2368
   192
        host_libstdcxx_flags+=("-static-libgcc")
yann@2368
   193
        host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++")
yann@2368
   194
        host_libstdcxx_flags+=("-lm")
bryanhundven@2212
   195
        # Companion libraries are build static (eg !shared), so
bryanhundven@2212
   196
        # the libstdc++ is not pulled automatically, although it
bryanhundven@2212
   197
        # is needed. Shoe-horn it in our LDFLAGS
bryanhundven@2212
   198
        # Ditto libm on some Fedora boxen
yann@2360
   199
        core_LDFLAGS+=("-lstdc++")
yann@2360
   200
        core_LDFLAGS+=("-lm")
bryanhundven@2212
   201
    else
bryanhundven@2212
   202
        if [ "${CT_CC_STATIC_LIBSTDCXX}" = "y" ]; then
bryanhundven@2212
   203
            # this is from CodeSourcery arm-2010q1-202-arm-none-linux-gnueabi.src.tar.bz2
bryanhundven@2212
   204
            # build script
yann@2491
   205
            # INFO: if the host gcc is gcc-4.5 then presumably we could use -static-libstdc++,
yann@2491
   206
            #       see http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01635.html
yann@2368
   207
            host_libstdcxx_flags+=("-static-libgcc")
yann@2368
   208
            host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++,-Bdynamic")
yann@2368
   209
            host_libstdcxx_flags+=("-lm")
bryanhundven@2212
   210
        elif [ "${CT_COMPLIBS_SHARED}" != "y" ]; then
bryanhundven@2212
   211
            # When companion libraries are build static (eg !shared),
bryanhundven@2212
   212
            # the libstdc++ is not pulled automatically, although it
bryanhundven@2212
   213
            # is needed. Shoe-horn it in our LDFLAGS
bryanhundven@2212
   214
            # Ditto libm on some Fedora boxen
bryanhundven@2212
   215
            core_LDFLAGS+=("-lstdc++")
bryanhundven@2212
   216
            core_LDFLAGS+=("-lm")
bryanhundven@2212
   217
        fi
yann@1892
   218
    fi
bryanhundven@2212
   219
yann@1893
   220
    if [ "${CT_CC_GCC_USE_GMP_MPFR}" = "y" ]; then
yann@1893
   221
        extra_config+=("--with-gmp=${CT_COMPLIBS_DIR}")
yann@1893
   222
        extra_config+=("--with-mpfr=${CT_COMPLIBS_DIR}")
yann@1893
   223
    fi
yann@2122
   224
    if [ "${CT_CC_GCC_USE_MPC}" = "y" ]; then
yann@2122
   225
        extra_config+=("--with-mpc=${CT_COMPLIBS_DIR}")
yann@2122
   226
    fi
yann@2122
   227
    if [ "${CT_CC_GCC_USE_GRAPHITE}" = "y" ]; then
yann@1893
   228
        extra_config+=("--with-ppl=${CT_COMPLIBS_DIR}")
yann@2368
   229
        # With PPL 0.11+, also pull libpwl if needed
yann@2368
   230
        if [ "${CT_PPL_NEEDS_LIBPWL}" = "y" ]; then
yann@2368
   231
            host_libstdcxx_flags+=("-L${CT_COMPLIBS_DIR}/lib")
yann@2368
   232
            host_libstdcxx_flags+=("-lpwl")
yann@2368
   233
        fi
yann@1893
   234
        extra_config+=("--with-cloog=${CT_COMPLIBS_DIR}")
yann@2123
   235
    elif [ "${CT_CC_GCC_HAS_GRAPHITE}" = "y" ]; then
yann@2123
   236
        extra_config+=("--with-ppl=no")
yann@2123
   237
        extra_config+=("--with-cloog=no")
yann@2014
   238
    fi
yann@2122
   239
    if [ "${CT_CC_GCC_USE_LTO}" = "y" ]; then
yann@1920
   240
        extra_config+=("--with-libelf=${CT_COMPLIBS_DIR}")
yann@2142
   241
        extra_config+=("--enable-lto")
yann@2123
   242
    elif [ "${CT_CC_GCC_HAS_LTO}" = "y" ]; then
yann@2123
   243
        extra_config+=("--with-libelf=no")
yann@2142
   244
        extra_config+=("--disable-lto")
yann@1920
   245
    fi
yann@1893
   246
yann@2368
   247
    if [ ${#host_libstdcxx_flags[@]} -ne 0 ]; then
yann@2368
   248
        extra_config+=("--with-host-libstdcxx=${host_libstdcxx_flags[*]}")
yann@2368
   249
    fi
yann@2368
   250
titus@1972
   251
    if [ "${CT_CC_GCC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then
titus@1972
   252
        extra_config+=("--enable-target-optspace")
titus@1972
   253
    fi
titus@1972
   254
yann@2143
   255
    case "${CT_CC_GCC_LDBL_128}" in
yann@2153
   256
        y)  extra_config+=("--with-long-double-128");;
yann@2153
   257
        m)  ;;
yann@2143
   258
        "") extra_config+=("--without-long-double-128");;
yann@2143
   259
    esac
yann@2143
   260
yann@2521
   261
    if [ "${CT_CC_GCC_BUILD_ID}" = "y" ]; then
yann@2521
   262
        extra_config+=( --enable-linker-build-id )
yann@2521
   263
    fi
yann@2521
   264
yann@2522
   265
    case "${CT_CC_GCC_LNK_HASH_STYLE}" in
yann@2522
   266
        "") ;;
yann@2522
   267
        *)  extra_config+=( "--with-linker-hash-style=${CT_CC_GCC_LNK_HASH_STYLE}" );;
yann@2522
   268
    esac
yann@2522
   269
yann@2532
   270
    case "${CT_ARCH}" in
yann@2532
   271
        mips)
yann@2532
   272
            case "${CT_CC_GCC_mips_llsc}" in
yann@2532
   273
                y)  extra_config+=( --with-llsc );;
yann@2532
   274
                m)  ;;
yann@2532
   275
                *)  extra_config+=( --without-llsc );;
yann@2532
   276
            esac
yann@2532
   277
            case "${CT_CC_GCC_mips_synci}" in
yann@2532
   278
                y)  extra_config+=( --with-synci );;
yann@2532
   279
                m)  ;;
yann@2532
   280
                *)  extra_config+=( --without-synci );;
yann@2532
   281
            esac
yann@2532
   282
            if [ "${CT_CC_GCC_mips_plt}" ]; then
yann@2532
   283
                extra_config+=( --with-mips-plt )
yann@2532
   284
            fi
yann@2532
   285
            ;; # ARCH is mips
yann@2523
   286
    esac
yann@2523
   287
yann@2545
   288
    extra_config+=(--disable-libgomp)
yann@2545
   289
    extra_config+=(--disable-libmudflap)
yann@2545
   290
yann@1893
   291
    CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
yann@1892
   292
yann@850
   293
    # Use --with-local-prefix so older gccs don't look in /usr/local (http://gcc.gnu.org/PR10532)
yann@2355
   294
    CT_DoExecLog CFG                                \
yann@1041
   295
    CC_FOR_BUILD="${CT_BUILD}-gcc"                  \
yann@850
   296
    CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
bryanhundven@2212
   297
    LDFLAGS="${core_LDFLAGS[*]}"                    \
yann@1389
   298
    "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure"  \
yann@1041
   299
        --build=${CT_BUILD}                         \
yann@850
   300
        --host=${CT_HOST}                           \
yann@850
   301
        --target=${CT_TARGET}                       \
yann@850
   302
        --prefix="${core_prefix_dir}"               \
yann@850
   303
        --with-local-prefix="${CT_SYSROOT_DIR}"     \
yann@850
   304
        --disable-multilib                          \
yann@2043
   305
        --disable-libmudflap                        \
yann@850
   306
        ${CC_CORE_SYSROOT_ARG}                      \
yann@1479
   307
        "${extra_config[@]}"                        \
yann@850
   308
        --disable-nls                               \
yann@1107
   309
        --enable-languages="${lang_opt}"            \
yann@2467
   310
        "${CT_CC_CORE_EXTRA_CONFIG_ARRAY[@]}"
yann@850
   311
yann@850
   312
    if [ "${build_libgcc}" = "yes" ]; then
yann@850
   313
        # HACK: we need to override SHLIB_LC from gcc/config/t-slibgcc-elf-ver or
yann@850
   314
        # gcc/config/t-libunwind so -lc is removed from the link for
yann@850
   315
        # libgcc_s.so, as we do not have a target -lc yet.
yann@850
   316
        # This is not as ugly as it appears to be ;-) All symbols get resolved
yann@850
   317
        # during the glibc build, and we provide a proper libgcc_s.so for the
yann@850
   318
        # cross toolchain during the final gcc build.
yann@850
   319
        #
yann@850
   320
        # As we cannot modify the source tree, nor override SHLIB_LC itself
yann@850
   321
        # during configure or make, we have to edit the resultant
yann@850
   322
        # gcc/libgcc.mk itself to remove -lc from the link.
yann@850
   323
        # This causes us to have to jump through some hoops...
yann@850
   324
        #
yann@850
   325
        # To produce libgcc.mk to edit we firstly require libiberty.a,
yann@850
   326
        # so we configure then build it.
yann@850
   327
        # Next we have to configure gcc, create libgcc.mk then edit it...
yann@850
   328
        # So much easier if we just edit the source tree, but hey...
yann@1389
   329
        if [ ! -f "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/gcc/BASE-VER" ]; then
anthony@2154
   330
            CT_DoExecLog CFG make configure-libiberty
yann@2275
   331
            CT_DoExecLog ALL make ${JOBSFLAGS} -C libiberty libiberty.a
anthony@2154
   332
            CT_DoExecLog CFG make configure-gcc configure-libcpp
yann@2275
   333
            CT_DoExecLog ALL make ${JOBSFLAGS} all-libcpp
yann@850
   334
        else
anthony@2154
   335
            CT_DoExecLog CFG make configure-gcc configure-libcpp configure-build-libiberty
yann@2275
   336
            CT_DoExecLog ALL make ${JOBSFLAGS} all-libcpp all-build-libiberty
yann@850
   337
        fi
yann@850
   338
        # HACK: gcc-4.2 uses libdecnumber to build libgcc.mk, so build it here.
yann@1389
   339
        if [ -d "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/libdecnumber" ]; then
anthony@2154
   340
            CT_DoExecLog CFG make configure-libdecnumber
yann@2275
   341
            CT_DoExecLog ALL make ${JOBSFLAGS} -C libdecnumber libdecnumber.a
yann@850
   342
        fi
yann@850
   343
yann@850
   344
        # Starting with GCC 4.3, libgcc.mk is no longer built,
yann@850
   345
        # and libgcc.mvars is used instead.
yann@850
   346
yann@892
   347
        if [ "${CT_CC_GCC_4_3_or_later}" = "y" ]; then
yann@850
   348
            libgcc_rule="libgcc.mvars"
yann@1981
   349
            core_targets=( gcc target-libgcc )
yann@850
   350
        else
yann@850
   351
            libgcc_rule="libgcc.mk"
yann@1981
   352
            core_targets=( gcc )
yann@850
   353
        fi
yann@850
   354
linux@1926
   355
        # On bare metal and canadian build the host-compiler is used when
linux@1926
   356
        # actually the build-system compiler is required. Choose the correct
linux@1926
   357
        # compilers for canadian build and use the defaults on other
linux@1926
   358
        # configurations.
linux@1926
   359
        if [ "${CT_BARE_METAL},${CT_CANADIAN}" = "y,y" ]; then
linux@1926
   360
            repair_cc="CC_FOR_BUILD=${CT_BUILD}-gcc \
linux@1926
   361
                       GCC_FOR_TARGET=${CT_TARGET}-gcc"
linux@1926
   362
        else
linux@1926
   363
            repair_cc=""
linux@1926
   364
        fi
linux@1926
   365
yann@2275
   366
        CT_DoExecLog ALL make ${JOBSFLAGS} -C gcc ${libgcc_rule} \
linux@1926
   367
                              ${repair_cc}
yann@850
   368
        sed -r -i -e 's@-lc@@g' gcc/${libgcc_rule}
yann@850
   369
    else # build_libgcc
yann@1981
   370
        core_targets=( gcc )
yann@850
   371
    fi   # ! build libgcc
yann@1983
   372
    if [    "${build_libstdcxx}" = "yes"    \
yann@1983
   373
         -a "${CT_CC_LANG_CXX}"  = "y"      \
yann@1983
   374
       ]; then
yann@1983
   375
        core_targets+=( target-libstdc++-v3 )
yann@1983
   376
    fi
yann@850
   377
yann@850
   378
    CT_DoLog EXTRA "Building ${mode} core C compiler"
yann@2275
   379
    CT_DoExecLog ALL make ${JOBSFLAGS} "${core_targets[@]/#/all-}"
yann@850
   380
yann@850
   381
    CT_DoLog EXTRA "Installing ${mode} core C compiler"
yann@1981
   382
    CT_DoExecLog ALL make "${core_targets[@]/#/install-}"
yann@850
   383
yann@1269
   384
    # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
yann@1269
   385
    # to call the C compiler with the same, somewhat canonical name.
linux@1924
   386
    # check whether compiler has an extension
linux@1924
   387
    file="$( ls -1 "${core_prefix_dir}/bin/${CT_TARGET}-gcc."* 2>/dev/null || true )"
linux@1924
   388
    [ -z "${file}" ] || ext=".${file##*.}"
yann@2550
   389
    CT_DoExecLog ALL ln -sfv "${CT_TARGET}-gcc${ext}" "${core_prefix_dir}/bin/${CT_TARGET}-cc${ext}"
yann@1269
   390
yann@850
   391
    CT_EndStep
yann@850
   392
}
yann@850
   393
yann@850
   394
#------------------------------------------------------------------------------
yann@850
   395
# Build final gcc
yann@850
   396
do_cc() {
yann@2368
   397
    local -a host_libstdcxx_flags
yann@1479
   398
    local -a extra_config
bryanhundven@2211
   399
    local -a final_LDFLAGS
yann@1479
   400
    local tmp
yann@1479
   401
yann@850
   402
    # If building for bare metal, nothing to be done here, the static core conpiler is enough!
yann@850
   403
    [ "${CT_BARE_METAL}" = "y" ] && return 0
yann@850
   404
yann@850
   405
    CT_DoStep INFO "Installing final compiler"
yann@850
   406
yann@850
   407
    mkdir -p "${CT_BUILD_DIR}/build-cc"
yann@850
   408
    cd "${CT_BUILD_DIR}/build-cc"
yann@850
   409
yann@850
   410
    CT_DoLog EXTRA "Configuring final compiler"
yann@850
   411
yann@850
   412
    # Enable selected languages
yann@850
   413
    lang_opt="c"
yann@850
   414
    [ "${CT_CC_LANG_CXX}" = "y"      ] && lang_opt="${lang_opt},c++"
yann@850
   415
    [ "${CT_CC_LANG_FORTRAN}" = "y"  ] && lang_opt="${lang_opt},fortran"
yann@850
   416
    [ "${CT_CC_LANG_ADA}" = "y"      ] && lang_opt="${lang_opt},ada"
yann@850
   417
    [ "${CT_CC_LANG_JAVA}" = "y"     ] && lang_opt="${lang_opt},java"
yann@850
   418
    [ "${CT_CC_LANG_OBJC}" = "y"     ] && lang_opt="${lang_opt},objc"
yann@850
   419
    [ "${CT_CC_LANG_OBJCXX}" = "y"   ] && lang_opt="${lang_opt},obj-c++"
yann@850
   420
    CT_Test "Building ADA language is not yet supported. Will try..." "${CT_CC_LANG_ADA}" = "y"
yann@850
   421
    CT_Test "Building Objective-C language is not yet supported. Will try..." "${CT_CC_LANG_OBJC}" = "y"
yann@850
   422
    CT_Test "Building Objective-C++ language is not yet supported. Will try..." "${CT_CC_LANG_OBJCXX}" = "y"
yann@850
   423
    CT_Test "Building ${CT_CC_LANG_OTHERS//,/ } language(s) is not yet supported. Will try..." -n "${CT_CC_LANG_OTHERS}"
yann@850
   424
    lang_opt=$(echo "${lang_opt},${CT_CC_LANG_OTHERS}" |sed -r -e 's/,+/,/g; s/,*$//;')
yann@850
   425
yann@1479
   426
    extra_config+=("--enable-languages=${lang_opt}")
yann@1479
   427
    extra_config+=("--disable-multilib")
yann@1479
   428
    for tmp in ARCH ABI CPU TUNE FPU FLOAT; do
yann@1479
   429
        eval tmp="\${CT_ARCH_WITH_${tmp}}"
yann@1479
   430
        if [ -n "${tmp}" ]; then
yann@1479
   431
            extra_config+=("${tmp}")
yann@1479
   432
        fi
yann@1479
   433
    done
yann@1479
   434
benoit@2487
   435
    [ "${CT_SHARED_LIBS}" = "y" ] || extra_config+=("--disable-shared")
benoit@2487
   436
    if [ "${CT_CC_GCC_HAS_PKGVERSION_BUGURL}" = "y" ]; then
benoit@2503
   437
        extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
benoit@2503
   438
        [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
benoit@2487
   439
    fi
yann@2042
   440
    case "${CT_CC_GCC_SJLJ_EXCEPTIONS}" in
yann@2042
   441
        y)  extra_config+=("--enable-sjlj-exceptions");;
yann@2042
   442
        m)  ;;
yann@2042
   443
        "") extra_config+=("--disable-sjlj-exceptions");;
yann@2042
   444
    esac
yann@850
   445
    if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
yann@1479
   446
        extra_config+=("--enable-__cxa_atexit")
yann@850
   447
    else
yann@1479
   448
        extra_config+=("--disable-__cxa_atexit")
yann@850
   449
    fi
benoit@2475
   450
    if [ -n "${CT_CC_ENABLE_CXX_FLAGS}" ]; then
benoit@2475
   451
        extra_config+=("--enable-cxx-flags=${CT_CC_ENABLE_CXX_FLAGS}")
yann@1484
   452
    fi
yann@2043
   453
    if [ "${CT_CC_GCC_LIBMUDFLAP}" = "y" ]; then
yann@2043
   454
        extra_config+=(--enable-libmudflap)
yann@2043
   455
    else
yann@2043
   456
        extra_config+=(--disable-libmudflap)
yann@2043
   457
    fi
yann@2145
   458
    if [ "${CT_CC_GCC_LIBGOMP}" = "y" ]; then
yann@2145
   459
        extra_config+=(--enable-libgomp)
yann@2145
   460
    else
yann@2145
   461
        extra_config+=(--disable-libgomp)
yann@2145
   462
    fi
yann@2146
   463
    if [ "${CT_CC_GCC_LIBSSP}" = "y" ]; then
yann@2146
   464
        extra_config+=(--enable-libssp)
yann@2146
   465
    else
yann@2146
   466
        extra_config+=(--disable-libssp)
yann@2146
   467
    fi
yann@1893
   468
bryanhundven@2212
   469
    # *** WARNING ! ***
bryanhundven@2212
   470
    # Keep this full if-else-if-elif-fi-fi block in sync
bryanhundven@2212
   471
    # with the same block in do_cc_core, above.
bryanhundven@2211
   472
    if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
bryanhundven@2211
   473
        final_LDFLAGS+=("-static")
yann@2368
   474
        host_libstdcxx_flags+=("-static-libgcc")
yann@2368
   475
        host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++")
yann@2368
   476
        host_libstdcxx_flags+=("-lm")
bryanhundven@2211
   477
        # Companion libraries are build static (eg !shared), so
js@2045
   478
        # the libstdc++ is not pulled automatically, although it
js@2045
   479
        # is needed. Shoe-horn it in our LDFLAGS
dwatkins@2070
   480
        # Ditto libm on some Fedora boxen
bryanhundven@2211
   481
        final_LDFLAGS+=("-lstdc++")
bryanhundven@2211
   482
        final_LDFLAGS+=("-lm")
bryanhundven@2211
   483
    else
bryanhundven@2211
   484
        if [ "${CT_CC_STATIC_LIBSTDCXX}" = "y" ]; then
bryanhundven@2211
   485
            # this is from CodeSourcery arm-2010q1-202-arm-none-linux-gnueabi.src.tar.bz2
bryanhundven@2211
   486
            # build script
yann@2491
   487
            # INFO: if the host gcc is gcc-4.5 then presumably we could use -static-libstdc++,
yann@2491
   488
            #       see http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01635.html
yann@2368
   489
            host_libstdcxx_flags+=("-static-libgcc")
yann@2368
   490
            host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++,-Bdynamic")
yann@2368
   491
            host_libstdcxx_flags+=("-lm")
bryanhundven@2211
   492
        elif [ "${CT_COMPLIBS_SHARED}" != "y" ]; then
bryanhundven@2211
   493
            # When companion libraries are build static (eg !shared),
bryanhundven@2211
   494
            # the libstdc++ is not pulled automatically, although it
bryanhundven@2211
   495
            # is needed. Shoe-horn it in our LDFLAGS
bryanhundven@2211
   496
            # Ditto libm on some Fedora boxen
bryanhundven@2211
   497
            final_LDFLAGS+=("-lstdc++")
bryanhundven@2211
   498
            final_LDFLAGS+=("-lm")
bryanhundven@2211
   499
        fi
yann@1893
   500
    fi
bryanhundven@2211
   501
lacombar@1880
   502
    if [ "${CT_CC_GCC_USE_GMP_MPFR}" = "y" ]; then
yann@1893
   503
        extra_config+=("--with-gmp=${CT_COMPLIBS_DIR}")
yann@1893
   504
        extra_config+=("--with-mpfr=${CT_COMPLIBS_DIR}")
yann@1848
   505
    fi
yann@2122
   506
    if [ "${CT_CC_GCC_USE_MPC}" = "y" ]; then
yann@2122
   507
        extra_config+=("--with-mpc=${CT_COMPLIBS_DIR}")
yann@2122
   508
    fi
yann@2122
   509
    if [ "${CT_CC_GCC_USE_GRAPHITE}" = "y" ]; then
yann@1893
   510
        extra_config+=("--with-ppl=${CT_COMPLIBS_DIR}")
yann@2368
   511
        # With PPL 0.11+, also pull libpwl if needed
yann@2368
   512
        if [ "${CT_PPL_NEEDS_LIBPWL}" = "y" ]; then
yann@2368
   513
            host_libstdcxx_flags+=("-L${CT_COMPLIBS_DIR}/lib")
yann@2368
   514
            host_libstdcxx_flags+=("-lpwl")
yann@2368
   515
        fi
yann@1893
   516
        extra_config+=("--with-cloog=${CT_COMPLIBS_DIR}")
yann@2123
   517
    elif [ "${CT_CC_GCC_HAS_GRAPHITE}" = "y" ]; then
yann@2123
   518
        extra_config+=("--with-ppl=no")
yann@2123
   519
        extra_config+=("--with-cloog=no")
yann@2014
   520
    fi
yann@2122
   521
    if [ "${CT_CC_GCC_USE_LTO}" = "y" ]; then
yann@1920
   522
        extra_config+=("--with-libelf=${CT_COMPLIBS_DIR}")
yann@2123
   523
    elif [ "${CT_CC_GCC_HAS_LTO}" = "y" ]; then
yann@2123
   524
        extra_config+=("--with-libelf=no")
yann@1920
   525
    fi
yann@850
   526
yann@2368
   527
    if [ ${#host_libstdcxx_flags[@]} -ne 0 ]; then
yann@2368
   528
        extra_config+=("--with-host-libstdcxx=${host_libstdcxx_flags[*]}")
yann@2368
   529
    fi
yann@2368
   530
lacombar@1881
   531
    if [ "${CT_THREADS}" = "none" ]; then
lacombar@1881
   532
        extra_config+=("--disable-threads")
lacombar@1881
   533
        if [ "${CT_CC_GCC_4_2_or_later}" = y ]; then
yann@2145
   534
            CT_Test "Disabling libgomp for no-thread gcc>=4.2" "${CT_CC_GCC_LIBGOMP}" = "Y"
lacombar@1881
   535
            extra_config+=("--disable-libgomp")
lacombar@1881
   536
        fi
lacombar@1881
   537
    else
bartvdrmeulen@2017
   538
        if [ "${CT_THREADS}" = "win32" ]; then
bartvdrmeulen@2017
   539
            extra_config+=("--enable-threads=win32")
bartvdrmeulen@2017
   540
            extra_config+=("--disable-win32-registry")
bartvdrmeulen@2017
   541
        else
bartvdrmeulen@2017
   542
            extra_config+=("--enable-threads=posix")
bartvdrmeulen@2017
   543
        fi
lacombar@1881
   544
    fi
lacombar@1881
   545
titus@1972
   546
    if [ "${CT_CC_GCC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then
titus@1972
   547
        extra_config+=("--enable-target-optspace")
titus@1972
   548
    fi
yann@1991
   549
    if [ "${CT_CC_GCC_DISABLE_PCH}" = "y" ]; then
yann@1991
   550
        extra_config+=("--disable-libstdcxx-pch")
yann@1991
   551
    fi
titus@1972
   552
yann@2143
   553
    case "${CT_CC_GCC_LDBL_128}" in
yann@2153
   554
        y)  extra_config+=("--with-long-double-128");;
yann@2153
   555
        m)  ;;
yann@2143
   556
        "") extra_config+=("--without-long-double-128");;
yann@2143
   557
    esac
yann@2143
   558
yann@2521
   559
    if [ "${CT_CC_GCC_BUILD_ID}" = "y" ]; then
yann@2521
   560
        extra_config+=( --enable-linker-build-id )
yann@2521
   561
    fi
yann@2521
   562
yann@2522
   563
    case "${CT_CC_GCC_LNK_HASH_STYLE}" in
yann@2522
   564
        "") ;;
yann@2522
   565
        *)  extra_config+=( "--with-linker-hash-style=${CT_CC_GCC_LNK_HASH_STYLE}" );;
yann@2522
   566
    esac
yann@2522
   567
yann@2287
   568
    if [ "${CT_CC_GCC_ENABLE_PLUGINS}" = "y" ]; then
yann@2287
   569
        extra_config+=( --enable-plugin )
yann@2287
   570
    fi
yann@2287
   571
    if [ "${CT_CC_GCC_GOLD}" = "y" ]; then
yann@2248
   572
        extra_config+=( --enable-gold )
yann@2248
   573
    fi
yann@2248
   574
yann@2532
   575
    case "${CT_ARCH}" in
yann@2532
   576
        mips)
yann@2532
   577
            case "${CT_CC_GCC_mips_llsc}" in
yann@2532
   578
                y)  extra_config+=( --with-llsc );;
yann@2532
   579
                m)  ;;
yann@2532
   580
                *)  extra_config+=( --without-llsc );;
yann@2532
   581
            esac
yann@2532
   582
            case "${CT_CC_GCC_mips_synci}" in
yann@2532
   583
                y)  extra_config+=( --with-synci );;
yann@2532
   584
                m)  ;;
yann@2532
   585
                *)  extra_config+=( --without-synci );;
yann@2532
   586
            esac
yann@2532
   587
            if [ "${CT_CC_GCC_mips_plt}" ]; then
yann@2532
   588
                extra_config+=( --with-mips-plt )
yann@2532
   589
            fi
yann@2532
   590
            ;; # ARCH is mips
yann@2532
   591
    esac
yann@2532
   592
yann@1479
   593
    CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
yann@850
   594
yann@850
   595
    # --disable-nls to work around crash bug on ppc405, but also because
yann@850
   596
    # embedded systems don't really need message catalogs...
yann@2355
   597
    CT_DoExecLog CFG                                \
yann@1122
   598
    CC_FOR_BUILD="${CT_BUILD}-gcc"                  \
yann@1122
   599
    CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
bryanhundven@2211
   600
    LDFLAGS="${final_LDFLAGS[*]}"                   \
yann@1122
   601
    CFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"         \
yann@1122
   602
    CXXFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"       \
yann@1122
   603
    LDFLAGS_FOR_TARGET="${CT_TARGET_LDFLAGS}"       \
yann@1389
   604
    "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/configure"  \
yann@1122
   605
        --build=${CT_BUILD}                         \
yann@1122
   606
        --host=${CT_HOST}                           \
yann@1122
   607
        --target=${CT_TARGET}                       \
yann@1122
   608
        --prefix="${CT_PREFIX_DIR}"                 \
yann@1122
   609
        ${CC_SYSROOT_ARG}                           \
yann@1479
   610
        "${extra_config[@]}"                        \
yann@1122
   611
        --with-local-prefix="${CT_SYSROOT_DIR}"     \
yann@1122
   612
        --disable-nls                               \
yann@1122
   613
        --enable-c99                                \
yann@1122
   614
        --enable-long-long                          \
yann@2467
   615
        "${CT_CC_EXTRA_CONFIG_ARRAY[@]}"
yann@850
   616
yann@850
   617
    if [ "${CT_CANADIAN}" = "y" ]; then
yann@850
   618
        CT_DoLog EXTRA "Building libiberty"
yann@2275
   619
        CT_DoExecLog ALL make ${JOBSFLAGS} all-build-libiberty
yann@850
   620
    fi
yann@850
   621
yann@850
   622
    CT_DoLog EXTRA "Building final compiler"
yann@2275
   623
    CT_DoExecLog ALL make ${JOBSFLAGS} all
yann@850
   624
yann@850
   625
    CT_DoLog EXTRA "Installing final compiler"
yann@850
   626
    CT_DoExecLog ALL make install
yann@850
   627
yann@850
   628
    # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
yann@850
   629
    # to call the C compiler with the same, somewhat canonical name.
linux@1924
   630
    # check whether compiler has an extension
bartvdrmeulen@2031
   631
    file="$( ls -1 "${CT_PREFIX_DIR}/bin/${CT_TARGET}-gcc."* 2>/dev/null || true )"
linux@1924
   632
    [ -z "${file}" ] || ext=".${file##*.}"
yann@2550
   633
    CT_DoExecLog ALL ln -sfv "${CT_TARGET}-gcc${ext}" "${CT_PREFIX_DIR}/bin/${CT_TARGET}-cc${ext}"
yann@850
   634
yann@850
   635
    CT_EndStep
yann@850
   636
}