scripts/build/cc/gcc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Wed May 18 23:00:46 2011 +0200 (2011-05-18)
changeset 2467 200836977ce6
parent 2466 b7df125a1c78
child 2475 62c563f492ec
permissions -rw-r--r--
config: rename variables that are arrays

Make it explicit that a variable is an array bu the name of the variable.
It will be used later when .config gets munged to allow both multiple
arguments and arguments with spaces at the same time to be passed from the
configuration down to the build scripts.

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