scripts/build/cc_gcc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jul 13 10:32:38 2008 +0000 (2008-07-13)
changeset 645 8e58024f8e37
parent 625 4df159d20355
child 662 81b5e61e07b2
permissions -rw-r--r--
Ioannis E. VENETIS <venetis@mail.capsl.udel.edu> pointed out that GMP and MPFR were not used by gcc.
Turned out that none could use GMP and MPFR as the config option changed its name, but the change was not propagated to all users.

/trunk/scripts/build/binutils.sh | 2 1 1 0 +-
/trunk/scripts/build/debug/300-gdb.sh | 2 1 1 0 +-
/trunk/scripts/build/cc_gcc.sh | 6 3 3 0 +++---
3 files changed, 5 insertions(+), 5 deletions(-)
yann@331
     1
# This file adds the function to build the gcc C compiler
yann@1
     2
# Copyright 2007 Yann E. MORIN
yann@1
     3
# Licensed under the GPL v2. See COPYING in the root of this package
yann@1
     4
yann@161
     5
do_print_filename() {
yann@161
     6
    [ "${CT_CC}" = "gcc" ] || return 0
yann@164
     7
    echo "gcc-${CT_CC_VERSION}"
yann@161
     8
}
yann@161
     9
yann@466
    10
# Download gcc
yann@63
    11
do_cc_get() {
yann@63
    12
    # Ah! gcc folks are kind of 'different': they store the tarballs in
yann@63
    13
    # subdirectories of the same name! That's because gcc is such /crap/ that
yann@63
    14
    # it is such /big/ that it needs being splitted for distribution! Sad. :-(
yann@63
    15
    # Arrgghh! Some of those versions does not follow this convention:
yann@63
    16
    # gcc-3.3.3 lives in releases/gcc-3.3.3, while gcc-2.95.* isn't in a
yann@63
    17
    # subdirectory! You bastard!
yann@486
    18
    CT_GetFile "${CT_CC_FILE}"  \
yann@486
    19
               {ftp,http}://ftp.gnu.org/gnu/gcc{,{,/releases}/${CT_CC_FILE}}
yann@63
    20
}
yann@63
    21
yann@466
    22
# Extract gcc
yann@63
    23
do_cc_extract() {
yann@63
    24
    CT_ExtractAndPatch "${CT_CC_FILE}"
yann@63
    25
}
yann@63
    26
yann@331
    27
#------------------------------------------------------------------------------
yann@331
    28
# Core gcc pass 1
yann@331
    29
do_cc_core_pass_1() {
yann@331
    30
    # In case we're NPTL, build the static core gcc;
yann@331
    31
    # in any other case, do nothing.
yann@331
    32
    case "${CT_THREADS}" in
yann@331
    33
        nptl)   do_cc_core_static;;
yann@331
    34
    esac
yann@331
    35
}
yann@331
    36
yann@331
    37
# Core gcc pass 2
yann@331
    38
do_cc_core_pass_2() {
yann@331
    39
    # In case we're NPTL, build the shared core gcc,
yann@331
    40
    # in any other case, build the static core gcc.
yann@331
    41
    case "${CT_THREADS}" in
yann@331
    42
        nptl)   do_cc_core_shared;;
yann@331
    43
        *)      do_cc_core_static;;
yann@331
    44
    esac
yann@331
    45
}
yann@331
    46
yann@331
    47
#------------------------------------------------------------------------------
yann@331
    48
# Build static core gcc
yann@331
    49
