Total Pageviews

Tuesday, October 15, 2013


Building GCC from source


A request was made to upgrade GCC to the latest version. Since the current version 4.8.1 was not in the repo. I decided to build it from scratch. Speaking of scratch, I used the instructions from LFS, which I had prevoiusly used to build GCC and four times. I downloaded and built several packages that were required for the testing of GCC once it was built:
tcl8.6.1-src.tar.gz
expect5.45.tar.gz
dejagnu-1.5.1.tar.gz
 
Building required version of TCL:
cd unix &&
./configure --prefix=/usr           \
            --without-tzdata        \
            --mandir=/usr/share/man \
            $([ $(uname -m) = x86_64 ] && echo --enable-64bit) &&
make &&

sed -e "s@^\(TCL_SRC_DIR='\).*@\1/usr/include'@" \
    -e "/TCL_B/s@='\(-L\)\?.*unix@='\1/usr/lib@" \
    -i tclConfig.sh
Installing TCL:
make install &&
make install-private-headers &&
ln -v -sf tclsh8.6 /usr/bin/tclsh &&
chmod -v 755 /usr/lib/libtcl8.6.so
Building Expect:
./configure --prefix=/usr       \
            --with-tcl=/usr/lib \
            --enable-shared     \
            --with-tclinclude=/usr/include &&
make
Installing Expect:
make install &&
ln -svf expect5.45/libexpect5.45.so /usr/lib
Building Dejagnu:
./configure --prefix=/usr &&
makeinfo --html --no-split -o doc/dejagnu.html doc/dejagnu.texi &&
makeinfo --plaintext       -o doc/dejagnu.txt  doc/dejagnu.texi
Installing Dejagnu:
make install &&
install -v -dm755   /usr/share/doc/dejagnu-1.5.1 &&
install -v -m644    doc/dejagnu.{html,txt} \
                    /usr/share/doc/dejagnu-1.5.1
Again, the three previous packages are for testing of the GCC installation, but with a package this large, it is wise to test it. Now on to the GCC build itself:
tar xvf gcc-4.8.1.tar.bz2
cd gcc-4.8.1
GCC wants to be built in a separate directory:
sed -i 's/\(install.*:\) install-.*recursive/\1/' libffi/Makefile.in         &&
sed -i 's/\(install-data-am:\).*/\1/'             libffi/include/Makefile.in &&
sed -i 's/install_to_$(INSTALL_DEST) //'          libiberty/Makefile.in      &&
sed -i 's@\./fixinc\.sh@-c true@'                 gcc/Makefile.in            &&

case `uname -m` in
      i?86) sed -i 's/^T_CFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in ;;
esac &&

mkdir ../gcc-build &&
cd    ../gcc-build &&

../gcc-4.8.1/configure          \
    --prefix=/usr               \
    --libdir=/usr/lib           \
    --libexecdir=/usr/lib       \
    --enable-shared             \
    --enable-threads=posix      \
    --enable-__cxa_atexit       \
    --disable-multilib          \
    --disable-bootstrap         \
    --disable-install-libiberty \
    --with-system-zlib          \
    --enable-clocale=gnu        \
    --enable-lto                \
    --enable-languages=c,c++,fortran,go,java,objc,obj-c++ &&
make

Now to test the make. Warning, this check may take several hours:
ulimit -s 32768 &&
make -k check   &&

../gcc-4.8.1/contrib/test_summary
Now become root and install the build:
make install &&

ln -v -sf ../usr/bin/cpp /lib &&
ln -v -sf gcc /usr/bin/cc     &&

chown -v -R root:root \
    /usr/lib/gcc/*linux-gnu/4.8.1/include{,-fixed} \
    /usr/lib/gcc/*linux-gnu/4.8.1/ada{lib,include}