I am trying to build gcc 4.7.2 using a custom prefix $PREFIX
I have built and installed all the prerequisites into my prefix location, and then successfully configured, built and installed gcc.
The problem that I now have is that $PREFIX
is not in the library search path, and therefore the shared libraries cannot be found.
$PREFIX/bin $ ./g++ ~/main.cpp $PREFIX/libexec/gcc/x86_64-suse-linux/4.7.2/cc1plus: error while loading shared libraries: libcloog-isl.so.1: cannot open shared object file: No such file or directory
What works, but isn’t ideal
If I export LD_LIBRARY_PATH=$PREFIX/lib
then it works, but I’m looking for something which works without having to set environment variables.
If I use patchelf
to set the RPATH
on all the gcc
binaries then it also works; however this involves searching out all elf binaries and iterating over them calling patchelf
, I would rather have something more permanent.
What I think would be ideal for my purposes
So I’m hoping there is a way to have -Wl,-rpath,$PREFIX/lib
passed to make during the build process.
Since I know the paths won’t need to be changed this seems like the most robust solution, and can be also be used for when we build the next gcc version.
Is configuring the build process to hard code the RPATH
possible?
What I have tried, but doesn’t work
Setting LDFLAGS_FOR_TARGET
prior to calling configure
:
All of these fail:
export LDFLAGS_FOR_TARGET="-L$PREFIX/lib -R$PREFIX/lib" export LDFLAGS_FOR_TARGET="-L$PREFIX/lib" export LDFLAGS_FOR_TARGET="-L$PREFIX/lib -Wl,-rpath,$PREFIX/lib"
Setting LDFLAGS
prior to calling configure
:
export LDFLAGS="-L$PREFIX/lib -Wl,-rpath,$PREFIX/lib"
In any event I worry that these will override any of the LDFLAGS
gcc would have had, so I’m not sure these are a viable option even if they could be made to work?
My configure line
For completeness here is the line I pass to configure:
./configure --prefix=$PREFIX --build=x86_64-suse-linux --with-pkgversion='SIG build 12/10/2012' --disable-multilib --enable-cloog-backend=isl --with-mpc=$PREFIX --with-mpfr=$PREFIX --with-gmp=$PREFIX --with-cloog=$PREFIX --with-ppl=$PREFIX --with-gxx-include-dir=$PREFIX/include/c++/4.7.2
Advertisement
Answer
I’ve found that copying the source directories for gmp, mpfr, mpc, isl, cloog, etc. into the top level gcc source directory (or using symbolic links with the same name) works everywhere. This is in fact the preferred way.
You need to copy (or link) to those source directory names without the version numbers for this to work.
The compilers do not need LD_LIBRARY_PATH (although running applications built with the compilers will need an LD_LIBRARY_PATH to the $PREFIX/lib64 or something like that – but that’s different)
Start in a source directory where you’ll keep all your sources. In this source directory you have your gcc directory either by unpacking a tarball or svn… I use subversion.
Also in this top level directory you have, say, the following source tarballs:
gmp-5.1.0.tar.bz2 mpfr-3.1.1.tar.bz2 mpc-1.0.1.tar.gz isl-0.11.1.tar.bz2 cloog-0.18.0.tar.gz
I just download these and update to the latest tarballs periodically.
In script form:
# Either: svn checkout svn://gcc.gnu.org/svn/gcc/trunk gcc_work # Or: bunzip -c gcc-4.8.0.tar.bz2 | tar -xvf - mv gcc-4.8.0 gcc_work # Uncompress sources.. (This will produce version numbered directories). bunzip -c gmp-5.1.0.tar.bz2 | tar -xvf - bunzip -c mpfr-3.1.1.tar.bz2 | tar -xvf - gunzip -c mpc-1.0.1.tar.gz | tar -xvf - bunzip -c isl-0.11.1.tar.bz2 | tar -xvf - gunzip -c cloog-0.18.0.tar.gz | tar -xvf - # Link outside source directories into the top level gcc directory. cd gcc_work ln -s ../gmp-5.1.0 gmp ln -s ../mpfr-3.1.1 mpfr ln -s ../mpc-1.0.1 mpc ln -s ../isl-0.11.1 isl ln -s ../cloog-0.18.0 cloog # Get out of the gcc working directory and create a build directory. I call mine obj_work. # I configure the gcc binary and other outputs to be bin_work in the top level directory. Your choice. But I have this: # home/ed/projects # home/ed/projects/gcc_work # home/ed/projects/obj_work # home/ed/projects/bin_work # home/ed/projects/gmp-5.1.0 # home/ed/projects/mpfr-3.1.1 # home/ed/projects/mpc-1.0.1 # home/ed/projects/isl-0.11.1 # home/ed/projects/cloog-0.18.0 mkdir obj_work cd obj_work ../gcc_work/configure --prefix=../bin_work <other options> # Your <other options> shouldn't need to involve anything about gmp, mpfr, mpc, isl, cloog. # The gcc build system will find the directories you linked, # then configure and compile the needed libraries with the necessary flags and such. # Good luck.