scripts/build/cc_gcc.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Feb 17 22:08:06 2008 +0000 (2008-02-17)
changeset 431 8bde4c6ea47a
parent 397 046dfd46798c
child 462 b959799c9a36
permissions -rw-r--r--
Robert P. J. DAY says:

apparently, the patchset for gcc 4.2.1 applies properly to the
source for gcc 4.2.2 and gcc 4.2.3. so, if you want, you can simply
add support for those last two just by augmenting menuconfig and
adding a couple symlinks for those two directories. seems like a
cheap way to add a couple new versions.
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@63
    10
# Download final 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@63
    18
    CT_GetFile "${CT_CC_FILE}"                                  \
yann@63
    19
               ftp://ftp.gnu.org/gnu/gcc/${CT_CC_FILE}          \
yann@63
    20
               ftp://ftp.gnu.org/gnu/gcc/releases/${CT_CC_FILE} \
yann@63
    21
               ftp://ftp.gnu.org/gnu/gcc
yann@63
    22
}
yann@63
    23
yann@63
    24
# Extract final gcc
yann@63
    25
do_cc_extract() {
yann@63
    26
    CT_ExtractAndPatch "${CT_CC_FILE}"
yann@63
    27
}
yann@63
    28
yann@331
    29
#------------------------------------------------------------------------------
yann@331
    30
# Core gcc pass 1
yann@331
    31
do_cc_core_pass_1() {
yann@331
    32
    # In case we're NPTL, build the static core gcc;
yann@331
    33
    # in any other case, do nothing.
yann@354
    34
    CT_DoStep INFO "Core C compiler, pass 1"
yann@331
    35
    case "${CT_THREADS}" in
yann@331
    36
        nptl)   do_cc_core_static;;
yann@354
    37
        *)      CT_DoLog INFO "Nothing to do";;
yann@331
    38
    esac
yann@354
    39
    CT_EndStep
yann@331
    40
}
yann@331
    41
yann@331
    42
# Core gcc pass 2
yann@331
    43
do_cc_core_pass_2() {
yann@331
    44
    # In case we're NPTL, build the shared core gcc,
yann@331
    45
    # in any other case, build the static core gcc.
yann@354
    46
    CT_DoStep INFO "Core C compiler, pass 2"
yann@331
    47
    case "${CT_THREADS}" in
yann@331
    48
        nptl)   do_cc_core_shared;;
yann@331
    49
        *)      do_cc_core_static;;
yann@331
    50
    esac
yann@354
    51
    CT_EndStep
yann@331
    52
}
yann@331
    53
yann@331
    54
#------------------------------------------------------------------------------
yann@331
    55
# Build static core gcc
yann@331
    56