do_cc_core_static() {
yann@331
    50
    mkdir -p "${CT_BUILD_DIR}/build-cc-core-static"
yann@331
    51
    cd "${CT_BUILD_DIR}/build-cc-core-static"
yann@331
    52
yann@331
    53
    CT_DoStep INFO "Installing static core C compiler"
yann@331
    54
yann@567
    55
    CT_DoLog DEBUG "Copying headers to install area of bootstrap gcc, so it can build libgcc2"
yann@331
    56
    mkdir -p "${CT_CC_CORE_STATIC_PREFIX_DIR}/${CT_TARGET}/include"
yann@331
    57
    cp -r "${CT_HEADERS_DIR}"/* "${CT_CC_CORE_STATIC_PREFIX_DIR}/${CT_TARGET}/include" 2>&1 |CT_DoLog DEBUG
yann@331
    58
yann@331
    59
    CT_DoLog EXTRA "Configuring static core C compiler"
yann@331
    60
yann@391
    61
    extra_config="${CT_ARCH_WITH_ARCH} ${CT_ARCH_WITH_ABI} ${CT_ARCH_WITH_CPU} ${CT_ARCH_WITH_TUNE} ${CT_ARCH_WITH_FPU} ${CT_ARCH_WITH_FLOAT}"
yann@645
    62
    [ "${CT_GMP_MPFR}" = "y" ] && extra_config="${extra_config} --with-gmp=${CT_PREFIX_DIR} --with-mpfr=${CT_PREFIX_DIR}"
yann@528
    63
    if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
yann@528
    64
        extra_config="${extra_config} --enable-__cxa_atexit"
yann@528
    65
    else
yann@528
    66
        extra_config="${extra_config} --disable-__cxa_atexit"
yann@528
    67
    fi
yann@331
    68
yann@523
    69
    CT_DoLog DEBUG "Extra config passed: '${extra_config}'"
yann@331
    70
yann@331
    71
    # Use --with-local-prefix so older gccs don't look in /usr/local (http://gcc.gnu.org/PR10532)
yann@501
    72
    CC_FOR_BUILD="${CT_CC_NATIVE}"                  \
yann@331
    73
    CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
yann@331
    74
    "${CT_SRC_DIR}/${CT_CC_FILE}/configure"         \
yann@331
    75
        ${CT_CANADIAN_OPT}                          \
yann@331
    76
        --host=${CT_HOST}                           \
yann@331
    77
        --target=${CT_TARGET}                       \
yann@331
    78
        --prefix="${CT_CC_CORE_STATIC_PREFIX_DIR}"  \
yann@331
    79
        --with-local-prefix="${CT_SYSROOT_DIR}"     \
yann@331
    80
        --disable-multilib                          \
yann@331
    81
        --with-newlib                               \
yann@331
    82
        ${CC_CORE_SYSROOT_ARG}                      \
yann@331
    83
        ${extra_config}                             \
yann@331
    84
        --disable-nls                               \
yann@331
    85
        --enable-threads=no                         \
yann@331
    86
        --enable-symvers=gnu                        \
yann@331
    87
        --enable-languages=c                        \
yann@331
    88
        --disable-shared                            \
yann@501
    89
        --enable-target-optspace                    \
yann@331
    90
        ${CT_CC_CORE_EXTRA_CONFIG}                  2>&1 |CT_DoLog ALL
yann@331
    91
yann@331
    92
    if [ "${CT_CANADIAN}" = "y" ]; then
yann@331
    93
        CT_DoLog EXTRA "Building libiberty"
yann@331
    94
        make ${PARALLELMFLAGS} all-build-libiberty 2>&1 |CT_DoLog ALL
yann@331
    95
    fi
yann@331
    96
yann@331
    97
    CT_DoLog EXTRA "Building static core C compiler"
yann@331
    98
    make ${PARALLELMFLAGS} all-gcc 2>&1 |CT_DoLog ALL
yann@331
    99
yann@331
   100
    CT_DoLog EXTRA "Installing static core C compiler"
yann@331
   101
    make install-gcc 2>&1 |CT_DoLog ALL
yann@331
   102
yann@331
   103
    CT_EndStep
yann@331
   104
}
yann@331
   105
yann@331
   106
#------------------------------------------------------------------------------
yann@331
   107
# Build shared core gcc
yann@331
   108
do_cc_core_shared() {
yann@331
   109
    mkdir -p "${CT_BUILD_DIR}/build-cc-core-shared"
yann@331
   110
    cd "${CT_BUILD_DIR}/build-cc-core-shared"
yann@331
   111
yann@331
   112
    CT_DoStep INFO "Installing shared core C compiler"
yann@331
   113
yann@567
   114
    CT_DoLog DEBUG "Copying headers to install area of bootstrap gcc, so it can build libgcc2"
yann@331
   115
    mkdir -p "${CT_CC_CORE_SHARED_PREFIX_DIR}/${CT_TARGET}/include"
yann@331
   116
    cp -r "${CT_HEADERS_DIR}"/* "${CT_CC_CORE_SHARED_PREFIX_DIR}/${CT_TARGET}/include" 2>&1 |CT_DoLog DEBUG
yann@331
   117
yann@331
   118
    CT_DoLog EXTRA "Configuring shared core C compiler"
yann@331
   119
yann@391
   120
    extra_config="${CT_ARCH_WITH_ARCH} ${CT_ARCH_WITH_ABI} ${CT_ARCH_WITH_CPU} ${CT_ARCH_WITH_TUNE} ${CT_ARCH_WITH_FPU} ${CT_ARCH_WITH_FLOAT}"
yann@645
   121
    [ "${CT_GMP_MPFR}" = "y" ] && extra_config="${extra_config} --with-gmp=${CT_PREFIX_DIR} --with-mpfr=${CT_PREFIX_DIR}"
yann@528
   122
    if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
yann@528
   123
        extra_config="${extra_config} --enable-__cxa_atexit"
yann@528
   124
    else
yann@528
   125
        extra_config="${extra_config} --disable-__cxa_atexit"
yann@528
   126
    fi
yann@331
   127
yann@523
   128
    CT_DoLog DEBUG "Extra config passed: '${extra_config}'"
yann@331
   129
yann@501
   130
    CC_FOR_BUILD="${CT_CC_NATIVE}"                  \
yann@331
   131
    CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
yann@331
   132
    "${CT_SRC_DIR}/${CT_CC_FILE}/configure"         \
yann@331
   133
        ${CT_CANADIAN_OPT}                          \
yann@331
   134
        --target=${CT_TARGET}                       \
yann@331
   135
        --host=${CT_HOST}                           \
yann@331
   136
        --prefix="${CT_CC_CORE_SHARED_PREFIX_DIR}"  \
yann@331
   137
        --with-local-prefix="${CT_SYSROOT_DIR}"     \
yann@331
   138
        --disable-multilib                          \
yann@331
   139
        ${CC_CORE_SYSROOT_ARG}                      \
yann@331
   140
        ${extra_config}                             \
yann@331
   141
        --disable-nls                               \
yann@331
   142
        --enable-symvers=gnu                        \
yann@331
   143
        --enable-languages=c                        \
yann@331
   144
        --enable-shared                             \
yann@501
   145
        --enable-target-optspace                    \
yann@331
   146
        ${CT_CC_CORE_EXTRA_CONFIG}                  2>&1 |CT_DoLog ALL
yann@331
   147
yann@331
   148
    # HACK: we need to override SHLIB_LC from gcc/config/t-slibgcc-elf-ver or
yann@331
   149
    # gcc/config/t-libunwind so -lc is removed from the link for
yann@331
   150
    # libgcc_s.so, as we do not have a target -lc yet.
yann@331
   151
    # This is not as ugly as it appears to be ;-) All symbols get resolved
yann@331
   152
    # during the glibc build, and we provide a proper libgcc_s.so for the
yann@331
   153
    # cross toolchain during the final gcc build.
yann@331
   154
    #
yann@331
   155
    # As we cannot modify the source tree, nor override SHLIB_LC itself
yann@331
   156
    # during configure or make, we have to edit the resultant
yann@331
   157
    # gcc/libgcc.mk itself to remove -lc from the link.
yann@331
   158
    # This causes us to have to jump through some hoops...
yann@331
   159
    #
yann@331
   160
    # To produce libgcc.mk to edit we firstly require libiberty.a,
yann@331
   161
    # so we configure then build it.
yann@331
   162
    # Next we have to configure gcc, create libgcc.mk then edit it...
yann@331
   163
    # So much easier if we just edit the source tree, but hey...
yann@331
   164
    if [ ! -f "${CT_SRC_DIR}/${CT_CC_FILE}/gcc/BASE-VER" ]; then
yann@331
   165
        make configure-libiberty
yann@625
   166
        make ${PARALLELMFLAGS} -C libiberty libiberty.a
yann@331
   167
        make configure-gcc
yann@331
   168
        make configure-libcpp
yann@625
   169
        make ${PARALLELMFLAGS} all-libcpp
yann@331
   170
    else
yann@331
   171
        make configure-gcc
yann@331
   172
        make configure-libcpp
yann@331
   173
        make configure-build-libiberty
yann@625
   174
        make ${PARALLELMFLAGS} all-libcpp
yann@625
   175
        make ${PARALLELMFLAGS} all-build-libiberty
yann@331
   176
    fi 2>&1 |CT_DoLog ALL
yann@331
   177
    # HACK: gcc-4.2 uses libdecnumber to build libgcc.mk, so build it here.
yann@331
   178
    if [ -d "${CT_SRC_DIR}/${CT_CC_FILE}/libdecnumber" ]; then
yann@331
   179
        make configure-libdecnumber
yann@625
   180
        make ${PARALLELMFLAGS} -C libdecnumber libdecnumber.a
yann@331
   181
    fi 2>&1 |CT_DoLog ALL
yann@331
   182
    make -C gcc libgcc.mk 2>&1 |CT_DoLog ALL
yann@331
   183
    sed -r -i -e 's@-lc@@g' gcc/libgcc.mk
yann@331
   184
yann@331
   185
    if [ "${CT_CANADIAN}" = "y" ]; then
yann@331
   186
        CT_DoLog EXTRA "Building libiberty"
yann@331
   187
        make ${PARALLELMFLAGS} all-build-libiberty 2>&1 |CT_DoLog ALL
yann@331
   188
    fi
yann@331
   189
yann@331
   190
    CT_DoLog EXTRA "Building shared core C compiler"
yann@331
   191
    make ${PARALLELMFLAGS} all-gcc 2>&1 |CT_DoLog ALL
yann@331
   192
yann@331
   193
    CT_DoLog EXTRA "Installing shared core C compiler"
yann@331
   194
    make install-gcc 2>&1 |CT_DoLog ALL
yann@331
   195
yann@331
   196
    CT_EndStep
yann@331
   197
}
yann@331
   198
yann@331
   199
#------------------------------------------------------------------------------
yann@63
   200
# Build final gcc
yann@1
   201
do_cc() {
yann@48
   202
    CT_DoStep INFO "Installing final compiler"
yann@1
   203
yann@1
   204
    mkdir -p "${CT_BUILD_DIR}/build-cc"
yann@1
   205
    cd "${CT_BUILD_DIR}/build-cc"
yann@1
   206
yann@50
   207
    CT_DoLog EXTRA "Configuring final compiler"
yann@1
   208
yann@1
   209
    # Enable selected languages
yann@1
   210
    lang_opt="c"
yann@1
   211
    [ "${CT_CC_LANG_CXX}" = "y"      ] && lang_opt="${lang_opt},c++"
yann@1
   212
    [ "${CT_CC_LANG_FORTRAN}" = "y"  ] && lang_opt="${lang_opt},fortran"
yann@1
   213
    [ "${CT_CC_LANG_ADA}" = "y"      ] && lang_opt="${lang_opt},ada"
yann@1
   214
    [ "${CT_CC_LANG_JAVA}" = "y"     ] && lang_opt="${lang_opt},java"
yann@1
   215
    [ "${CT_CC_LANG_OBJC}" = "y"     ] && lang_opt="${lang_opt},objc"
yann@1
   216
    [ "${CT_CC_LANG_OBJCXX}" = "y"   ] && lang_opt="${lang_opt},obj-c++"
yann@1
   217
    CT_Test "Building ADA language is not yet supported. Will try..." "${CT_CC_LANG_ADA}" = "y"
yann@1
   218
    CT_Test "Building Objective-C language is not yet supported. Will try..." "${CT_CC_LANG_OBJC}" = "y"
yann@1
   219
    CT_Test "Building Objective-C++ language is not yet supported. Will try..." "${CT_CC_LANG_OBJCXX}" = "y"
yann@466
   220
    CT_Test "Building ${CT_CC_LANG_OTHERS//,/ } language(s) is not yet supported. Will try..." -n "${CT_CC_LANG_OTHERS}"
yann@523
   221
    lang_opt=$(echo "${lang_opt},${CT_CC_LANG_OTHERS}" |sed -r -e 's/,+/,/g; s/,*$//;')
yann@1
   222
yann@1
   223
    extra_config="--enable-languages=${lang_opt}"
yann@532
   224
    extra_config="${extra_config} --disable-multilib"
yann@391
   225
    extra_config="${extra_config} ${CT_ARCH_WITH_ARCH} ${CT_ARCH_WITH_ABI} ${CT_ARCH_WITH_CPU} ${CT_ARCH_WITH_TUNE} ${CT_ARCH_WITH_FPU} ${CT_ARCH_WITH_FLOAT}"
yann@545
   226
    [ "${CT_SHARED_LIBS}" = "y" ]     || extra_config="${extra_config} --disable-shared"
yann@645
   227
    [ "${CT_GMP_MPFR}" = "y" ] && extra_config="${extra_config} --with-gmp=${CT_PREFIX_DIR} --with-mpfr=${CT_PREFIX_DIR}"
yann@545
   228
    [ -n "${CT_CC_PKGVERSION}" ]      && extra_config="${extra_config} --with-pkgversion=${CT_CC_PKGVERSION}"
yann@545
   229
    [ -n "${CT_CC_BUGURL}" ]          && extra_config="${extra_config} --with-bugurl=${CT_CC_BUGURL}"
yann@528
   230
    if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
yann@528
   231
        extra_config="${extra_config} --enable-__cxa_atexit"
yann@528
   232
    else
yann@528
   233
        extra_config="${extra_config} --disable-__cxa_atexit"
yann@528
   234
    fi
yann@1
   235
yann@523
   236
    CT_DoLog DEBUG "Extra config passed: '${extra_config}'"
yann@1
   237
yann@1
   238
    # --enable-symvers=gnu really only needed for sh4 to work around a
yann@1
   239
    # detection problem only matters for gcc-3.2.x and later, I think.
yann@1
   240
    # --disable-nls to work around crash bug on ppc405, but also because
yann@1
   241
    # embedded systems don't really need message catalogs...
yann@501
   242
    CC_FOR_BUILD="${CT_CC_NATIVE}"              \
yann@397
   243
    CFLAGS="${CT_CFLAGS_FOR_HOST}"              \
yann@533
   244
    CFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"     \
yann@533
   245
    CXXFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}"   \
yann@533
   246
    LDFLAGS_FOR_TARGET="${CT_TARGET_LDFLAGS}"   \
yann@1
   247
    "${CT_SRC_DIR}/${CT_CC_FILE}/configure"     \
yann@1
   248
        ${CT_CANADIAN_OPT}                      \
yann@1
   249
        --target=${CT_TARGET} --host=${CT_HOST} \
yann@1
   250
        --prefix="${CT_PREFIX_DIR}"             \
yann@1
   251
        ${CC_SYSROOT_ARG}                       \
yann@1
   252
        ${extra_config}                         \
yann@1
   253
        --with-local-prefix="${CT_SYSROOT_DIR}" \
yann@1
   254
        --disable-nls                           \
yann@1
   255
        --enable-threads=posix                  \
yann@1
   256
        --enable-symvers=gnu                    \
yann@1
   257
        --enable-c99                            \
yann@1
   258
        --enable-long-long                      \
yann@501
   259
        --enable-target-optspace                \
yann@78
   260
        ${CT_CC_EXTRA_CONFIG}                   2>&1 |CT_DoLog ALL
yann@1
   261
yann@131
   262
    if [ "${CT_CANADIAN}" = "y" ]; then
yann@1
   263
        CT_DoLog EXTRA "Building libiberty"
yann@78
   264
        make ${PARALLELMFLAGS} all-build-libiberty 2>&1 |CT_DoLog ALL
yann@1
   265
    fi
yann@1
   266
yann@1
   267
    # Idea from <cort.dougan at gmail.com>:
yann@1
   268
    # Fix lib/lib64 confusion for GCC 3.3.3 on PowerPC64 and x86_64.
yann@1
   269
    # GCC 3.4.0 and up don't suffer from this confusion, and don't need this
yann@1
   270
    # kludge.
yann@1
   271
    # FIXME: we should patch gcc's source rather than uglify crosstool.sh.
yann@1
   272
    # FIXME: is this needed for gcc-3.3.[56]?
yann@1
   273
    case "${CT_CC_FILE}" in
yann@1
   274
      gcc-3.3.[34])
yann@1
   275
        case "${CT_TARGET}" in
yann@1
   276
          powerpc64-unknown-linux-gnu|x86_64-unknown-linux-gnu)
yann@523
   277
            for d in $(find "${CT_SYSROOT_DIR}" -name lib -type d -empty); do
yann@523
   278
              if [ -d $(dirname "${d}")/lib64 ] ; then
yann@1
   279
                rm -rf "${d}"
yann@523
   280
                ln -s $(dirname "${d}")/lib64 "${d}"
yann@1
   281
              fi
yann@1
   282
            done ;;
yann@1
   283
          *) ;;
yann@1
   284
        esac ;;
yann@1
   285
    esac
yann@1
   286
yann@50
   287
    CT_DoLog EXTRA "Building final compiler"
yann@78
   288
    make ${PARALLELMFLAGS} all 2>&1 |CT_DoLog ALL
yann@1
   289
yann@50
   290
    CT_DoLog EXTRA "Installing final compiler"
yann@78
   291
    make install 2>&1 |CT_DoLog ALL
yann@1
   292
yann@217
   293
    # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
yann@217
   294
    # to call the C compiler with the same, somewhat canonical name.
yann@235
   295
    ln "${CT_PREFIX_DIR}/bin/${CT_TARGET}"-{g,}cc
yann@217
   296
yann@414
   297
    # gcc installs stuff in prefix/target/lib, when it would make better sense
yann@414
   298
    # to install that into sysroot/usr/lib
yann@414
   299
    CT_DoLog EXTRA "Moving improperly installed gcc libs to sysroot"
yann@563
   300
    ( cd "${CT_PREFIX_DIR}/${CT_TARGET}/lib"; tar cf - . ) | ( cd "${CT_SYSROOT_DIR}/usr/lib"; tar xfv - ) |CT_DoLog ALL
yann@563
   301
    rm -rf "${CT_PREFIX_DIR}/${CT_TARGET}/lib"
yann@414
   302
yann@1
   303
    CT_EndStep
yann@1
   304
}