Compiling GCC 4.6 Nightlies on Windows with MinGW and MSYS

Step 1:

Download these packages

http://nuwen.net/files/mingw/sources-6.6.7z
http://nuwen.net/files/mingw/msys-6.3.7z

You can find more up-to-date versions here:
http://nuwen.net/mingw.html

The above packages will get you some of the dependencies of compiling gcc on windows plus a whole bunch of other things that aren’t needed, but I found it easier to use the stuff there.

Also, you should download the latest gcc-core and gcc-g++ packages from the LATEST-4.6 folder on one of the GCC mirrors, I use http://mirrorpool.in/Gcc/snapshots/LATEST-4.6/, Extract them so that the tars are in the sources folder with the rest of the packages.

2. Create a directory
c:/temp/gcc

3. Extract sources and msys to anywhere.

4. Download the latest flex and extract it to where you extracted msys so that flex.exe is in msys/bin.
http://sourceforge.net/projects/mingw/files_beta/MSYS/flex/

5. Do the same for Bison
http://sourceforge.net/projects/mingw/files_beta/MSYS/bison/

6. Copy this script and save it in the sources folder from earlier as gcc-build.sh

#!/bin/sh

# Ensure that mingw-runtime and w32api exist.
test -d /c/temp/gcc/mingw-runtime || { echo /c/temp/gcc/mingw-runtime does not exist. ; exit; }
test -d /c/temp/gcc/w32api || { echo /c/temp/gcc/w32api does not exist. ; exit; }

# Extract vanilla sources.

tar -C /c/temp/gcc -xf $2

tar -C /c/temp/gcc -xf $3
tar -C /c/temp/gcc -xf gmp-5.0.1.tar
tar -C /c/temp/gcc -xf mpfr-3.0.0.tar
patch -Z -d /c/temp/gcc/mpfr-3.0.0 -p1 < mpfr-3.0.0.patch
tar -C /c/temp/gcc -xf mpc-0.8.2.tar

# Arrange vanilla sources.
cd /c/temp/gcc
mv $1 src
mv gmp-5.0.1 src/gmp
mv mpfr-3.0.0 src/mpfr
mv mpc-0.8.2 src/mpc

# Copy mingw-runtime and w32api.
mkdir -p /include
rm -rf /mingw
mkdir /mingw
cp -r mingw-runtime/* /mingw
cp -r w32api/* /mingw

# Configure.
mkdir build dest
cd build
../src/configure –prefix=/c/temp/gcc/dest –enable-languages=c,c++ –with-arch=i686 –with-tune=generic –disable-libstdcxx-pch –disable-nls –disable-shared –disable-sjlj-exceptions –disable-win32-registry –enable-checking=release

# –disable-libstdcxx-pch : I don’t use this, and it takes up a ton of space.
# –disable-nls : I don’t want Native Language Support.
# –disable-shared : I don’t want DLLs.
# –disable-sjlj-exceptions : I don’t want SJLJ, I want DW2.
# –disable-win32-registry : I don’t want this abomination.
# –enable-checking=release : I don’t want expensive checking if this came from SVN or a snapshot.
# –enable-lto : LTO is not enabled by default for MinGW, but can be explicitly requested.

# Build and install.
make bootstrap install “CFLAGS=-g0 -Os -fomit-frame-pointer” “CXXFLAGS=-g0 -O3 -fomit-frame-pointer -mthreads” “CFLAGS_FOR_TARGET=-g0 -Os -fomit-frame-pointer” “CXXFLAGS_FOR_TARGET=-g0 -O3 -fomit-frame-pointer -mthreads” “BOOT_CFLAGS=-g0 -Os -fomit-frame-pointer” “BOOT_CXXFLAGS=-g0 -O3 -fomit-frame-pointer -mthreads” || { echo EPIC FAIL ; exit; }

The above script is a modified version of what came from nuwen.net.

7. Launch your msys shell from the msys directory you created earlier and navigate to your sources-6.6 directory and execute the following scripts:

w32api-3.14.sh
and
mingw-runtime-3.18.sh

8. Now run the gcc-build.sh script like this (assuming you have the same nightly as I do)

./gcc-build.sh gcc-4.6-20101016 gcc-core-4.6-20101016.tar "gcc-g++-4.6-20101016.tar"

The 1st parameter is the nightly build version, the 2nd parameter is the name of the gcc core archive. the 3rd is the name of the g++ archive.

9. This should fail with a message like this:

make[3]: Circular s-tm-texi tmp-tm.texi
/bin/sh ../../src/gcc/../move-if-change tmp-tm.texi tm.texi

Verify that you have permission to grant a GFDL license for all
new text in tm.texi, then copy it to ../../src/gcc/doc/tm.texi.
make[3]: *** [s-tm-texi] Error 1
make[3]: Leaving directory `/c/temp/gcc/build/gcc'

10. Now you need to navigate to
C:\temp\gcc\build\gcc\
and copy
tm.texi
to
C:\temp\gcc\src\gcc\doc\

11. Now you need to navigate to
C:\temp\gcc\src\lto-plugin\

And modify the following file:
lto-plugin.c
Modify line 44 to wrap it in a #ifndef like this:


#ifndef WIN32
#include
#endif

Then navigate to what will now be line 461 and do the same thing:


#ifndef WIN32
check (WIFEXITED (status) && WEXITSTATUS (status) == 0, LDPL_FATAL,
"lto-wrapper failed");
#endif

Now save the file and move on to the next step.

12. Now run the 2nd script (I saved it in the sources-6.6 folder as gcc-build2.sh)
#!/bin/sh

# Arrange vanilla sources.
cd /c/temp/gcc

cd build
# Build and install.
make bootstrap install "CFLAGS=-g0 -Os -fomit-frame-pointer" "CXXFLAGS=-g0 -O3 -fomit-frame-pointer -mthreads" "CFLAGS_FOR_TARGET=-g0 -Os -fomit-frame-pointer" "CXXFLAGS_FOR_TARGET=-g0 -O3 -fomit-frame-pointer -mthreads" "BOOT_CFLAGS=-g0 -Os -fomit-frame-pointer" "BOOT_CXXFLAGS=-g0 -O3 -fomit-frame-pointer -mthreads" || { echo EPIC FAIL ; exit; }

# Cleanup.
rm -rf /mingw
cd /c/temp/gcc/dest
rm -rf share
cd bin
rm c++.exe gccbug i686-pc-mingw32-*
cp gcc.exe cc.exe
cd ..
find -name "*.exe" -type f -print -exec strip -s {} ";"

13. Now everything should work!

About these ads

~ by ra1ndog on October 22, 2010.

One Response to “Compiling GCC 4.6 Nightlies on Windows with MinGW and MSYS”

  1. Thanks ra1ndog! You are the man! I will be compiling gcc 4.6 this weekend. Thanks again for putting these instructions together.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
Follow

Get every new post delivered to your Inbox.