Building gcc 4 for Windows 2000
March 12, 2007
Pre-built binaries of gcc 3 have long been available from MinGW and Cygwin, but I know of no source for a pre-built gcc 4 port for Windows 2000. I wanted to experiment with the TR1 functionality in gcc 4, so on October 30, 2006, I posted to the newsgroups gnu.gcc.help, gnu.g++.help, and comp.lang.c++ for suggestions on what to do. Thomas Tutone offered this idea:
Your best bet: Download DJGPP from www.delorie.com. Yes, it's old school, and it lacks the Windows headers, but it will run in a Windows DOS box, which is probably the way you use minGW anyway. DJGPP upgraded to gcc 4.10 some time ago.
I did this, and quick tests showed that it seemed to work, but they also suggested that compilations would be quite slow. I then got intriguied by this posting by FÖLDY Lajos:
There is a mini-howto for building GCC 4.1.1 for Windows (including W2K): http://gcc.gnu.org/ml/gcc-help/2006-09/msg00000.html
I'd never built gcc before, so I decided to give it a try. I ultimately succeeded, and what follows is an annotated version of the mini-howto referenced above; the howto itself was written by Marcelo Slomp -- thanks Marcelo! My annotations primarily point out places where I made mistakes. My hope is that others will be able to avoid my errors.
Annotated Build Instructions for gcc 4 for win32
Text in code font is from Slomp's howto. My annotations (such as this) are in italics.
I've written a mini-howto, containing instructions on how to build the latest gcc (currently v.4.1.1) from scratch under win32, using the msys/mingw environment. Readme.1st: apologize my imperfect english :/ I - Setting up the MSYS envirnoment II - Installing pre-built gcc binaries III - Creating the gcc host environment IV - Building and installing gcc V - Adding other build tools VI - Have fun I - SETTING UP THE MSYS ENVIRONMENT The first thing we'll need is a fully functional msys environment. You can do this quickly by just downloading and installing the msys binaries package. To keep a clean understanding, I'll assume you installed msys in the c:\ root. This way, msys is located at: c:\msys II - INSTALLING PRE-BUILT GCC BINARIES First we download and install a pre-built version of gcc 3. This will be used later to compile gcc 4. Once that's done, the gcc 3 installation can be deleted (as noted below). Now that msys is already installed, we need some version of gcc itself in order we can build the latest version. This way, download the following binary packages: from GNUWin32 project: bison flex libiconv libintl from MinGW project: win32api mingw-runtime binutils gcc-core To install its, create a new directory called 'gcc' or any other you want in the c:\ root. Then extract all files above inside this new directory. However, for libiconv and libintl, only extract the dlls inside the package's ./bin subdir and copy its to the c:\gcc\bin directory. When extracting, note that some downloads are .zip files and some are .tar.gz files. Be sure your archive extracter puts all the files in the right places. I used WinZip. WinZip put all the .zip file contents in the right place without my paying much attention, but when opening the .tar.gz files, it switched working directories to my TEMP directory, so the first time I did this I ended up extracting the contents of the .tar.gz files to the wrong places. Important: after extraction, go to c:\gcc\bin and delete m4.exe (msys uses a specific m4 build, included with msys package). After this, add the c:\gcc\bin directory to the PATH environment variable. The final installation location of gcc 4 is under mingw (see below), so when gcc 4 has been built, the search path needs to include that location, not the one for gcc 3, which is what's being referenced here. I tried to cut a corner by setting the PATH at this point only in the DOS box I happened to be using, but the PATH that needs to be set is in the msys command window, not a DOS box! So (1) don't use a DOS box for any of the following, use a msys command window, and (2) make sure that command window has the bin directory for gcc3 in its search path. To do this only in the msys window, you'll need to use a Unix sh command. I did this: # PATH=/c/gcc/bin:$PATH (The "#" is the sh (Unix shell) command prompt. If you've never used Unix before, you may want to find somebody who has to help you out with what follows. Don't worry, it's not that hard. My last stint with Unix was some 13 years ago, and I managed get things to work.) Notice that gcc-g++ package is not used here, because is not necessary a c++ compiler to build gcc. You can check if it's all right by opening msys, then typing: # gcc -v This should show some info about the pre-built gcc. It will mention something like gcc version 3.4.5. If working, we can go to the next step. III - CREATING THE GCC HOST ENVIRONMENT In order to build gcc, we need setup a host directory that will receive the new gcc binaries and files. This should be done before the build itself, because this host directory and files are used during the build process. Supposing you installed msys and the pre-built gcc under c:\, you have now the following directory structure: c:\ |---folder_1 |---folder_2 |---gcc <- here you installed the pre-built gcc |---msys <- msys environment is installed here | |---bin | |---doc | |---etc | |---home | |---mingw <- built gcc will be installed here |---folder_n Now, you'll create the host environment that will receive the new gcc build (c:\msys\mingw). To do this, you need install the mingw-runtime, binutils and win32 api. Just extract the mingw-runtime and w32api packages and extract its into the c:\msys\mingw folder. For binutils, you can either, use the binutils binaries already downloaded or build it youself. For the first option, just extract the binutils binary package into the c:\msys\mingw folder. If you want to build your own binutils binaries, please read in the next chapter about how to do this. IV - BUILDING AND INSTALLING GCC In msys environment, create a work directory, where the sources and temporary build files will be placed: # cd / # mkdir gcc-work && cd gcc-work # mkdir {build,source} The lines beginning with "#" are the actual commands to type to the msys shell. To avoid mistyping things (which I did by mistaking the curly brackets in the third line with parentheses), copy the lines and paste them into the msys window. To copy the clipboard into an msys command window, hold down the shift key while left-clicking the mouse. *** Building binutils If you want to build binutils from source, here are the instructions. Otherwise, jump this section. I used the pre-built binaries and thus skipped this section. The next thing I did was jump to "Building gcc". Download the source package copy/move it to the source folder (in the work directory - /gcc-work/source) extract it: # cd source # tar jxf binutils-2.17.tar.bz2 go to the build directory and create a temporary directory where binutils will be built: # cd ../build # mkdir binutils # cd binutils configure, compile and install binutils in the /mingw directory: # ../../source/binutils-2.17/configure --prefix=/mingw --host=mingw32 --target=mingw32 --program-prefix="" --with-lib-path=/mingw/mingw32/lib:/mingw/lib:/usr/local/lib:/lib:/usr/lib --with-gcc --with-gnu-as --with-gnu-ld --disable-nls --disable-shared # make CFLAGS="-O2 -D__USE_CRTIMP -fno-exceptions" LDFLAGS=-s flags are self-explanatory, but you can get info about configuration flags by running the configure --help command, but is important to pay attention in the --with-lib-path flag. it determinate where utils such ld will find for libraries. as we are installing under /mingw directory, the first 2 paths must point to this prefix. if you want to change the prefix for some reason, do not forgot to change this! other paths are required when searching for libs into the msys environment (if you plan to use msys later). this is a time to a coffe or a beer... :) the build process will take several minutes. after this, just install it as the usual: # make install *** Building gcc The most wanted moment has come: the gcc build itself. don't worry, nothing surreal or cabalistic here. :) First, download the gcc source packages - here, only c and c++ languages will be installed, but you can obviously download other packages and modify the command lines if you want to install other languages, such ada and java. Read about gcc configuration flags. Link to gcc-core. Link to gcc-g++. copy/move its to the source directory, then extract: # cd /gcc-work/source # tar jxf gcc-core-4.1.1.tar.bz2 # tar jxf gcc-g++-4.1.1.tar.bz2 go to the build directory and create a temporary directory where gcc will be built: # cd ../build # mkdir gcc # cd gcc configuring: # ../../source/gcc-4.1.1/configure --prefix=/mingw --host=mingw32 --target=mingw32 --program-prefix="" --with-as=/mingw/bin/as.exe --with-ld=/mingw/bin/ld.exe --with-gcc --with-gnu-ld --with-gnu-as --enable-threads --disable-nls --enable-languages=c,c++ --disable-win32-registry --disable-shared --without-x --enable-interpreter --enable-hash-synchronization --enable-libstdcxx-debug Copy and paste is definitely your friend for this command and the next one. Just be sure to edit out the line breaks after making the copy. Everything from the "../.." at the beginning of the command to the "-debug" at the end must be on a single line. # make CFLAGS="-O2 -fomit-frame-pointer" CXXFLAGS="-mthreads -fno-omit-frame-pointer -O2" LDFLAGS=-s bootstrap2 the bootstrap process is recommended in the gcc documentation, and will produce a compiler more optimized than other that was not built in this way. during the bootstrap, a compiler will be generated, that will compile another compiler, that will compile another compiler and so on. the bootstrap2 command instructs to generate 2 pre-compilers before the final version. obviously this process consumes much more build time, but the final result is better. you can supress the bootstrap2 target in the make line, if you don't want a bootstrapped compiler. now, relax. drink a coffe, or lots of. this operation will take some long time to complete. On my machine (a five-year-old IBM laptop), this step took several hours. after this, the happiness is complete: install your brand new gcc :) # make install your fresh new gcc build is now installed and ready to use. you can then delete the work directory, as well the pre-built gcc directory. don't forgot to add to the PATH variable the new gcc's bin directory. This is as far as I went, so I have no comments on the rest of the howto. V - ADDING OTHER BUILD TOOLS Now that the new gcc binaries are already installed, we can add other development tools to the gcc box. here, presenting gdb and make. - installing gdb: download the precompiled binaries of gdb: Link to gdb 6.3-2. Install the package in the c:\msys\mingw directory i have built gdb 6.5 with success, however it does not have native support for the pe executables. this way, the best alternative is to install the binary package above. - installing make: notice that 'make' is already included with the msys package. however, if you do not plain to work with msys later but want to use makefiles, you need your own make binary. you can install the precompiled binary package by extracting the following package into the c:\msys\mingw folder: http://prdownloads.sourceforge.net/mingw/mingw32-make-3.81-1.tar.gz?download or build it youself. to do this, download the source package: make 3.81 source: http://ftp.gnu.org/gnu/make/make-3.81.tar.bz2 copy it to the source folder in msys, then extract it: # cd /gcc-work/source # tar jxf make-3.81.tar.bz2 go to the /gcc-work/build and create a make's build directory: # cd ../build && mkdir make # cd make build and install it: # ../../source/make-3.81/configure --prefix=/mingw --target=mingw32 --program-prefix="" --disable-nls --disable-dependency-tracking # make CFLAGS=-O2 LDFLAGS=-s # make install VI - HAVE FUN As the title says, have fun with your latest version of gcc under win32! Builds made with success in WinXP and Win2000, but these instructions should work in other Win32 systems, such Win98/ME/NT/2003/Vista. Recent snapshots for gcc 4.1 were built with success using the same approach and steps.