# Cross GCC-&gcc-version; - Static

## Installation of Cross GCC Compiler with Static libgcc and no Threads

The following patch contains a number of updates to the &gcc-version; branch by the GCC developers:

    patch -Np1 -i ../&gcc-branch_update-patch;

Make a couple of essential adjustments to the `specs` file to ensure GCC uses our build environment:

    patch -Np1 -i ../&gcc-specs-patch;

Change the StartFile Spec and Standard Include Dir so that GCC looks in `/tools`:

    echo -en '#undef STANDARD_INCLUDE_DIR\n#define STANDARD_INCLUDE_DIR "/tools/include/"\n\n' >> gcc/config/linux.h
    echo -en '\n#undef STANDARD_STARTFILE_PREFIX_1\n#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"\n' >> gcc/config/linux.h
    echo -en '\n#undef STANDARD_STARTFILE_PREFIX_2\n#define STANDARD_STARTFILE_PREFIX_2 ""\n' >> gcc/config/linux.h

Now alter `gcc`'s c preprocessor's default include search path to use `/tools` only:

    cp -v gcc/Makefile.in{,.orig}
    sed -e "s@\(^CROSS_SYSTEM_HEADER_DIR =\).*@\1 /tools/include@g" \
        gcc/Makefile.in.orig > gcc/Makefile.in

We will create a dummy `limits.h` so the build will not use the one provided by the host distro:

    touch /tools/include/limits.h

    AR=ar LDFLAGS="-Wl,-rpath,/cross-tools/lib" \
      ../gcc-&gcc-version;/configure --prefix=/cross-tools \
      --build=${CLFS_HOST} --host=${CLFS_HOST} --target=${CLFS_TARGET} \
      --with-sysroot=${CLFS} --with-local-prefix=/tools --disable-nls \
      --disable-shared --with-mpfr=/cross-tools --with-gmp=/cross-tools \
      --with-ppl=/cross-tools --with-cloog=/cross-tools --without-headers \
      --with-newlib --disable-decimal-float --disable-libgomp \
      --disable-libmudflap --disable-libssp --disable-threads \
      --enable-languages=c --disable-multilib --enable-cloog-backend=isl

## The meaning of the new configure options:

`--with-sysroot=${CLFS}`

- Tells GCC to consider ${CLFS} as the root file system.

`--with-local-prefix=/tools`

- The purpose of this switch is to remove `/usr/local/include` from `gcc`'s include search path. This is not absolutely essential, however, it helps to minimize the influence of the host system.

`--disable-nls`

- This disables internationalization as i18n is not needed for the cross-compile tools.

`--without-headers`

- Disables GCC from using the target's Libc when cross compiling.

`--with-newlib`

- Tells GCC that the target libc will use 'newlib'.

`--disable-decimal-float`

- Disables support for the C decimal floating point extension.

`--disable-libgomp`

- Disables the creation of runtime libraries used by GOMP.

`--disable-libmudflap`

- Disables the creation of runtime libaries used by libmudflap.

`--disable-libssp`

- Disables the use of Stack Smashing Protection for runtime libraries.

`--disable-threads`

- This will prevent GCC from looking for the multi-thread include files, since they haven't been created for this architecture yet. GCC will be able to find the multi-thread information after the Glibc headers are created.

`--enable-languages=c`

- This option ensures that only the C compiler is built.

Continue with compiling the package:

    make all-gcc all-target-libgcc

## The meaning of the new make options:

`all-gcc all-target-libgcc`

- Compiles only the parts of GCC that are needed at this time, rather than the full package.

Install the package:

    make install-gcc install-target-libgcc

Details on this package are located in contents-gcc