scripts/build/cc/gcc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sat Dec 31 16:23:27 2011 +0100 (2011-12-31)
changeset 2814 3dc2727ebffc
parent 2782 e3e1c9d45bdd
child 2817 240df3865193
permissions -rw-r--r--
cc/gcc: add option to use system zlib

In some cases, it might be desirable to use the system zlib

Eg. because latest gcc seem to be totally borked when it comes
to multilib, and tries to build a multilib host zlib, when it
is *absolutely* *not* needed: we want mulitlib on the target,
not on the host! Sigh... :-(

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