Difference between revisions of "Building MINGW-w64"

From ReactOS Wiki
Jump to: navigation, search
(Getting the sources)
(Stripping the binaries)
 
(66 intermediate revisions by 4 users not shown)
Line 2: Line 2:
 
This guide is provided for those who have no clue how to compile gcc, but still want to do it. It's a reference, just follow the steps and you get what you want. There's no support for special wishes ;-)
 
This guide is provided for those who have no clue how to compile gcc, but still want to do it. It's a reference, just follow the steps and you get what you want. There's no support for special wishes ;-)
  
= Setting up the build environment =
+
== Setting up the build environment ==
Download and install MSYS. You will need the following packages:
+
Download and install MSYS2. You will need the following packages:
  
* MSYS-w64 (version [http://freefr.dl.sourceforge.net/project/mingw-w64/External%20binary%20packages%20%28Win64%20hosted%29/MSYS%20%2832-bit%29/MSYS-20110309.zip 20110309])
+
* MSYS2 (version [http://repo.msys2.org/distrib/i686/msys2-i686-20180531.exe 20180531])
* make (version [http://freefr.dl.sourceforge.net/project/mingw-w64/External%20binary%20packages%20(Win64%20hosted)/make/make-3.82-20100827.zip 3.82])
+
* Recent mingw-w64 32 bit Toolchain ([https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/7.3.0/threads-win32/dwarf/ here])
* Recent mingw-w64 32 bit Toolchain ([http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Automated%20Builds/ here])
 
  
Download all packages and extract them into c:\MSYS (or similar).
+
Download all packages and install them into c:\MSYS32. Extract Toolchain to the /usr/ folder inside.
  
Additional steps needed are:
+
pacman -Syu
* Go to the bin folder inside msys and rename i686-w64-*.exe to *.exe to make configure happy
 
* Delete dlfcn.h in every location.
 
  
= Getting the sources =
+
pacman -Su
  
Download all the sources into subfolders of /src
+
pacman -S --needed make texinfo diffutils
  
* binutils (version [ftp://sourceware.org/pub/binutils/snapshots/binutils-2.21.53.tar.bz2 2.21.53] or [ftp://sourceware.org/pub/binutils/snapshots/ newer]) -> /src/binutils
+
(If installing make makes problems, remove the files it laments about already being existent)
* gcc-core (version [ftp://ftp.fu-berlin.de/unix/languages/gcc/releases/gcc-4.6.1/gcc-core-4.6.1.tar.bz2 4.6.1] or [ftp://ftp.fu-berlin.de/unix/languages/gcc/snapshots/ newer]) -> /src/gcc
 
* gcc-g++ (version [ftp://ftp.fu-berlin.de/unix/languages/gcc/releases/gcc-4.6.1/gcc-g++-4.6.1.tar.bz2 4.6.1] or [ftp://ftp.fu-berlin.de/unix/languages/gcc/snapshots/ newer]) -> /src/gcc
 
* mingw-w64 ([http://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-snapshot/ here]) -> /src/mingw-w64
 
  
* MPFR (version [http://mpfr.loria.fr/mpfr-current/mpfr-3.0.1.zip 3.0.1]) -> /src/mpfr
+
== Getting the sources ==
* GMP (version [ftp://ftp.gmplib.org/pub/gmp-5.0.2/gmp-5.0.2.tar.bz2 5.0.2]) -> /src/gmp
 
* MPC (version [http://www.multiprecision.org/mpc/download/mpc-0.9.tar.gz 0.9]) -> /src/mpc
 
  
= Note =
+
Download all the sources into subfolders of /src
  
Copy the src/mingw-w64/mingw-w64-headers/include directory to /RosBE64/mingw and to /RosBE64/x86_64-w64-mingw32 (64 bit) or /RosBE64/i686-w64-mingw32 (32 bit).
+
* binutils (version [ftp://sourceware.org/pub/binutils/releases/binutils-2.32.tar.xz 2.32]) -> /src/binutils
 +
* gcc (version [ftp://ftp.fu-berlin.de/unix/languages/gcc/releases/gcc-8.3.0/gcc-8.3.0.tar.xz 8.3.0]) -> /src/gcc
 +
* mingw-w64 v6.0.0 ([https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/ here]) -> /src/mingw-w64
  
== Patching the sources ==
+
* MPFR (version [https://www.mpfr.org/mpfr-current/mpfr-4.0.2.tar.xz 4.0.2]) -> /src/gcc/mpfr
 +
* GMP (version [ftp://ftp.gmplib.org/pub/gmp-6.1.2/gmp-6.1.2.tar.xz 6.1.2]) -> /src/gcc/gmp
 +
* MPC (version [https://ftp.gnu.org/gnu/mpc/mpc-1.1.0.tar.gz 1.1.0]) -> /src/gcc/mpc
  
You need to apply 2 patches (Kudos go to Kai Tietz from mingw-w64):
+
= Building =
* [http://dreimer.bplaced.net/rosbe/patches/x86_64_bin_underscore.diff Patch for binutils] (Obsolete with recent Nightlies)
 
* [http://dreimer.bplaced.net/rosbe/patches/x86_64_gcc_underscore.diff Patch for gcc] (Obsolete with gcc 4.5.1 Tree)
 
  
= Building =
+
* USE THE MINGW32.EXE!!! Otherwise the host= and build= parameters are set to some msys2 environment and not the one we expect.
 +
* the -jX parameter added to make speeds up the build processes by using mutiple threads to build on more than one CPU core. Use your amout of cores + 1 as number instead of the X.
  
 
Optionally set buildflags:
 
Optionally set buildflags:
Line 48: Line 43:
 
32 bit:
 
32 bit:
 
  export CFLAGS="-g0 -O2 -pipe -Wl,-S -march=pentium -mtune=i686"
 
  export CFLAGS="-g0 -O2 -pipe -Wl,-S -march=pentium -mtune=i686"
  export CXXFLAGS="-g0 -O2 -pipe -Wl,-S -march=pentium -mtune=i686"
+
  export CXXFLAGS="-g0 -O2 -pipe -Wl,-S -march=pentium -march=i686"
  
== Building GMP ==
+
=== Building binutils ===
  
Create a build subdirectory for gmp:
+
Create a build subdirectory for binutils:
 
  cd build
 
  cd build
  mkdir gmp
+
  mkdir binutils
  cd gmp
+
  cd binutils
  
From the build directory run the gmp configure script:
+
From the build directory run the binutils configure script:
  
  ../../src/gmp/configure --prefix=/support --host=i686-w64-mingw32 --build=i686-w64-mingw32 --enable-cxx --disable-shared
+
64 bit:
 +
  ../../src/binutils/configure --prefix=/RosBE --with-sysroot=/RosBE --target=x86_64-w64-mingw32 --disable-multilib --disable-werror --enable-lto --enable-plugins --with-zlib=yes --disable-nls
  
Now build the whole stuff.
+
32 bit:
make CPPFLAGS=-fexceptions
+
  ../../src/binutils/configure --prefix=/RosBE --with-sysroot=/RosBE --target=i686-w64-mingw32 --disable-multilib --disable-werror --enable-lto --enable-plugins --with-zlib=yes --disable-nls
 
 
Finally install it into the designated directory.
 
make install
 
 
 
== Building MPFR ==
 
 
 
Create a build subdirectory for mpfr:
 
cd build
 
mkdir mpfr
 
cd mpfr
 
 
 
From the build directory run the mpfr configure script:
 
 
 
  ../../src/mpfr/configure --prefix=/support --host=i686-w64-mingw32 --build=i686-w64-mingw32 --with-gmp=/support --disable-shared
 
  
 
Now build the whole stuff.
 
Now build the whole stuff.
  make
+
  make -jX
  
 
Finally install it into the designated directory.
 
Finally install it into the designated directory.
 
  make install
 
  make install
  
== Building MPC ==
+
=== Building the mingw-w64 headers ===
  
Create a build subdirectory for mpc:
+
Create a build directory.
  cd build
+
  cd ..
  mkdir mpc
+
  mkdir mingw-w64-headers
  cd mpc
+
  cd mingw-w64-headers
  
From the build directory run the mpc configure script:
+
Run the configure script
  
  ../../src/mpc/configure --prefix=/support --host=i686-w64-mingw32 --build=i686-w64-mingw32 --with-gmp=/support --with-mpfr=/support
+
64 bit:
  --disable-shared
+
  ../../src/mingw-w64/mingw-w64-headers/configure --prefix=/RosBE/x86_64-w64-mingw32 --host=x86_64-w64-mingw32
  
Now build the whole stuff.
+
32 bit:
  make
+
  ../../src/mingw-w64/mingw-w64-headers/configure --prefix=/RosBE/i686-w64-mingw32 --host=i686-w64-mingw32
  
Finally install it into the designated directory.
+
Install
 
  make install
 
  make install
  
== Building binutils ==
+
=== Note ===
 
 
Create a build subdirectory for binutils:
 
cd build
 
mkdir binutils
 
cd binutils
 
  
From the build directory run the binutils configure script:
+
Copy the /RosBE/x86_64-w64-mingw32 (64 bit) or /RosBE/i686-w64-mingw32 (32 bit) directory to /RosBE/mingw.
  
64 bit:
+
Add it to the PATH variable.
  ../../src/binutils/configure --prefix=/RosBE64 --host=i686-w64-mingw32 --build=i686-w64-mingw32 --target=x86_64-w64-mingw32
+
  export PATH="$PATH:/RosBE/bin"
  --disable-nls --disable-werror --disable-multilib --with-sysroot=/RosBE64
 
  
32 bit:
+
=== Building gcc-core ===
../../src/binutils/configure --prefix=/RosBE64 --host=i686-w64-mingw32 --build=i686-w64-mingw32 --target=i686-w64-mingw32
 
  --disable-nls --disable-werror --disable-multilib --with-sysroot=/RosBE64
 
  
Now build the whole stuff.
+
Enter into the build directory:
make
 
 
 
Finally install it into the designated directory.
 
make install
 
 
 
== Building gcc-core ==
 
Emter into the build directory:
 
 
  cd ..
 
  cd ..
 
  mkdir gcc
 
  mkdir gcc
Line 134: Line 101:
  
 
64 bit:
 
64 bit:
  ../../src/gcc/configure --prefix=/RosBE64 --host=i686-w64-mingw32 --build=i686-w64-mingw32 --target=x86_64-w64-mingw32
+
  ../../src/gcc/configure --target=x86_64-w64-mingw32 --prefix=/RosBE --with-sysroot=/RosBE --with-pkgversion="RosBE-Windows" --enable-languages=c,c++ --enable-fully-dynamic-string --enable-checking=release --enable-version-specific-runtime-libs --enable-plugins --disable-shared --disable-multilib --disable-nls --disable-werror --disable-win32-registry --disable-sjlj-exceptions --disable-libstdcxx-verbose
  --with-gmp=/support --with-mpfr=/support --with-mpc=/support --with-pkgversion="RosBE-Windows" --enable-languages=c,c++
 
  --enable-checking=release --enable-version-specific-runtime-libs --disable-win32-registry --disable-shared --disable-nls
 
  --disable-werror --disable-multilib --with-sysroot=/RosBE64
 
  
 
32 bit:
 
32 bit:
  ../../src/gcc/configure --prefix=/RosBE64 --host=i686-w64-mingw32 --build=i686-w64-mingw32 --target=i686-w64-mingw32
+
  ../../src/gcc/configure --target=i686-w64-mingw32 --prefix=/RosBE --with-sysroot=/RosBE --with-pkgversion="RosBE-Windows" --enable-languages=c,c++ --enable-fully-dynamic-string --enable-checking=release --enable-version-specific-runtime-libs --enable-plugins --disable-shared --disable-multilib --disable-nls --disable-werror --disable-win32-registry --disable-sjlj-exceptions --disable-libstdcxx-verbose
  --with-gmp=/support --with-mpfr=/support --with-mpc=/support --with-pkgversion="RosBE-Windows" --enable-languages=c,c++
 
  --enable-checking=release --enable-version-specific-runtime-libs --disable-win32-registry --disable-shared --disable-nls
 
  --disable-werror --disable-multilib --with-sysroot=/RosBE64
 
  
 
Compile the gcc-core
 
Compile the gcc-core
  make all-gcc
+
  make all-gcc -jX
  
 
And install it
 
And install it
 
  make install-gcc
 
  make install-gcc
 +
make install-lto-plugin
  
Finally add it to the PATH variable.
+
=== Building the crt ===
PATH=$PATH:/RosBE64/bin ; export PATH
 
 
 
== Building the crt ==
 
  
 
Create a build directory.
 
Create a build directory.
Line 164: Line 123:
  
 
64 bit:
 
64 bit:
  ../../src/mingw-w64/mingw-w64-crt/configure --prefix=/RosBE64 --host=x86_64-w64-mingw32 --build=i686-w64-mingw32 --with-sysroot=/RosBE64
+
  ../../src/mingw-w64/mingw-w64-crt/configure --prefix=/RosBE/x86_64-w64-mingw32 --with-sysroot=/RosBE/x86_64-w64-mingw32 --host=x86_64-w64-mingw32
  
 
32 bit:
 
32 bit:
  ../../src/mingw-w64/mingw-w64-crt/configure --prefix=/RosBE64 --host=i686-w64-mingw32 --build=i686-w64-mingw32 --with-sysroot=/RosBE64
+
  ../../src/mingw-w64/mingw-w64-crt/configure --prefix=/RosBE/i686-w64-mingw32 --with-sysroot=/RosBE/i686-w64-mingw32 --host=i686-w64-mingw32
  
 
Compile
 
Compile
  make
+
  make -jX
  
 
And install
 
And install
 
  make install
 
  make install
  
Copy the /RosBE64/x86_64-w64-mingw32 (64 bit) or /RosBE64/i686-w64-mingw32 (32 bit) directory to /RosBE64/mingw.
+
=== Note ===
 +
 
 +
Copy the /RosBE/x86_64-w64-mingw32 (64 bit) or /RosBE/i686-w64-mingw32 (32 bit) directory to /RosBE/mingw.
 +
 
 +
=== Building the rest of gcc ===
  
== Building the rest of gcc ==
 
 
Enter into the gcc build directory.
 
Enter into the gcc build directory.
 
  cd ..
 
  cd ..
Line 183: Line 145:
  
 
And compile the rest.
 
And compile the rest.
  make
+
  make -jX
 
  make install
 
  make install
 +
 +
=== Stripping the binaries ===
 +
 +
CD to the RosBE directory and execute these
 +
 +
find -executable -type f -exec strip -s {} ";" >& /dev/null
 +
find -name "*.a" -type f -exec strip -d {} ";" >& /dev/null
 +
find -name "*.o" -type f -exec strip -d {} ";" >& /dev/null
  
 
= Common errors =
 
= Common errors =
  
When compiling crt:
+
* Check if you have copied the /RosBE/x86_64-w64-mingw32 (64 bit) or /RosBE/i686-w64-mingw32 (32 bit) directory to /RosBE/mingw anytime you have to do something with GCC building.
configure: error: Please check if the mingw-w64 header set and the build/host option are set properly.
+
* Check if you have set the PATH variable to the new compiler correctly.
 
+
* Check if you have installed the new compiler correctly ("make install-gcc").
* Check if you have copied the mingw-headers/include directory to both /RosBE64/x86_64-w64-mingw32 and /RosBE64/mingw
+
* If you wanna make a new ninja. "configure.py --platform=mingw --host=mingw --bootstrap"
* Check if you have set the PATH variable to the new compiler correctly
 
* Check if you have installed the new compiler correctly ("make install-gcc")
 
  
 
[[Category:Building]]
 
[[Category:Building]]
 
[[Category:amd64]]
 
[[Category:amd64]]
 +
[[Category:Tutorial]]

Latest revision as of 17:16, 15 August 2019

... for idiots. This guide is provided for those who have no clue how to compile gcc, but still want to do it. It's a reference, just follow the steps and you get what you want. There's no support for special wishes ;-)

Setting up the build environment

Download and install MSYS2. You will need the following packages:

  • MSYS2 (version 20180531)
  • Recent mingw-w64 32 bit Toolchain (here)

Download all packages and install them into c:\MSYS32. Extract Toolchain to the /usr/ folder inside.

pacman -Syu

pacman -Su

pacman -S --needed make texinfo diffutils

(If installing make makes problems, remove the files it laments about already being existent)

Getting the sources

Download all the sources into subfolders of /src

  • binutils (version 2.32) -> /src/binutils
  • gcc (version 8.3.0) -> /src/gcc
  • mingw-w64 v6.0.0 (here) -> /src/mingw-w64
  • MPFR (version 4.0.2) -> /src/gcc/mpfr
  • GMP (version 6.1.2) -> /src/gcc/gmp
  • MPC (version 1.1.0) -> /src/gcc/mpc

Building

  • USE THE MINGW32.EXE!!! Otherwise the host= and build= parameters are set to some msys2 environment and not the one we expect.
  • the -jX parameter added to make speeds up the build processes by using mutiple threads to build on more than one CPU core. Use your amout of cores + 1 as number instead of the X.

Optionally set buildflags:

64 bit:

export CFLAGS="-g0 -O2 -pipe -Wl,-S"
export CXXFLAGS="-g0 -O2 -pipe -Wl,-S"

32 bit:

export CFLAGS="-g0 -O2 -pipe -Wl,-S -march=pentium -mtune=i686"
export CXXFLAGS="-g0 -O2 -pipe -Wl,-S -march=pentium -march=i686"

Building binutils

Create a build subdirectory for binutils:

cd build
mkdir binutils
cd binutils

From the build directory run the binutils configure script:

64 bit:

../../src/binutils/configure --prefix=/RosBE --with-sysroot=/RosBE --target=x86_64-w64-mingw32 --disable-multilib --disable-werror --enable-lto --enable-plugins --with-zlib=yes --disable-nls

32 bit:

../../src/binutils/configure --prefix=/RosBE --with-sysroot=/RosBE --target=i686-w64-mingw32 --disable-multilib --disable-werror --enable-lto --enable-plugins --with-zlib=yes --disable-nls

Now build the whole stuff.

make -jX

Finally install it into the designated directory.

make install

Building the mingw-w64 headers

Create a build directory.

cd ..
mkdir mingw-w64-headers
cd mingw-w64-headers

Run the configure script

64 bit:

../../src/mingw-w64/mingw-w64-headers/configure --prefix=/RosBE/x86_64-w64-mingw32 --host=x86_64-w64-mingw32

32 bit:

../../src/mingw-w64/mingw-w64-headers/configure --prefix=/RosBE/i686-w64-mingw32 --host=i686-w64-mingw32

Install

make install

Note

Copy the /RosBE/x86_64-w64-mingw32 (64 bit) or /RosBE/i686-w64-mingw32 (32 bit) directory to /RosBE/mingw.

Add it to the PATH variable.

export PATH="$PATH:/RosBE/bin"

Building gcc-core

Enter into the build directory:

cd ..
mkdir gcc
cd gcc

Now run the configure script:

64 bit:

../../src/gcc/configure --target=x86_64-w64-mingw32 --prefix=/RosBE --with-sysroot=/RosBE --with-pkgversion="RosBE-Windows" --enable-languages=c,c++ --enable-fully-dynamic-string --enable-checking=release --enable-version-specific-runtime-libs --enable-plugins --disable-shared --disable-multilib --disable-nls --disable-werror --disable-win32-registry --disable-sjlj-exceptions --disable-libstdcxx-verbose

32 bit:

../../src/gcc/configure --target=i686-w64-mingw32 --prefix=/RosBE --with-sysroot=/RosBE --with-pkgversion="RosBE-Windows" --enable-languages=c,c++ --enable-fully-dynamic-string --enable-checking=release --enable-version-specific-runtime-libs --enable-plugins --disable-shared --disable-multilib --disable-nls --disable-werror --disable-win32-registry --disable-sjlj-exceptions --disable-libstdcxx-verbose

Compile the gcc-core

make all-gcc -jX

And install it

make install-gcc
make install-lto-plugin

Building the crt

Create a build directory.

cd ..
mkdir mingw-w64-crt
cd mingw-w64-crt

Run the configure script

64 bit:

../../src/mingw-w64/mingw-w64-crt/configure --prefix=/RosBE/x86_64-w64-mingw32 --with-sysroot=/RosBE/x86_64-w64-mingw32 --host=x86_64-w64-mingw32

32 bit:

../../src/mingw-w64/mingw-w64-crt/configure --prefix=/RosBE/i686-w64-mingw32 --with-sysroot=/RosBE/i686-w64-mingw32 --host=i686-w64-mingw32

Compile

make -jX

And install

make install

Note

Copy the /RosBE/x86_64-w64-mingw32 (64 bit) or /RosBE/i686-w64-mingw32 (32 bit) directory to /RosBE/mingw.

Building the rest of gcc

Enter into the gcc build directory.

cd ..
cd gcc

And compile the rest.

make -jX
make install

Stripping the binaries

CD to the RosBE directory and execute these

find -executable -type f -exec strip -s {} ";" >& /dev/null
find -name "*.a" -type f -exec strip -d {} ";" >& /dev/null
find -name "*.o" -type f -exec strip -d {} ";" >& /dev/null

Common errors

  • Check if you have copied the /RosBE/x86_64-w64-mingw32 (64 bit) or /RosBE/i686-w64-mingw32 (32 bit) directory to /RosBE/mingw anytime you have to do something with GCC building.
  • Check if you have set the PATH variable to the new compiler correctly.
  • Check if you have installed the new compiler correctly ("make install-gcc").
  • If you wanna make a new ninja. "configure.py --platform=mingw --host=mingw --bootstrap"