scripts/build/cc/gcc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sat Jan 22 23:20:18 2011 +0100 (2011-01-22)
changeset 2305 2ed26c646568
parent 2287 61608c9365ab
child 2355 e216439317bc
permissions -rw-r--r--
scripts: create the makeinfo wrapper before we set PATH

If we set PATH to the tools wrappers before we create the
makeinfo wrapper, then we may well wrap an existing wrapper
from a previous run.

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