do_cc_core_static() {
yann@331
    57
    mkdir -p "${CT_BUILD_DIR}/build-cc-core-static"
yann@331
    58
    cd "${CT_BUILD_DIR}/build-cc-core-static"
yann@331
    59
yann@331
    60
    CT_DoStep INFO "Installing static core C compiler"
yann@331
    61
yann@331
    62
    CT_DoLog EXTRA "Copying headers to install area of bootstrap gcc, so it can build libgcc2"
yann@331
    63
    mkdir -p "${CT_CC_CORE_STATIC_PREFIX_DIR}/${CT_TARGET}/include"
yann@331
    64
    cp -r "${CT_HEADERS_DIR}"/* "${CT_CC_CORE_STATIC_PREFIX_DIR}/${CT_TARGET}/include" 2>&1 |CT_DoLog DEBUG
yann@331
    65
yann@331
    66
    CT_DoLog EXTRA "Configuring static core C compiler"
yann@331
    67
yann@391
    68
    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
    69
    [ "${CT_CC_CXA_ATEXIT}" = "y" ] && extra_config="${extra_config} --enable-__cxa_atexit"
yann@331
    70
yann@331
    71
    CT_DoLog DEBUG "Extra config passed: \"${extra_config}\""
yann@331
    72
yann@331
    73
    # Use --with-local-prefix so older gccs don't look in /usr/local (http://gcc.gnu.org/PR10532)
yann@331
    74
    CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
yann@331
    75
    "${CT_SRC_DIR}/${CT_CC_FILE}/configure"         \
yann@331
    76
        ${CT_CANADIAN_OPT}                          \
yann@331
    77
        --host=${CT_HOST}                           \
yann@331
    78
        --target=${CT_TARGET}                       \
yann@331
    79
        --prefix="${CT_CC_CORE_STATIC_PREFIX_DIR}"  \
yann@331
    80
        --with-local-prefix="${CT_SYSROOT_DIR}"     \
yann@331
    81
        --disable-multilib                          \
yann@331
    82
        --with-newlib                               \
yann@331
    83
        ${CC_CORE_SYSROOT_ARG}                      \
yann@331
    84
        ${extra_config}                             \
yann@331
    85
        --disable-nls                               \
yann@331
    86
        --enable-threads=no                         \
yann@331
    87
        --enable-symvers=gnu                        \
yann@331
    88
        --enable-languages=c                        \
yann@331
    89
        --disable-shared                            \
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@331
   114
    CT_DoLog EXTRA "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@331
   121
    [ "${CT_CC_CXA_ATEXIT}" = "y" ] && extra_config="${extra_config} --enable-__cxa_atexit"
yann@331
   122
yann@331
   123
    CT_DoLog DEBUG "Extra config passed: \"${extra_config}\""
yann@331
   124
yann@331
   125
    CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
yann@331
   126
    "${CT_SRC_DIR}/${CT_CC_FILE}/configure"         \
yann@331
   127
        ${CT_CANADIAN_OPT}                          \
yann@331
   128
        --target=${CT_TARGET}                       \
yann@331
   129
        --host=${CT_HOST}                           \
yann@331
   130
        --prefix="${CT_CC_CORE_SHARED_PREFIX_DIR}"  \
yann@331
   131
        --with-local-prefix="${CT_SYSROOT_DIR}"     \
yann@331
   132
        --disable-multilib                          \
yann@331
   133
        ${CC_CORE_SYSROOT_ARG}                      \
yann@331
   134
        ${extra_config}                             \
yann@331
   135
        --disable-nls                               \
yann@331
   136
        --enable-symvers=gnu                        \
yann@331
   137
        --enable-languages=c                        \
yann@331
   138
        --enable-shared                             \
yann@331
   139
        ${CT_CC_CORE_EXTRA_CONFIG}                  2>&1 |CT_DoLog ALL
yann@331
   140
yann@331
   141
    # HACK: we need to override SHLIB_LC from gcc/config/t-slibgcc-elf-ver or
yann@331
   142
    # gcc/config/t-libunwind so -lc is removed from the link for
yann@331
   143
    # libgcc_s.so, as we do not have a target -lc yet.
yann@331
   144
    # This is not as ugly as it appears to be ;-) All symbols get resolved
yann@331
   145
    # during the glibc build, and we provide a proper libgcc_s.so for the
yann@331
   146
    # cross toolchain during the final gcc build.
yann@331
   147
    #
yann@331
   148
    # As we cannot modify the source tree, nor override SHLIB_LC itself
yann@331
   149
    # during configure or make, we have to edit the resultant
yann@331
   150
    # gcc/libgcc.mk itself to remove -lc from the link.
yann@331
   151
    # This causes us to have to jump through some hoops...
yann@331
   152
    #
yann@331
   153
    # To produce libgcc.mk to edit we firstly require libiberty.a,
yann@331
   154
    # so we configure then build it.
yann@331
   155
    # Next we have to configure gcc, create libgcc.mk then edit it...
yann@331
   156
    # So much easier if we just edit the source tree, but hey...
yann@331
   157
    if [ ! -f "${CT_SRC_DIR}/${CT_CC_FILE}/gcc/BASE-VER" ]; then
yann@331
   158
        make configure-libiberty
yann@331
   159
        make -C libiberty libiberty.a
yann@331
   160
        make configure-gcc
yann@331
   161
        make configure-libcpp
yann@331
   162
        make all-libcpp
yann@331
   163
    else
yann@331
   164
        make configure-gcc
yann@331
   165
        make configure-libcpp
yann@331
   166
        make configure-build-libiberty
yann@331
   167
        make all-libcpp
yann@331
   168
        make all-build-libiberty
yann@331
   169
    fi 2>&1 |CT_DoLog ALL
yann@331
   170
    # HACK: gcc-4.2 uses libdecnumber to build libgcc.mk, so build it here.
yann@331
   171
    if [ -d "${CT_SRC_DIR}/${CT_CC_FILE}/libdecnumber" ]; then
yann@331
   172
        make configure-libdecnumber
yann@331
   173
        make -C libdecnumber libdecnumber.a
yann@331
   174
    fi 2>&1 |CT_DoLog ALL
yann@331
   175
    make -C gcc libgcc.mk 2>&1 |CT_DoLog ALL
yann@331
   176
    sed -r -i -e 's@-lc@@g' gcc/libgcc.mk
yann@331
   177
yann@331
   178
    if [ "${CT_CANADIAN}" = "y" ]; then
yann@331
   179
        CT_DoLog EXTRA "Building libiberty"
yann@331
   180
        make ${PARALLELMFLAGS} all-build-libiberty 2>&1 |CT_DoLog ALL
yann@331
   181
    fi
yann@331
   182
yann@331
   183
    CT_DoLog EXTRA "Building shared core C compiler"
yann@331
   184
    make ${PARALLELMFLAGS} all-gcc 2>&1 |CT_DoLog ALL
yann@331
   185
yann@331
   186
    CT_DoLog EXTRA "Installing shared core C compiler"
yann@331
   187
    make install-gcc 2>&1 |CT_DoLog ALL
yann@331
   188
yann@331
   189
    CT_EndStep
yann@331
   190
}
yann@331
   191
yann@331
   192
#------------------------------------------------------------------------------
yann@63
   193
# Build final gcc
yann@1
   194
do_cc() {
yann@48
   195
    CT_DoStep INFO "Installing final compiler"
yann@1
   196
yann@1
   197
    mkdir -p "${CT_BUILD_DIR}/build-cc"
yann@1
   198
    cd "${CT_BUILD_DIR}/build-cc"
yann@1
   199
yann@50
   200
    CT_DoLog EXTRA "Configuring final compiler"
yann@1
   201
yann@1
   202
    # Enable selected languages
yann@1
   203
    lang_opt="c"
yann@1
   204
    [ "${CT_CC_LANG_CXX}" = "y"      ] && lang_opt="${lang_opt},c++"
yann@1
   205
    [ "${CT_CC_LANG_FORTRAN}" = "y"  ] && lang_opt="${lang_opt},fortran"
yann@1
   206
    [ "${CT_CC_LANG_ADA}" = "y"      ] && lang_opt="${lang_opt},ada"
yann@1
   207
    [ "${CT_CC_LANG_JAVA}" = "y"     ] && lang_opt="${lang_opt},java"
yann@1
   208
    [ "${CT_CC_LANG_OBJC}" = "y"     ] && lang_opt="${lang_opt},objc"
yann@1
   209
    [ "${CT_CC_LANG_OBJCXX}" = "y"   ] && lang_opt="${lang_opt},obj-c++"
yann@1
   210
    CT_Test "Building Fortran language is not yet supported. Will try..." "${CT_CC_LANG_FORTRAN}" = "y"
yann@1
   211
    CT_Test "Building ADA language is not yet supported. Will try..." "${CT_CC_LANG_ADA}" = "y"
yann@1
   212
    CT_Test "Building Java language is not yet supported. Will try..." "${CT_CC_LANG_JAVA}" = "y"
yann@1
   213
    CT_Test "Building Objective-C language is not yet supported. Will try..." "${CT_CC_LANG_OBJC}" = "y"
yann@1
   214
    CT_Test "Building Objective-C++ language is not yet supported. Will try..." "${CT_CC_LANG_OBJCXX}" = "y"
yann@1
   215
    CT_Test "Building ${CT_CC_LANG_OTHERS} language(s) is not yet supported. Will try..." -n "${CT_CC_LANG_OTHERS}"
yann@48
   216
    lang_opt=`echo "${lang_opt},${CT_CC_LANG_OTHERS}" |sed -r -e 's/,+/,/g; s/,*$//;'`
yann@1
   217
yann@1
   218
    extra_config="--enable-languages=${lang_opt}"
yann@391
   219
    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
   220
    [ "${CT_SHARED_LIBS}" = "y" ] || extra_config="${extra_config} --disable-shared"
yann@20
   221
    [ "${CT_CC_CXA_ATEXIT}" == "y" ] && extra_config="${extra_config} --enable-__cxa_atexit"
yann@392
   222
    if [ "${CT_TARGET_MULTILIB}" = "y" ]; then
yann@392
   223
        extra_config="${extra_config} --enable-multilib"
yann@392
   224
    else
yann@392
   225
        extra_config="${extra_config} --disable-multilib"
yann@392
   226
    fi
yann@1
   227
yann@1
   228
    CT_DoLog DEBUG "Extra config passed: \"${extra_config}\""
yann@1
   229
yann@1
   230
    # --enable-symvers=gnu really only needed for sh4 to work around a
yann@1
   231
    # detection problem only matters for gcc-3.2.x and later, I think.
yann@1
   232
    # --disable-nls to work around crash bug on ppc405, but also because
yann@1
   233
    # embedded systems don't really need message catalogs...
yann@397
   234
    CFLAGS="${CT_CFLAGS_FOR_HOST}"              \
yann@397
   235
    TARGET_CFLAGS="${CT_TARGET_CFLAGS}"         \
yann@1
   236
    "${CT_SRC_DIR}/${CT_CC_FILE}/configure"     \
yann@1
   237
        ${CT_CANADIAN_OPT}                      \
yann@1
   238
        --target=${CT_TARGET} --host=${CT_HOST} \
yann@1
   239
        --prefix="${CT_PREFIX_DIR}"             \
yann@1
   240
        ${CC_SYSROOT_ARG}                       \
yann@1
   241
        ${extra_config}                         \
yann@1
   242
        --with-local-prefix="${CT_SYSROOT_DIR}" \
yann@1
   243
        --disable-nls                           \
yann@1
   244
        --enable-threads=posix                  \
yann@1
   245
        --enable-symvers=gnu                    \
yann@1
   246
        --enable-c99                            \
yann@1
   247
        --enable-long-long                      \
yann@78
   248
        ${CT_CC_EXTRA_CONFIG}                   2>&1 |CT_DoLog ALL
yann@1
   249
yann@131
   250
    if [ "${CT_CANADIAN}" = "y" ]; then
yann@1
   251
        CT_DoLog EXTRA "Building libiberty"
yann@78
   252
        make ${PARALLELMFLAGS} all-build-libiberty 2>&1 |CT_DoLog ALL
yann@1
   253
    fi
yann@1
   254
yann@1
   255
    # Idea from <cort.dougan at gmail.com>:
yann@1
   256
    # Fix lib/lib64 confusion for GCC 3.3.3 on PowerPC64 and x86_64.
yann@1
   257
    # GCC 3.4.0 and up don't suffer from this confusion, and don't need this
yann@1
   258
    # kludge.
yann@1
   259
    # FIXME: we should patch gcc's source rather than uglify crosstool.sh.
yann@1
   260
    # FIXME: is this needed for gcc-3.3.[56]?
yann@1
   261
    case "${CT_CC_FILE}" in
yann@1
   262
      gcc-3.3.[34])
yann@1
   263
        case "${CT_TARGET}" in
yann@1
   264
          powerpc64-unknown-linux-gnu|x86_64-unknown-linux-gnu)
yann@1
   265
            for d in `find "${CT_SYSROOT_DIR}" -name lib -type d -empty`; do
yann@1
   266
              if [ -d `dirname "${d}"`/lib64 ] ; then
yann@1
   267
                rm -rf "${d}"
yann@1
   268
                ln -s `dirname "${d}"`/lib64 "${d}"
yann@1
   269
              fi
yann@1
   270
            done ;;
yann@1
   271
          *) ;;
yann@1
   272
        esac ;;
yann@1
   273
    esac
yann@1
   274
yann@50
   275
    CT_DoLog EXTRA "Building final compiler"
yann@78
   276
    make ${PARALLELMFLAGS} all 2>&1 |CT_DoLog ALL
yann@1
   277
yann@50
   278
    CT_DoLog EXTRA "Installing final compiler"
yann@78
   279
    make install 2>&1 |CT_DoLog ALL
yann@1
   280
yann@217
   281
    # Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-gcc to always be able
yann@217
   282
    # to call the C compiler with the same, somewhat canonical name.
yann@235
   283
    ln "${CT_PREFIX_DIR}/bin/${CT_TARGET}"-{g,}cc
yann@217
   284
yann@414
   285
    # gcc installs stuff in prefix/target/lib, when it would make better sense
yann@414
   286
    # to install that into sysroot/usr/lib
yann@414
   287
    CT_DoLog EXTRA "Moving improperly installed gcc libs to sysroot"
yann@414
   288
    ( cd "${CT_PREFIX_DIR}/${CT_TARGET}/lib"; tar cf - . ) | ( cd "${CT_SYSROOT_DIR}/usr/lib"; tar xfv - )
yann@414
   289
yann@1
   290
    CT_EndStep
yann@1
   291
}