Homepage: webng.com/linuxhelp (Updated June 2, 2008)
The March 11, 2008 release of gcc, version 4.3.0, was a shock. The compilation of the Fortran compiler failed. The compilation of the Win32 (mingw32) cross compiler failed. I thought this was incredibly shoddy for a major release. I imagined people having significant problems figuring what was going on, so, I wrote an article detailing how things should work using gcc, version 4.2.3. Well, it turned out that both of these problems go away, if you do the build in directories separate from the sources. Since this is non-traditional, it might have been nice for people to point out that the build will not work, in certain cases, unless you build in separate directories, instead of them just saying that building in separate directories is recommended. For projects like gcc, compiling in separate directories is actually a very good idea. This guide follows the project outlined in the previous article, replacing version 4.2.3, with version 4.3.0. Some things, like the Windows cross compilers, no longer compile. Some things, like the Windows Java compiler, didn't fully work with 4.2.3. Although the Java compiler did compile, the runtime libraries, and programs like the Java Virtual Machine, gij, did not. To compile these, one needs to add the configuration option --enable-libgcj, however, for 4.2.3, the compilation fails once this option is added. It succeeds for 4.3.0. This guide includes the language ADA from the beginning, rather than tacking it on at the end, as before. The Windows ADA compiler and cross compiler did not compile (in either version). The compilations in the project that failed, for 4.3.0, have been marked in red. This is an outline of what we will do (and what worked): (1) compile a C,ADA,C++,Java,Fortran,ObjC,ObjC++,treelang compiler for Linux (2) compile a C cross-compiler for Linux (needed to compile system libraries) (3) compile a C,ADA,C++,Java,Fortran,ObjC,ObjC++ cross-compiler for Linux (4) compile a C,ADA,C++,Java,Fortran,ObjC,ObjC++ compiler for Windows (5) compile a C,ADA,C++,Java,Fortran cross-compiler for Windows Compiler (1) runs on a Linux box and produces binaries that will run under Linux Compiler (3) runs on a Linux box and produces binaries that will run under Windows Compiler (4) runs on a Windows box and produces binaries that will run under Windows Compiler (5) runs on a Windows box and produces binaries that will run under Linux (6) How to use the Cross-Compiler(s) you built in step 3. (7) Using the Compiler(s) you built in step 1. (8) General Remarks. Make sure that you have the following programs and packages installed. For SuSE 10.0: gcc libgcc glibc glibc-devel glib2 glib2-devel ncurses ncurses-devel gcc-c++ libstdc++ libstdc++-devel. For Debian: emacs21 bzip2 gcc libncurses5-dev libc6-dev libc6-dev-i386 lib32gcc1 g++ libstdc++6-4.1-dev (and gnat if you want ADA). You will need the autotools (autoconf, automake, etc). You will need at least 7 Gigabytes of free space. The compilation of part (1) took nearly 4 hours. The rest took just under 2 hours. Download the following to the directory /gcc/: binutils-2.18.50.tar.bz2 (16M) gcc-4.3.0.tar.bz2 (57M) from www.gnu.org/ You can also obtain gcc-4.3.0.tar.bz2 in smaller pieces. Note, that in order to compile the ADA compiler, you need a working ADA compiler (GNAT 3.14, or later) on your system. If your distribution does not come with such, an (i686 binary) gnat compiler can be found here: gnat-3.15p-i686-pc-redhat71-gnu-bin.tar.bz2 (12M) from linuxfromscratch.org The i686 ADA compiler binaries from this package run on AMD x86_64 (as long as you have installed the necessary 32-bit libraries (only needs libc.so.6)). I have not checked that the 64-bit compilation of gcc works, when compiling with these i686 binaries, as it was just as easy (using Debian Sid (testing)) to install the 64-bit x86_64 packages gnat, gnat-4.1, gnat-4.1-base & libgnat-4.1. It should be mentioned that gnat-gpl-2007-i686-gnu-linux-libc2.3-bin.tar.gz (75M), the GNAT complier from libre.adacore.com, does not compile gcc-4.2.3 at all and gcc-4.3.0 does not compile from a directory outside the sources. You will probably want the Eclipse Java compiler, so that gcj will be able to parse .java source files: ecj-latest.jar from sourceware.org You need the following Win32 API and runtime files: w32api-3.11-src.tar.gz mingw-runtime-3.14-src.tar.gz from www.mingw.org By the way, mingw.org exists to mislead and hinder, rather than help. It is best to upgrade your version of gmp and mpfr: mpfr-2.3.1.tar.bz2 from www.mpfr.org gmp-4.2.2.tar.bz2 from gmplib.org For Debian (testing) it suffices to install libgmp3c2 libgmp3-dev libgmpxx4 libmpfr1 & libmpfr-dev (mpfr 2.2.1 is considered a bit buggy, but acceptable). It is assumed that you are the root user. (1) Compile a C,ADA,C++,Java,Fortran,ObjC,ObjC++,treelang compiler for Linux. We do this to have an up-to-date compiler (actually, a collection of compilers) with which to compile the cross-compilers of steps 2 and 3. Beginning with an older compiler can lead to some complications. I did the build on an SuSE 10.0 i686 Linux box. This time, I did not check how well the installed compiler (version 4.0.2) worked. Save all the packages to the directory /gcc/. Go there and unpack everything: mkdir /gcc; cd /gcc for a in *.tar.*; do tar xf $a; done (unpacks everything) mkdir binutils-linux-linux binutils-linux-win32 binutils-win32-win32 binutils-win32-linux cd /gcc/binutils-linux-linux /gcc/binutils-2.18.50/configure make make install cd /gcc; mkdir gmp-linux gmp-win32 cd /gcc/gmp-linux /gcc/gmp-4.2.2/configure make make install The make install script runs the command ldconfig -n /usr/local/lib. It turns out that this is not sufficient, you need to run ldconfig (as root). This updates the ld.so.cache file so that it knows to use the newly installed gmp library, rather than some older, pre-existing, gmp library. In particular, you want the compilation of the mpfr library to use the correct version of gmp. ldconfig cd /gcc; mkdir mpfr-linux mpfr-win32 cd /gcc/mpfr-linux /gcc/mpfr-2.3.1/configure make make install Similarly, if you have some pre-existing version of the mpfr library, then you need to run ldconfig again. You should probably run ldconfig again, in any case, just to be on the safe side. ldconfig cd /gcc; mkdir gcc-linux-linux gcc-linux-win32 gcc-win32-win32 gcc-win32-linux mv ecj-latest.jar /gcc/gcc-4.3.0/ecj.jar (needed to parse .java source files) Now we deal with the ADA preliminaries. If you have no interest in ADA, or are doing the compilation on a Debian box, which comes with an ADA compiler, then ignore the instruction in light magenta and continue using your currently installed compiler for the rest of part one. tar xf gnat-3.15p-i686-pc-redhat71-gnu-bin.tar.bz2 cd /gcc/gnat-3.15p-i686-pc-linux-gnu-bin Run the script doconfig entering /gcc/gnat for the installation directory. Then run doinstall. ./doconfig; ./doinstall Now set your PATH variable so that you use the ADA-understanding compiler that you have just installed. export PATH=/gcc/gnat/bin:$PATH; echo $PATH Now compile your new native Linux version 4.3.0 compiler. cd /gcc/gcc-linux-linux /gcc/gcc-4.3.0/configure --enable-languages=c,ada,c++,fortran,java,objc,obj-c++,treelang make make install Don't forget to remove the ada tag if you do not want ADA. So that version 4.3.0 does not interfere with your older installed compiler, it will be installed in /usr/local/. To use it, instead of the installed compiler, you need to have /usr/local/bin first on your path. You arrange this with: export PATH=/usr/local/bin:$PATH; echo $PATH So that the compiler binaries find their libraries, you need to make sure that /usr/local/lib /usr/local/lib64 and /usr/local/lib32 (on separate lines) are listed in your /etc/ld.so.conf file. And, don't forget to run ldconfig after editing the file. (2) Compile a C cross-compiler for Linux. This C cross-compiler will run on your Linux system and create binaries, from Linux C code, that will run on a Windows system. We need to use this cross-compiler to compile the Win32 API and runtime libraries. cd /gcc/binutils-linux-win32 /gcc/binutils-2.18.50/configure --target=i686-pc-mingw32 make make install cp -r /gcc/{mingw-runtime-3.14,w32api-3.11}/include /usr/local/i686-pc-mingw32 ln -s w32api-3.11 w32api cd /gcc/gcc-linux-win32/ /gcc/gcc-4.3.0/configure --target=i686-pc-mingw32 \ ./configure --with-headers=/usr/local/i686-pc-mingw32/include \ ./configure --enable-languages=c make make install cd /gcc/w32api-3.11 ./configure --build=i686-pc-linux-gnu \ ./configure --host=i686-pc-mingw32 \ ./configure --prefix=/usr/local/i686-pc-mingw32 make make install cd /gcc/mingw-runtime-3.14 ./configure --build=i686-pc-linux-gnu \ ./configure --host=i686-pc-mingw32 \ ./configure --prefix=/usr/local/i686-pc-mingw32 make make install The files in /usr/local/i686-pc-mingw32, will be used for cross-compiling Linux programs to run on Windows. (3) Compile a C,ADA,C++,Java,Fortran,ObjC,ObjC++ cross-compiler for Linux. The C cross-compiler is compiled again, along with the other languages. This cross-compiler is run on your Linux box and compiles binaries, from Linux code, that will run on a Windows system. That is, it compiles Linux source code, so that the resulting binaries will run, unaltered, on Windows. cd /gcc/gcc-linux-win32 make distclean /gcc/gcc-4.3.0/configure --target=i686-pc-mingw32 \ ./configure --with-headers=/usr/local/i686-pc-mingw32/include \ ./configure --enable-libgcj \ ./configure --enable-libada \ ./configure --enable-languages=c,ada,c++,fortran,java,objc,obj-c++ make make install Don't forget to remove the ada tag and --enable-libada option, if you do not want ADA. Now you need to run ldconfig to tell all the other programs where to find the necessary libraries: ldconfig (4) Compile a C,C++,Java,Fortran,ObjC,ObjC++ compiler for Windows. This compiler is a native Windows compiler. That is, it runs on a Windows box. It compiles Windows source code and the resulting binaries will run on Windows. When compiling C++, this compiler will do the same job as Visual C++ or C++ Builder. export CC="i686-pc-mingw32-gcc"; echo $CC mkdir /mingw cp -r /usr/local/i686-pc-mingw32/{include,lib} /mingw The configure script expects to find the system headers and libraries in /mingw, so we have arranged for them to be there. cd /gcc/binutils-win32-win32 /gcc/binutils-2.18.50/configure --build=i686-pc-linux-gnu \ ./configure --host=i686-pc-mingw32 \ ./configure --target=i686-pc-mingw32 \ ./configure --prefix=/mingw make make install cd /gcc/gmp-win32 /gcc/gmp-4.2.2/configure --build=i686-pc-linux-gnu \ ./configure --host=i686-pc-mingw32 \ ./configure --prefix=/mingw make make install cd /gcc/mpfr-win32 /gcc/mpfr-2.3.1/configure --build=i686-pc-linux-gnu \ ./configure --host=i686-pc-mingw32 \ ./configure --prefix=/mingw make make install Now we compile the native Windows compilers (the compilation of the ADA compiler fails). cd /gcc/gcc-win32-win32 /gcc/gcc-4.3.0/configure --build=i686-pc-linux-gnu \ ./configure --target=i686-pc-mingw32 \ ./configure --host=i686-pc-mingw32 \ ./configure --enable-languages=c,c++,fortran,java,objc,obj-c++ \ ./configure --enable-libgcj \ ./configure --prefix=/mingw make make install You need the option --enable-libgcj to compile the Java libraries and some programs, like the Java Virtual Machine, gij. This option causes the compilation of gcc, 4.2.3 version, to fail. So, for a fully working Windows Java compiler, you should use version 4.3.0 (or patch version 4.2.3). The files that end up in /mingw will be transfered to C:\mingw on your Windows box. (5) Compile a C,C++,Java,Fortran cross-compiler for Windows. This compiler runs on a Windows box. It compiles Windows source code and the resulting binaries will run unaltered on Linux. Ever wanted to compile VirtualDub so that it runs on Linux? This avoids having to port the source code. Well, the following compiles for version 4.2.3, but not for 4.3.0. Fix needed. cd /gcc/binutils-win32-linux /gcc/binutils-2.18.50/configure --build=i686-pc-linux-gnu \ ./configure --host=i686-pc-mingw32 \ ./configure --target=i686-pc-linux-gnu \ ./configure --prefix=/mingw make make install cd /gcc/gcc-win32-linux /gcc/gcc-4.3.0/configure --build=i686-pc-linux-gnu \ ./configure --host=i686-pc-mingw32 \ ./configure --target=i686-pc-linux-gnu \ ./configure --enable-languages=c,c++,fortran,java \ ./configure --disable-libgomp \ ./configure --prefix=/mingw make make install Now you copy everything in /mingw to C:\mingw on a Windows box and start compiling there. After you have compiled your Windows program, say VirtualDub, on your Windows computer, you transfer the resulting executable back to Linux and run it there. Of course, for most compilations you will also need to compile a version of the make program for Windows. You can compile the make program for Windows, on your Linux box, by using the cross-compiler you built in step (3). (6) How to use the cross-compiler you built in step 3. As a quick example of how to use the cross-compiler you built in step 3. Download the Linux make program to /gcc/: make-3.81.tar.bz2 from www.gnu.org/ cd /gcc; tar xf make-3.81.tar.bz2; cd /gcc/make-3.81 ./configure 'CC=i686-pc-mingw32-gcc' \ ./configure --build=i686-pc-linux-gnu \ ./configure --host=i686-pc-mingw32 \ ./configure --prefix=/mingw make make install Now copy make.exe to C:\mingw\bin on your Windows box. Easy, isn't it? (7) Using the Compiler you built in step 1. The first thing to note, is that the "obvious" gcc program.f and gcc program.java do not work. The Fortran front-end is gfortran. It is used as gfortran program.f gcc -lgfortranbegin -lgfortran program.f also works. The Java front-end is gcj. The following incantations can be used to compile Java code: gcj --main=program program.java (compile to C++ object file, a.out) ./a.out (execute the C++ object file, a.out) gcj -C program.java (compile to Java bytecode file, program.class) gij program (execute the bytecode, program.class, with the GCC Java Virtual Machine) To compile ObjC code, use gcc -lobjc program.m If you mix ObjC code and C++ code in the same files, you call the resulting mixture, ObjC++ code. It is apparently compiled in the same way as ObjC code. You are totally on your own for treelang. To compile ADA code, use gnat make program.adb which does the following: gcc -c program.adb gnatbind -x program.ali gnatlink program.ali -o program A common cause of frustration, is that gcc refuses to compile C-programs which use the mathematics functions, cos, sin, pow, etc. Unfortunately, the error messages do not point to the source of the problem, which is that you have not instructed gcc to link in the mathematics library, libm. You do this by adding -lm to the command, for example: gcc -lm program-using-mathematics-functions.c (8) General Remarks. Since it is difficult to cut and paste many of the above commands, here is the script I used for the project. If you are building on an older PC, replace i686 by i386, everywhere in the above. For AMD-64, the script config.guess, gives x86_64-unknown-linux-gnu. It seems you can put any word in place of unknown, or no word at all. So configure with something like: ./configure --build=x86_64-linux-gnu \ ./configure --host=x86_64-linux-gnu \ ./configure --target=i686-pc-mingw32 I actually used x86_64-pc-linux-gnu and am assuming that x86_64-linux-gnu will work. If you have a multilib system, like Debian, you may want to compile both 32-bit and 64-bit libraries for gcc. You need to have all the standard 32-bit libraries installed. On Debian, make sure you have the links: ln -s /lib /lib64 ln -s /emul/ia32-linux/lib /lib32 ln -s /usr/lib /usr/lib64 ln -s /emul/ia32-linux/usr/lib /usr/lib32 The compilation fails for gcc-4.2.3, unless you use the --disable-multilib configuration option, or you create the (secret) link: ln -s /emul/ia32-linux/lib /usr/local/x86_64-pc-linux-gnu/lib/32 For gcc-4.3.0 the above link appears to be unnecessary (4.3.0 has other problems). At some point I will write up a multilib Debian x86_64 version of this guide. If at any time you need to know which compiler you are using, just enter the command: gcc -v By the way, if you wish to both watch, and record, the output of the compilation, you can do this: ./configure 2>&1 | tee log.configure make 2>&1 | tee log.make make install 2>&1 | tee log.install If you have any suggestions or advice, please leave a note at: http://www.phoronix.com/forums/showthread.php?t=8411 |