summaryrefslogtreecommitdiff
path: root/scripts/build/cc_gcc.sh
blob: 82dd2a318e8f31c78d64ac9b23d9109197b9622f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# This file adds the function to build the final gcc C compiler
# Copyright 2007 Yann E. MORIN
# Licensed under the GPL v2. See COPYING in the root of this package

# Download final gcc
do_cc_get() {
    # Ah! gcc folks are kind of 'different': they store the tarballs in
    # subdirectories of the same name! That's because gcc is such /crap/ that
    # it is such /big/ that it needs being splitted for distribution! Sad. :-(
    # Arrgghh! Some of those versions does not follow this convention:
    # gcc-3.3.3 lives in releases/gcc-3.3.3, while gcc-2.95.* isn't in a
    # subdirectory! You bastard!
    CT_GetFile "${CT_CC_FILE}"                                  \
               ftp://ftp.gnu.org/gnu/gcc/${CT_CC_FILE}          \
               ftp://ftp.gnu.org/gnu/gcc/releases/${CT_CC_FILE} \
               ftp://ftp.gnu.org/gnu/gcc
}

# Extract final gcc
do_cc_extract() {
    CT_ExtractAndPatch "${CT_CC_FILE}"
}

# Build final gcc
do_cc() {
    CT_DoStep INFO "Installing final compiler"

    mkdir -p "${CT_BUILD_DIR}/build-cc"
    cd "${CT_BUILD_DIR}/build-cc"

    CT_DoLog EXTRA "Configuring final compiler"

    # Enable selected languages
    lang_opt="c"
    [ "${CT_CC_LANG_CXX}" = "y"      ] && lang_opt="${lang_opt},c++"
    [ "${CT_CC_LANG_FORTRAN}" = "y"  ] && lang_opt="${lang_opt},fortran"
    [ "${CT_CC_LANG_ADA}" = "y"      ] && lang_opt="${lang_opt},ada"
    [ "${CT_CC_LANG_JAVA}" = "y"     ] && lang_opt="${lang_opt},java"
    [ "${CT_CC_LANG_OBJC}" = "y"     ] && lang_opt="${lang_opt},objc"
    [ "${CT_CC_LANG_OBJCXX}" = "y"   ] && lang_opt="${lang_opt},obj-c++"
    CT_Test "Building Fortran language is not yet supported. Will try..." "${CT_CC_LANG_FORTRAN}" = "y"
    CT_Test "Building ADA language is not yet supported. Will try..." "${CT_CC_LANG_ADA}" = "y"
    CT_Test "Building Java language is not yet supported. Will try..." "${CT_CC_LANG_JAVA}" = "y"
    CT_Test "Building Objective-C language is not yet supported. Will try..." "${CT_CC_LANG_OBJC}" = "y"
    CT_Test "Building Objective-C++ language is not yet supported. Will try..." "${CT_CC_LANG_OBJCXX}" = "y"
    CT_Test "Building ${CT_CC_LANG_OTHERS} language(s) is not yet supported. Will try..." -n "${CT_CC_LANG_OTHERS}"
    lang_opt=`echo "${lang_opt},${CT_CC_LANG_OTHERS}" |sed -r -e 's/,+/,/g; s/,*$//;'`

    extra_config="--enable-languages=${lang_opt}"
    [ "${CT_ARCH_FLOAT_SW}" = "y" ] && extra_config="${extra_config} --with-float=soft"
    [ "${CT_SHARED_LIBS}" = "y" ] || extra_config="${extra_config} --disable-shared"
    [ -n "${CT_ARCH_ABI}" ]  && extra_config="${extra_config} --with-abi=${CT_ARCH_ABI}"
    [ -n "${CT_ARCH_CPU}" ]  && extra_config="${extra_config} --with-cpu=${CT_ARCH_CPU}"
    [ -n "${CT_ARCH_TUNE}" ] && extra_config="${extra_config} --with-tune=${CT_ARCH_TUNE}"
    [ -n "${CT_ARCH_ARCH}" ] && extra_config="${extra_config} --with-arch=${CT_ARCH_ARCH}"
    [ -n "${CT_ARCH_FPU}" ] && extra_config="${extra_config} --with-fpu=${CT_ARCH_FPU}"
    if [ "${CT_TARGET_MULTILIB}" = "y" ]; then
       extra_config="${extra_config} --enable-multilib"
    else
       extra_config="${extra_config} --disable-multilib"
    fi
    [ "${CT_CC_CXA_ATEXIT}" == "y" ] && extra_config="${extra_config} --enable-__cxa_atexit"

    CT_DoLog DEBUG "Extra config passed: \"${extra_config}\""

    # --enable-symvers=gnu really only needed for sh4 to work around a
    # detection problem only matters for gcc-3.2.x and later, I think.
    # --disable-nls to work around crash bug on ppc405, but also because
    # embedded systems don't really need message catalogs...
    CFLAGS="${CT_CFLAGS_FOR_HOST}"                  \
    "${CT_SRC_DIR}/${CT_CC_FILE}/configure"     \
        ${CT_CANADIAN_OPT}                      \
        --target=${CT_TARGET} --host=${CT_HOST} \
        --prefix="${CT_PREFIX_DIR}"             \
        ${CC_SYSROOT_ARG}                       \
        ${extra_config}                         \
        --with-local-prefix="${CT_SYSROOT_DIR}" \
        --disable-nls                           \
        --enable-threads=posix                  \
        --enable-symvers=gnu                    \
        --enable-c99                            \
        --enable-long-long                      \
        ${CT_CC_EXTRA_CONFIG}                   2>&1 |CT_DoLog ALL

    if [ "${CT_CANADIAN}" = "y" ]; then
        CT_DoLog EXTRA "Building libiberty"
        make ${PARALLELMFLAGS} all-build-libiberty 2>&1 |CT_DoLog ALL
    fi


    # Idea from <cort.dougan at gmail.com>:
    # Fix lib/lib64 confusion for GCC 3.3.3 on PowerPC64 and x86_64.
    # GCC 3.4.0 and up don't suffer from this confusion, and don't need this
    # kludge.
    # FIXME: we should patch gcc's source rather than uglify crosstool.sh.
    # FIXME: is this needed for gcc-3.3.[56]?
    case "${CT_CC_FILE}" in
      gcc-3.3.[34])
        case "${CT_TARGET}" in
          powerpc64-unknown-linux-gnu|x86_64-unknown-linux-gnu)
            for d in `find "${CT_SYSROOT_DIR}" -name lib -type d -empty`; do
              if [ -d `dirname "${d}"`/lib64 ] ; then
                rm -rf "${d}"
                ln -s `dirname "${d}"`/lib64 "${d}"
              fi
            done ;;
          *) ;;
        esac ;;
    esac

    CT_DoLog EXTRA "Building final compiler"
    make ${PARALLELMFLAGS} all 2>&1 |CT_DoLog ALL

    CT_DoLog EXTRA "Installing final compiler"
    make install 2>&1 |CT_DoLog ALL

    # FIXME: shouldn't people who want this just --disable-multilib in final gcc
    # and be done with it?
    # This code should probably be deleted, it was written long ago and hasn't
    # been tested in ages.
    # kludge: If the chip does not have a floating point unit
    # (i.e. if GLIBC_EXTRA_CONFIG contains --without-fp),
    # and there are shared libraries in /lib/nof, copy them to /lib
    # so they get used by default.
    # FIXME: only rs6000/powerpc seem to use nof.  See MULTILIB_DIRNAMES
    # in $GCC_DIR/gcc/config/$TARGET/* to see what your arch calls it.
    #case "${CT_LIBC_EXTRA_CONFIG}" in
    #    *--without-fp*)
    #        if test -d "${CT_SYSROOT_DIR}/lib/nof"; then
    #            cp -af "${CT_SYSROOT_DIR}/lib/nof/"*.so* "${CT_SYSROOT_DIR}/lib" || true
    #        fi
    #    ;;
    #esac

    CT_EndStep
}