Difference between revisions of "Building MINGW-w64"

From ReactOS Wiki
Jump to: navigation, search
(Setting up the build environment)
 
(20 intermediate revisions by the same user not shown)
Line 3: Line 3:
  
 
== 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:
  
 
* MSYS2 (version [http://repo.msys2.org/distrib/i686/msys2-i686-20180531.exe 20180531])
 
* MSYS2 (version [http://repo.msys2.org/distrib/i686/msys2-i686-20180531.exe 20180531])
 
* 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 ([https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/7.3.0/threads-win32/dwarf/ here])
  
Download all packages and install them into c:\MSYS32. Extract Toolchain to the /usr/ folder inside.
+
Download all packages and install them into c:\MSYS32. Extract Toolchain to the /mingw32/ folder inside.
  
 
pacman -Syu
 
pacman -Syu
Line 14: Line 14:
 
pacman -Su
 
pacman -Su
  
pacman -S make texinfo diffutils
+
pacman -S --needed make texinfo diffutils
  
 
(If installing make makes problems, remove the files it laments about already being existent)
 
(If installing make makes problems, remove the files it laments about already being existent)
Line 23: Line 23:
  
 
* binutils (version [ftp://sourceware.org/pub/binutils/releases/binutils-2.32.tar.xz 2.32]) -> /src/binutils
 
* 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-7.4.0/gcc-7.4.0.tar.xz 7.4.0]) -> /src/gcc
+
* 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
 
* mingw-w64 v6.0.0 ([https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/ here]) -> /src/mingw-w64
  
Line 30: Line 30:
 
* MPC (version [https://ftp.gnu.org/gnu/mpc/mpc-1.1.0.tar.gz 1.1.0]) -> /src/gcc/mpc
 
* MPC (version [https://ftp.gnu.org/gnu/mpc/mpc-1.1.0.tar.gz 1.1.0]) -> /src/gcc/mpc
  
== Note ==
+
= Building =
 
 
Copy the src/mingw-w64/mingw-w64-headers/include directory to /RosBE/mingw and to /RosBE/x86_64-w64-mingw32 (64 bit) or /RosBE/i686-w64-mingw32 (32 bit).
 
 
 
This is needed for building GCC-core. This is replaced by make install of the MinGW headers, but before that step GCC still wants headers which we give it here.
 
  
= 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 58: Line 55:
  
 
64 bit:
 
64 bit:
  ../../src/binutils/configure --prefix=/RosBE --host=i686-w64-mingw32 --build=i686-w64-mingw32 --target=x86_64-w64-mingw32 --disable-nls --disable-werror --disable-multilib --with-sysroot=/RosBE
+
  ../../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:
 
32 bit:
  ../../src/binutils/configure --prefix=/RosBE --host=i686-w64-mingw32 --build=i686-w64-mingw32 --target=i686-w64-mingw32 --disable-nls --disable-werror --disable-multilib --with-sysroot=/RosBE
+
  ../../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.
 
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 gcc-core ===
 
Enter into the build directory:
 
cd ..
 
mkdir gcc
 
cd gcc
 
 
Now run the configure script:
 
 
64 bit:
 
../../src/gcc/configure --prefix=/RosBE --host=i686-w64-mingw32 --build=i686-w64-mingw32 --target=x86_64-w64-mingw32 --with-pkgversion="RosBE-Windows" --enable-languages=c,c++ --enable-checking=release --disable-win32-registry --disable-shared --disable-nls --disable-werror --disable-multilib --with-sysroot=/RosBE --enable-version-specific-runtime-libs --with-host-libstdcxx="-lstdc++ -lsupc++" --disable-sjlj-exceptions
 
 
32 bit:
 
../../src/gcc/configure --prefix=/RosBE --host=i686-w64-mingw32 --build=i686-w64-mingw32 --target=i686-w64-mingw32 --with-pkgversion="RosBE-Windows" --enable-languages=c,c++ --enable-checking=release --disable-win32-registry --disable-shared --disable-nls --disable-werror --disable-multilib --with-sysroot=/RosBE --enable-version-specific-runtime-libs --with-host-libstdcxx="-lstdc++ -lsupc++" --disable-sjlj-exceptions
 
 
Compile the gcc-core
 
make all-gcc
 
 
And install it
 
make install-gcc
 
 
Finally add it to the PATH variable.
 
export PATH="$PATH:/RosBE/bin"
 
  
 
=== Building the mingw-w64 headers ===
 
=== Building the mingw-w64 headers ===
Line 102: Line 76:
  
 
64 bit:
 
64 bit:
  ../../src/mingw-w64/mingw-w64-headers/configure --host=x86_64-w64-mingw32 --build=i686-w64-mingw32 --prefix=/RosBE/x86_64-w64-mingw32
+
  ../../src/mingw-w64/mingw-w64-headers/configure --prefix=/RosBE/x86_64-w64-mingw32 --host=x86_64-w64-mingw32
  
 
32 bit:
 
32 bit:
  ../../src/mingw-w64/mingw-w64-headers/configure --host=i686-w64-mingw32 --build=i686-w64-mingw32 --prefix=/RosBE/i686-w64-mingw32
+
  ../../src/mingw-w64/mingw-w64-headers/configure --prefix=/RosBE/i686-w64-mingw32 --host=i686-w64-mingw32
  
 
Install
 
Install
 
  make install
 
  make install
  
Run the configure script
+
=== 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:
 
64 bit:
  ../../src/mingw-w64/mingw-w64-headers/configure --host=x86_64-w64-mingw32 --build=i686-w64-mingw32 --prefix=/RosBE
+
  ../../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:
 
32 bit:
  ../../src/mingw-w64/mingw-w64-headers/configure --host=i686-w64-mingw32 --build=i686-w64-mingw32 --prefix=/RosBE
+
  ../../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
  
Install
+
And install it
  make install
+
make install-gcc
 +
  make install-lto-plugin
  
 
=== Building the crt ===
 
=== Building the crt ===
Line 131: Line 123:
  
 
64 bit:
 
64 bit:
  ../../src/mingw-w64/mingw-w64-crt/configure --prefix=/RosBE/x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --build=i686-w64-mingw32 --with-sysroot=/RosBE
+
  ../../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=/RosBE/i686-w64-mingw32 --host=i686-w64-mingw32 --build=i686-w64-mingw32 --with-sysroot=/RosBE
+
  ../../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
 +
 +
=== Note ===
  
 
Copy the /RosBE/x86_64-w64-mingw32 (64 bit) or /RosBE/i686-w64-mingw32 (32 bit) directory to /RosBE/mingw.
 
Copy the /RosBE/x86_64-w64-mingw32 (64 bit) or /RosBE/i686-w64-mingw32 (32 bit) directory to /RosBE/mingw.
Line 151: Line 145:
  
 
And compile the rest.
 
And compile the rest.
  make
+
  make -jX
 
  make install
 
  make install
  
== Common errors ==
+
=== 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
  
When compiling crt:
+
= Common errors =
configure: error: Please check if the mingw-w64 header set and the build/host option are set properly.
 
  
* Check if you have copied the mingw-headers/include directory to both /RosBE/x86_64-w64-mingw32 and /RosBE/mingw
+
* 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 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 installed the new compiler correctly ("make install-gcc").
 +
* If you wanna make a new ninja. "configure.py --platform=mingw --host=mingw --bootstrap"
  
 
[[Category:Building]]
 
[[Category:Building]]
 
[[Category:amd64]]
 
[[Category:amd64]]
 
[[Category:Tutorial]]
 
[[Category:Tutorial]]

Latest revision as of 20:31, 19 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 /mingw32/ 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"