The default gcc (4.6.x) on Ubuntu 12.04 is quite old, especially given the quick advance in C++11 capabilities in gcc 4.7 and 4.8 (and, importantly, their respective libstdc++ libraries).

The LLVM project has recently decided (and implemented, earlier this week) to set gcc 4.7 and Clang 3.1 as the minimal versions LLVM & Clang themselves would build with, in order to be able to use C++11 capabilities in the implementation. Therefore, if you want to build trunk LLVM & Clang on Ubuntu 12.04, you need a newer gcc (even if you use Clang to self-build, still libstdc++ version 4.7 or later is required).

Luckily, building a new gcc and installing it locally (to not mess with the system installation) is fairly easy. Here's a short sequences of steps.

First, create a place to hold the installation, like $HOME/install/gcc-4.8.2.

Install some dependencies needed to build gcc:

$ sudo apt-get install libmpfr-dev libgmp3-dev libmpc-dev flex bison

Then, get a gcc 4.8 tarball and unpack it:

$ wget http://ftp.gnu.org/gnu/gcc/gcc-4.8.2/gcc-4.8.2.tar.bz2
$ bunzip2  gcc-4.8.2.tar.bz2
$ tar xvf gcc-4.8.2.tar

Enter the untarred gcc directory:

$ cd gcc-4.8.2/
$ mkdir build
$ cd build

Now, configure and build:

$ ../configure --disable-checking --enable-languages=c,c++ \
  --enable-multiarch --enable-shared --enable-threads=posix \
  --program-suffix=4.8 --with-gmp=/usr/local/lib --with-mpc=/usr/lib \
  --with-mpfr=/usr/lib --without-included-gettext --with-system-zlib \
  --with-tune=generic \
  --prefix=$HOME/install/gcc-4.8.2
$ make -j8
$ make install

This places an installation of gcc 4.8.2 in $HOME/install/gcc-4.8.2. For example, you should be able to see this:

$ cd $HOME/install/gcc-4.8.2
$ find . -name gcc4.8
./bin/gcc4.8

That's it. You can try it:

$ cd /tmp
$ cat > test.c
int main() { return 42; }
$ $HOME/install/gcc-4.8.2/bin/gcc4.8 test.c
$ ./a.out; echo $?
42

You can also run gcc4.8 with the -### flag to see the exact compilation steps and notice which libraries get picked up, etc. (note that to see -lstdc++ a C++ source compiled with g++4.8 is needed instead).

As a bonus, trunk LLVM & Clang can be now build by passing this gcc to the configure script (the exact same idea works with the CMake-based configuration flow too):

$ CC=$HOME/install/gcc-4.8.2/bin/gcc4.8 \
  CXX=$HOME/install/gcc-4.8.2/bin/g++4.8 \
  ../../llvm-src/configure

Comments

comments powered by Disqus