scripts/build/cc_gcc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sat May 03 17:51:16 2008 +0000 (2008-05-03)
changeset 486 92f6149c4275
parent 466 7f9bbf94b0bb
child 501 a7da743b324f
permissions -rw-r--r--
Some people are reposrting that ftp does not work on their network, probably due to proxies, while http does work.
Some (most) of the sites we use toretrieve tarballs have http equivallent for the ftp service. Use http as a failover.
There's no solution for those sites that do not have such an http equivalent.

/trunk/scripts/build/binutils.sh | 5 2 3 0 ++---
/trunk/scripts/build/libc_glibc.sh | 4 2 2 0 ++--
/trunk/scripts/build/libc_uClibc.sh | 2 1 1 0 +-
/trunk/scripts/build/debug/400-ltrace.sh | 2 1 1 0 +-
/trunk/scripts/build/debug/300-gdb.sh | 8 3 5 0 +++-----
/trunk/scripts/build/kernel_linux.sh | 7 2 5 0 ++-----
/trunk/scripts/build/cc_gcc.sh | 6 2 4 0 ++----
/trunk/scripts/build/gmp.sh | 4 1 3 0 +---
8 files changed, 14 insertions(+), 24 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@331
    55
    CT_DoLog EXTRA "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@331
    62
    [ "${CT_CC_CXA_ATEXIT}" = "y" ] && extra_config="${extra_config} --enable-__cxa_atexit"
yann@466
    63
    [ "${CT_CC_GCC_GMP_MPFR}" = "y" ] && extra_config="${extra_config} --with-gmp=${CT_PREFIX_DIR} --with-mpfr=${CT_PREFIX_DIR}"
yann@331
    64
yann@331
    65
    CT_DoLog DEBUG "Extra config passed: \"${extra_config}\""
yann@331
    66
yann@331
    67
    # Use --with-local-prefix so older gccs don't look in /usr/local (http://gcc.gnu.org/PR10532)
yann@331
    68
    CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
yann@331
    69
    "${CT_SRC_DIR}/${CT_CC_FILE}/configure"         \
yann@331
    70
        ${CT_CANADIAN_OPT}                          \
yann@331
    71
        --host=${CT_HOST}                           \
yann@331
    72
        --target=${CT_TARGET}                       \
yann@331
    73
        --prefix="${CT_CC_CORE_STATIC_PREFIX_DIR}"  \
yann@331
    74
        --with-local-prefix="${CT_SYSROOT_DIR}"     \
yann@331
    75
        --disable-multilib                          \
yann@331
    76
        --with-newlib                               \
yann@331
    77
        ${CC_CORE_SYSROOT_ARG}                      \
yann@331
    78
        ${extra_config}                             \
yann@331
    79
        --disable-nls                               \
yann@331
    80
        --enable-threads=no                         \
yann@331
    81
        --enable-symvers=gnu                        \
yann@331
    82
        --enable-languages=c                        \
yann@331
    83
        --disable-shared                            \
yann@331
    84
        ${CT_CC_CORE_EXTRA_CONFIG}                  2>&1 |CT_DoLog ALL
yann@331
    85
yann@331
    86
    if [ "${CT_CANADIAN}" = "y" ]; then
yann@331
    87
        CT_DoLog EXTRA "Building libiberty"
yann@331
    88
        make ${PARALLELMFLAGS} all-build-libiberty 2>&1 |CT_DoLog ALL
yann@331
    89
    fi
yann@331
    90
yann@331
    91
    CT_DoLog EXTRA "Building static core C compiler"
yann@331
    92
    make ${PARALLELMFLAGS} all-gcc 2>&1 |CT_DoLog ALL
yann@331
    93
yann@331
    94
    CT_DoLog EXTRA "Installing static core C compiler"
yann@331
    95
    make install-gcc 2>&1 |CT_DoLog ALL
yann@331
    96
yann@331
    97
    CT_EndStep
yann@331
    98
}
yann@331
    99
yann@331
   100
#------------------------------------------------------------------------------
yann@331
   101
# Build shared core gcc
yann@331
   102
do_cc_core_shared() {
yann@331
   103
    mkdir -p "${CT_BUILD_DIR}/build-cc-core-shared"
yann@331
   104
    cd "${CT_BUILD_DIR}/build-cc-core-shared"
yann@331
   105
yann@331
   106
    CT_DoStep INFO "Installing shared core C compiler"
yann@331
   107
yann@331
   108
    CT_DoLog EXTRA "Copying headers to install area of bootstrap gcc, so it can build libgcc2"
yann@331
   109
    mkdir -p "${CT_CC_CORE_SHARED_PREFIX_DIR}/${CT_TARGET}/include"
yann@331
   110
    cp -r "${CT_HEADERS_DIR}"/* "${CT_CC_CORE_SHARED_PREFIX_DIR}/${CT_TARGET}/include" 2>&1 |CT_DoLog DEBUG
yann@331
   111
yann@331
   112
    CT_DoLog EXTRA "Configuring shared core C compiler"
yann@331
   113
yann@391
   114
    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@331
   115
    [ "${CT_CC_CXA_ATEXIT}" = "y" ] && extra_config="${extra_config} --enable-__cxa_atexit"
yann@466
   116
    [ "${CT_CC_GCC_GMP_MPFR}" = "y" ] && extra_config="${extra_config} --with-gmp=${CT_PREFIX_DIR} --with-mpfr=${CT_PREFIX_DIR}"
yann@331
   117
yann@331
   118
    CT_DoLog DEBUG "Extra config passed: \"${extra_config}\""
yann@331
   119
yann@331
   120
    CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
yann@331
   121
    "${CT_SRC_DIR}/${CT_CC_FILE}/configure"         \
yann@331
   122
        ${CT_CANADIAN_OPT}                          \
yann@331
   123
        --target=${CT_TARGET}                       \
yann@331
   124
        --host=${CT_HOST}                           \
yann@331
   125
        --prefix="${CT_CC_CORE_SHARED_PREFIX_DIR}"  \
yann@331
   126
        --with-local-prefix="${CT_SYSROOT_DIR}"     \
yann@331
   127
        --disable-multilib                          \
yann@331
   128
        ${CC_CORE_SYSROOT_ARG}                      \
yann@331
   129
        ${extra_config}                             \
yann@331
   130
        --disable-nls                               \
yann@331
   131
        --enable-symvers=gnu                        \
yann@331
   132
        --enable-languages=c                        \
yann@331
   133
        --enable-shared                             \
yann@331
   134
        ${CT_CC_CORE_EXTRA_CONFIG}                  2>&1 |CT_DoLog ALL
yann@331
   135
yann@331
   136
    # HACK: we need to override SHLIB_LC from gcc/config/t-slibgcc-elf-ver or
yann@331
   137
    # gcc/config/t-libunwind so -lc is removed from the link for
yann@331
   138
    # libgcc_s.so, as we do not have a target -lc yet.
yann@331
   139
    # This is not as ugly as it appears to be ;-) All symbols get resolved
yann@331
   140
    # during the glibc build, and we provide a proper libgcc_s.so for the
yann@331
   141
    # cross toolchain during the final gcc build.
yann@331
   142
    #
yann@331
   143
    # As we cannot modify the source tree, nor override SHLIB_LC itself
yann@331
   144
    # during configure or make, we have to edit the resultant
yann@331
   145
    # gcc/libgcc.mk itself to remove -lc from the link.
yann@331
   146
    # This causes us to have to jump through some hoops...
yann@331
   147
    #
yann@331
   148
    # To produce libgcc.mk to edit we firstly require libiberty.a,
yann@331
   149
    # so we configure then build it.
yann@331
   150
    # Next we have to configure gcc, create libgcc.mk then edit it...
yann@331
   151
    # So much easier if we just edit the source tree, but hey...
yann@331
   152
    if [ ! -f "${CT_SRC_DIR}/${CT_CC_FILE}/gcc/BASE-VER" ]; then
yann@331
   153
        make configure-libiberty
yann@331
   154
        make -C libiberty libiberty.a
yann@331
   155
        make configure-gcc
yann@331
   156
        make configure-libcpp
yann@331
   157
        make all-libcpp
yann@331
   158
    else
yann@331
   159
        make configure-gcc
yann@331
   160
        make configure-libcpp
yann@331
   161
        make configure-build-libiberty
yann@331
   162
        make all-libcpp
yann@331
   163
        make all-build-libiberty
yann@331
   164
    fi 2>&1 |CT_DoLog ALL
yann@331
   165
    # HACK: gcc-4.2 uses libdecnumber to build libgcc.mk, so build it here.
yann@331
   166
    if [ -d "${CT_SRC_DIR}/${CT_CC_FILE}/libdecnumber" ]; then
yann@331
   167
        make configure-libdecnumber
yann@331
   168
        make -C libdecnumber libdecnumber.a
yann@331
   169
    fi 2>&1 |CT_DoLog ALL
yann@331
   170
    make -C gcc libgcc.mk 2>&1 |CT_DoLog ALL
yann@331
   171
    sed -r -i -e 's@-lc@@g' gcc/libgcc.mk
yann@331
   172
yann@331
   173
    if [ "${CT_CANADIAN}" = "y" ]; then
yann@331
   174
        CT_DoLog EXTRA "Building libiberty"
yann@331
   175
        make ${PARALLELMFLAGS} all-build-libiberty 2>&1 |CT_DoLog ALL
yann@331
   176
    fi
yann@331
   177
yann@331
   178
    CT_DoLog EXTRA "Building shared core C compiler"
yann@331
   179
    make ${PARALLELMFLAGS} all-gcc 2>&1 |CT_DoLog ALL
yann@331
   180
yann@331
   181
    CT_DoLog EXTRA "Installing shared core C compiler"
yann@331
   182
    make install-gcc 2>&1 |CT_DoLog ALL
yann@331
   183
yann@331
   184
    CT_EndStep
yann@331
   185
}
yann@331
   186
yann@331
   187
#------------------------------------------------------------------------------
yann@63
   188
# Build final gcc
yann@1
   189
do_cc() {
yann@48
   190
    CT_DoStep INFO "Installing final compiler"
yann@1
   191
yann@1
   192
    mkdir -p "${CT_BUILD_DIR}/build-cc"
yann@1
   193
    cd "${CT_BUILD_DIR}/build-cc"
yann@1
   194
yann@50
   195
    CT_DoLog EXTRA "Configuring final compiler"
yann@1
   196
yann@1
   197
    # Enable selected languages
yann@1
   198
    lang_opt="c"
yann@1
   199
    [ "${CT_CC_LANG_CXX}" = "y"      ] && lang_opt="${lang_opt},c++"
yann@1
   200
    [ "${CT_CC_LANG_FORTRAN}" = "y"  ] && lang_opt="${lang_opt},fortran"
yann@1
   201
    [ "${CT_CC_LANG_ADA}" = "y"      ] && lang_opt="${lang_opt},ada"
yann@1
   202
    [ "${CT_CC_LANG_JAVA}" = "y"     ] && lang_opt="${lang_opt},java"
yann@1
   203
    [ "${CT_CC_LANG_OBJC}" = "y"     ] && lang_opt="${lang_opt},objc"
yann@1
   204
    [ "${CT_CC_LANG_OBJCXX}" = "y"   ] && lang_opt="${lang_opt},obj-c++"
yann@1
   205
    CT_Test "Building ADA language is not yet supported. Will try..." "${CT_CC_LANG_ADA}" = "y"
yann@1
   206
    CT_Test "Building Objective-C language is not yet supported. Will try..." "${CT_CC_LANG_OBJC}" = "y"
yann@1
   207
    CT_Test "Building Objective-C++ language is not yet supported. Will try..." "${CT_CC_LANG_OBJCXX}" = "y"
yann@466
   208
    CT_Test "Building ${CT_CC_LANG_OTHERS//,/ } language(s) is not yet supported. Will try..." -n "${CT_CC_LANG_OTHERS}"
yann@48
   209
    lang_opt=`echo "${lang_opt},${CT_CC_LANG_OTHERS}" |sed -r -e 's/,+/,/g; s/,*$//;'`
yann@1
   210
yann@1
   211
    extra_config="--enable-languages=${lang_opt}"
yann@391
   212
    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@1
   213
    [ "${CT_SHARED_LIBS}" = "y" ] || extra_config="${extra_config} --disable-shared"
yann@20
   214
    [ "${CT_CC_CXA_ATEXIT}" == "y" ] && extra_config="${extra_config} --enable-__cxa_atexit"
yann@392
   215
    if [ "${CT_TARGET_MULTILIB}" = "y" ]; then
yann@392
   216
        extra_config="${extra_config} --enable-multilib"
yann@392
   217
    else
yann@392
   218
        extra_config="${extra_config} --disable-multilib"
yann@392
   219
    fi
yann@466
   220
    [ "${CT_CC_GCC_GMP_MPFR}" = "y" ] && extra_config="${extra_config} --with-gmp=${CT_PREFIX_DIR} --with-mpfr=${CT_PREFIX_DIR}"
yann@1
   221
yann@1
   222
    CT_DoLog DEBUG "Extra config passed: \"${extra_config}\""
yann@1
   223
yann@1
   224
    # --enable-symvers=gnu really only needed for sh4 to work around a
yann@1
   225
    # detection problem only matters for gcc-3.2.x and later, I think.
yann@1
   226
    # --disable-nls to work around crash bug on ppc405, but also because
yann@1
   227
    # embedded systems don't really need message catalogs...
yann@397
   228
    CFLAGS="${CT_CFLAGS_FOR_HOST}"              \
yann@397
   229
    TARGET_CFLAGS="${CT_TARGET_CFLAGS}"         \
yann@1
   230
    "${CT_SRC_DIR}/${CT_CC_FILE}/configure"     \
yann@1
   231
        ${CT_CANADIAN_OPT}                      \
yann@1
   232
        --target=${CT_TARGET} --host=${CT_HOST} \
yann@1
   233
        --prefix="${CT_PREFIX_DIR}"             \
yann@1
   234
        ${CC_SYSROOT_ARG}                       \
yann@1
   235
        ${extra_config}                         \
yann@1
   236
        --with-local-prefix="${CT_SYSROOT_DIR}" \
yann@1
   237
        --disable-nls                           \
yann@1
   238
        --enable-threads=posix                  \
yann@1
   239
        --enable-symvers=gnu                    \
yann@1
   240
        --enable-c99                            \
yann@1
   241
        --enable-long-long                      \
yann@78
   242
        ${CT_CC_EXTRA_CONFIG}                   2>&1 |CT_DoLog ALL
yann@1
   243
yann@131
   244
    if [ "${CT_CANADIAN}" = "y" ]; then
yann@1
   245
        CT_DoLog EXTRA "Building libiberty"
yann@78
   246
        make ${PARALLELMFLAGS} all-build-libiberty 2>&1 |CT_DoLog ALL
yann@1
   247
    fi
yann@1
   248
yann@1
   249
    # Idea from <cort.dougan at gmail.com>:
yann@1
   250
    # Fix lib/lib64 confusion for GCC 3.3.3 on PowerPC64 and x86_64.
yann@1
   251
    # GCC 3.4.0 and up don't suffer from this confusion, and don't need this
yann@1
   252
    # kludge.
yann@1
   253
    # FIXME: we should patch gcc's source rather than uglify crosstool.sh.
yann@1
   254
    # FIXME: is this needed for gcc-3.3.[56]?
yann@1
   255
    case "${CT_CC_FILE}" in
yann@1
   256
      gcc-3.3.[34])
yann@1
   257
        case "${CT_TARGET}" in
yann@1
   258
          powerpc64-unknown-linux-gnu|x86_64-unknown-linux-gnu)
yann@1
   259
            for d in `find "${CT_SYSROOT_DIR}" -name lib -type d -empty`; do
yann@1
   260
              if [ -d `dirname "${d}"`/lib64 ] ; then
yann@1
   261
                rm -rf "${d}"
yann@1
   262
                ln -s `dirname "${d}"`/lib64 "${d}"
yann@1
   263
              fi
yann@1
   264
            done ;;
yann@1
   265
          *) ;;
yann@1
   266
        esac ;;
yann@1
   267
    esac
yann@1
   268
yann@50
   269
    CT_DoLog EXTRA "Building final compiler"
yann@78
   270
    make ${PARALLELMFLAGS} all 2>&1 |CT_DoLog ALL
yann@1
   271
yann@50
   272
    CT_DoLog EXTRA "Installing final compiler"
yann@78
   273
    make install 2>&1 |CT_DoLog ALL
yann@1
   274
yann@217
   275
    # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
yann@217
   276
    # to call the C compiler with the same, somewhat canonical name.
yann@235
   277
    ln "${CT_PREFIX_DIR}/bin/${CT_TARGET}"-{g,}cc
yann@217
   278
yann@414
   279
    # gcc installs stuff in prefix/target/lib, when it would make better sense
yann@414
   280
    # to install that into sysroot/usr/lib
yann@414
   281
    CT_DoLog EXTRA "Moving improperly installed gcc libs to sysroot"
yann@414
   282
    ( cd "${CT_PREFIX_DIR}/${CT_TARGET}/lib"; tar cf - . ) | ( cd "${CT_SYSROOT_DIR}/usr/lib"; tar xfv - )
yann@414
   283
yann@1
   284
    CT_EndStep
yann@1
   285
}