| How to build a Mingw-w64 x86_64-w64-mingw32 cross-compiler. |
| |
| == About this document == |
| |
| (At this time, building a native compiler is suggested. Documentation |
| to follow. This is all still required to be able to build it.) |
| Top-level configure to do this all with one command is also to follow. |
| |
| As of 2009-05-31, x86_64-pc-mingw32 has been replaced by x86_64-w64-mingw32. |
| The change allows for mingw-w64 to have a host/target type independent of |
| mingw.org's MinGW. |
| |
| All default libraries work! We are now in a functional beta stage. |
| |
| This file describes how to build the Mingw-w64 GCC toolchain as a cross-compiler |
| on Cygwin, MinGW with MSys, and *nix shells. |
| |
| Cygwin 1.5 and 1.7 currently in beta testing are both supported. This document |
| recommends and assumes Bash (for Cygwin, Unix), or MSys core sh default shells |
| are used. |
| |
| == Targeted audience == |
| |
| This document is written to help those new to building the mingw-w64 cross |
| compilers on Windows using MSYS/MinGW and Cygwin. It can also be adapted |
| slightly for building the mingw-w64 cross compiler on Linux. |
| |
| The mingw-w64 cross compilers consists in a few basic packages, among which |
| binutils, gcc, and windows headers, compiled in a special way. Once it is |
| operational, it forms the base to compile the packages of your project. |
| A collection of packages built on top of mingw-w64 can be found in fedora, |
| opensuse. Prebuilt version of mingw-w64 can also be found in the mingw-w64 |
| website. |
| |
| For a more advanced guide on building the mingw-w64 cross compiler including |
| the optional dependencies, please refer to the "mingw-w64-howto-build-adv.txt" |
| guide. |
| |
| == Version changes == |
| |
| Date / Version / Author |
| 2007-07-31 1.0 Kai Tietz <Kai.Tietz at onevision.com> |
| 2007-08-20 1.1 Kai Tietz <Kai.Tietz at onevision.com> |
| 2007-08-21 1.2 NightStrike <nightstrike at gmail.com> |
| 2007-10-01 1.3 NightStrike <nightstrike at gmail.com> |
| 2007-11-27 1.4 NightStrike <nightstrike at gmail.com> |
| 2009-05-31 1.5 Xenofears <xenofears at gmail.com> |
| 2009-06-06 1.6 Xenofears <xenofears at gmail.com> |
| 2009-08-28 1.7 Xenofears <xenofears at gmail.com> |
| 2009-08-30 1.8 Ozkan Sezer <sezeroz at gmail dot com> |
| 2009-10-09 1.9 Jonathan Yong <jon_y[a]users.sourceforge.com> |
| 2010-02-28 1.10 Ozkan Sezer <sezeroz at gmail dot com> |
| 2010-08-31 1.11 Jonathan Yong <jon_y[a]users.sourceforge.com> |
| 2012-03-06 1.12 William <r.3[a]libertysurf.fr> |
| 2013-01-27 1.13 Jonathan Yong <jon_y[a]users.sourceforge.com> |
| |
| == Table of Contents == |
| |
| * Requirements [RQRMTS] |
| * Optional [OPTNLB] |
| * Download new packages [DWNWPK] |
| * Build type options [BTYOPT] |
| * Building binutils cross toolchain [CRSBNT] |
| * Install the Mingw-w64 header set and create required symlinks [HDRSYM] |
| * Building the GCC core cross-compiler [BDGCOR] |
| * Building the crt [BLDCRT] |
| * Finishing GCC [FNSHGC] |
| * Path update and using your new cross-compiler [PTHUPD] |
| |
| You can search the keys (i.e. [BLDCRT]) to jump to that section. |
| |
| == Requirements == [RQRMTS] |
| |
| You will need a complete GCC toolchain for the host system (Cygwin, MinGW/MSys |
| or Linux), which usually includes all of the required components: |
| |
| * GCC (for the native platform) |
| * Binutils (for the native platform) |
| * Bison |
| * Flex |
| * gperf (Optional, for developing on GCC) |
| * Coreutils |
| * Make (3.81 or newer) |
| * GMP 4.3.1 or newer |
| [found on Cygwin setup under math] |
| * MPFR 2.4.1 or newer |
| [found on Cygwin setup under math] |
| * Perl (optional for pod2man) |
| |
| == Optional == [OPTNLB] |
| |
| Optional for source download / version management: |
| |
| * CVS |
| * Subversion (SVN) |
| * wget |
| * tar & gzip/bzip2 |
| |
| Optional for optimization enhancements: (Math toolchain dependencies are |
| elaborated on GMP) |
| |
| * PPL 0.10 or newer |
| * ClooG-PPL 0.15 or newer (must be ppl) |
| * MPC 0.7 or newer |
| |
| To build with MSys (Minimal SYStem for Win32), to satisfy the requirements |
| download and install functional MinGW (GCC toolchain), MSYS (sh shell), bison, |
| and flex. |
| |
| If your host OS is Vista, you must install SP1 or SP2! If you can't, you must |
| use an unoptimized collect2.exe as a workaround, but you are on your own. |
| |
| Win32 installers to use with mingw msys available for download at MinGW's |
| sourceforge page: http://sourceforge.net/project/showfiles.php?group_id=23617 |
| |
| GMP & MPFR sources may be placed in the GCC source tree root in directories |
| with their names and they will be built automatically by GCC's configure (as |
| static libs). You might need to make install from inside the directories if |
| GCC doesn't do it for you. |
| |
| |
| == Download new packages == [DWNWPK] |
| |
| You need to download the following packages: |
| |
| * At least CVS snapshot (2.20.51). Note that 2.20.1 is not supported |
| due to ABI changes. |
| |
| * GCC version 4.5.1 release for stable, or latest GCC (4.6) snapshot |
| or svn co for experimental. GCC-4.3 support is no longer maintained. |
| |
| * Current Mingw-w64 release available at |
| http://sourceforge.net/projects/mingw-w64 . Snapshot, even better |
| from SVN (refer below), recommended until stable issuance. |
| |
| Official releases of GCC and binutils may be downloaded from a GNU FTP mirror |
| from <http://www.gnu.org/prep/ftp.html>. GCC snapshots may be found at |
| <ftp://gcc.gnu.org/pub/gcc/snapshots/>. Binutils snapshots may be found at |
| <ftp://sourceware.org/pub/binutils/snapshots/>. Extract the tarballs (i.e. |
| tar -xf filename.tar.gz) to a temporary folders. |
| |
| You can also download the latest working version using SVN & CVS. Both source |
| control systems are available to Cygwin via Setup, and available to MSys in the |
| MSys/MinGW Packages. To use them: |
| |
| * For Mingw-w64: |
| svn co https://mingw-w64.svn.sourceforge.net/svnroot/mingw-w64 mingw-w64 |
| |
| * For GCCs latest development snapshot (4.5.0): |
| svn checkout svn://gcc.gnu.org/svn/gcc/trunk gcc45x |
| or for GCC 4.4.x: |
| svn co svn://gcc.gnu.org/svn/gcc/branches/gcc-4_4-branch gcc44x |
| |
| * For Binutils latest development snapshot (2.20.51): |
| cvs -z9 -d:pserver:anoncvs@sourceware.org:/cvs/src co binutils |
| or for binutils-2.20 stable branch: |
| cvs -z9 -d:pserver:anoncvs@sourceware.org:/cvs/src co -r binutils-2_20-branch binutils |
| (a directory named 'src' will be created and will hold the sources |
| for either of the cases.) |
| |
| |
| === Build type options === [BTYOPT] |
| |
| When building binutils, GCC and Mingw-w64, you will be using standard autotools |
| configure scripts. It is not a good idea to build in the source directory, so |
| you will make a sibling directory next to the source tree, enter it, and invoke |
| configure with '../path/to/configure' (which is then followed by 'make' and |
| then 'make install'.) You will be providing options to the configure script, |
| in the syntax of ../path/to/configure --flag[=setting]. This will be further |
| detailed below. |
| |
| Note: Do not build GCC in the source tree or in a subdirectory contained in |
| source tree. This generally applies to many other autotools based |
| packages too, unless specifically specified by the package developers |
| or maintainers. |
| |
| You have two main choices to make building the cross-compiler toolchain: |
| |
| 1) To build a cross-compiler that will generate 32 bits binaries, 64 bits |
| binaries, or that will be multilib enabled (so that the toolchain can target |
| both, using Mingw-w64's lib32). |
| |
| * 32 bits only : use options such as '--host=i686-w64-mingw32', |
| '--target=i686-w64-mingw32' with '--disable-multilib' |
| |
| * 64 bits only : use options such as '--host=x86_64-w64-mingw32', |
| '--target=x86_64-w64-mingw32' with '--disable-multilib' |
| |
| * multilib enabled : use options such as '--host=x86_64-w64-mingw32', |
| '--target=x86_64-w64-mingw32','--enable-targets=all','--enable-lib32' or |
| '--enable-targets=x86_64-w64-mingw32,i686-w64-mingw32' |
| |
| It is recommanded to use the two first options, as the third one will require |
| more knowledge to use it properly. In the rest of this howto, examples will be |
| provided for the '64 bits only' option and for the 'multilib enabled' option. |
| For the '32 bits' option, please replace 'x86_64-w64-mingw32' by |
| 'i686-w64-mingw32' wherever you see it. |
| |
| 2) Using standard settings of configure, which installs to /usr/local and |
| requires no setting changes, or to build to a sysroot you designate. /usr/local |
| is universally used as the default install point, and you may wish to keep all |
| the Mingw-w64 (64-bit) in a separate sysroot instead. In the example in these |
| instructions, the sysroot is '/mypath'. To use a sysroot, pass |
| --with-sysroot=/mypath and --prefix=/mypath as configure flags, i.e. |
| ../path/to/configure --with-sysroot=/mypath --prefix=/mypath |
| |
| |
| == Building binutils cross toolchain == [CRSBNT] |
| |
| Step 1) Create a build directory (e.g. 'build'), where binutils compiled object |
| files will be stored. Then enter into it. |
| |
| Step 2) Run configure. |
| For multilib: |
| ../path/to/configure --target=x86_64-w64-mingw32 \ |
| --enable-targets=x86_64-w64-mingw32,i686-w64-mingw32 |
| |
| For non-multilib: |
| ../path/to/configure --target=x86_64-w64-mingw32 \ |
| --disable-multilib |
| |
| If using a sysroot, add "--with-sysroot=/mypath --prefix=/mypath" to |
| your configure command, i.e., for multilib: |
| ../path/to/configure --target=x86_64-w64-mingw32 \ |
| --enable-targets=x86_64-w64-mingw32,i686-w64-mingw32 \ |
| --with-sysroot=/mypath --prefix=/mypath |
| |
| Step 3) Run make (type 'make'). This will take a while. |
| |
| Step 4) Run make install (type 'make install') |
| |
| Step 5) You may optionally delete the "build" directory to save disk space. |
| |
| Step 6) If you are using "--prefix" to install binutils to a directory not in |
| your $PATH environmental variable, you should add the "bin" directory |
| to you $PATH, i.e., for binutils installed to /home/luser/mingw64, use |
| the following command to make new cross binutils visible by issuing: |
| export PATH="$PATH:/home/luser/mingw64/bin" |
| This step is required for building GCC later. |
| |
| == Install the Mingw-w64 header set and create required symlinks == [HDRSYM] |
| |
| Step 1) The source directory for the headers can be |
| mingw-w64/trunk/mingw-w64-headers, or mingw-w64/mingw-w64-headers |
| depending on your source. |
| |
| Step 2) Create another "build" directory, and enter it. |
| To install the headers, run: |
| ../path/to/configure --build=<your build machine> \ |
| --host=x86_64-w64-mingw32 --prefix=/mypath |
| Then run "make install" to install the headers. |
| |
| NOTE: For v3 (trunk as of writing, you MUST append x86_64-w64-mingw32 to your prefix, such as --prefix=/mypath/x86_64-w64-mingw32 |
| NOTE: You MUST also do this for the CRT |
| |
| Step 3) GCC requires the x86_64-w64-mingw32 directory be mirrored as a |
| directory 'mingw' in the same root. So, if using configure default |
| /usr/local, type: |
| ln -s /usr/local/x86_64-w64-mingw32 /usr/local/mingw |
| or, for sysroot, type: |
| ln -s /mypath/x86_64-w64-mingw32 /mypath/mingw |
| |
| Step 4) Manually create the x86_64-w64-mingw32/lib directory: |
| mkdir -p /usr/local/x86_64-w64-mingw32/lib |
| or, for sysroot: |
| mkdir -p /mypath/x86_64-w64-mingw32/lib |
| If it already exists and you get an error, ignore it. |
| |
| Step 5) Symlink x86_64-w64-mingw32/lib directory as x86_64-w64-mingw32/lib64: |
| ln -s /usr/local/x86_64-w64-mingw32/lib /usr/local/x86_64-w64-mingw32/lib64 |
| or, for sysroot: |
| ln -s /mypath/x86_64-w64-mingw32/lib /mypath/x86_64-w64-mingw32/lib64 |
| |
| Note: On Windows systems or other systems that do not support UNIX type |
| softlinks, you may copy the entire directory to mirror it. It will |
| have the same effect as a symlink. |
| |
| Note: The header-set and crt contains the standard-c and the windows platform |
| headers. Therefore it is not necessary to install an additional package. |
| |
| |
| == Building the GCC core cross-compiler(s) == [BDGCOR] |
| |
| There are no GCC patches required anymore. We keep up with GCC and get any |
| fixes applied upstream. |
| |
| Step 1) Enter into the GCC root folder and generate a folder within (e.g. |
| 'build'), then enter it. |
| |
| Step 2) Run configure. |
| For multilib: |
| ../path/to/configure --target=x86_64-w64-mingw32 --enable-targets=all |
| To disable multilib: |
| ../path/to/configure --target=x86_64-w64-mingw32 --disable-multilib |
| |
| Note: Remember to add the --prefix=/mypath and --with-sysroot=/mypath flags |
| to match the binutils build if you are using a sysroot. |
| |
| Step 3) Type 'make all-gcc'. This will build the GCC core. |
| |
| Step 4) Type 'make install-gcc'. This will install the GCC core. |
| |
| Step 5) You can leave the "build" directory alone for now, so you can |
| resume building the rest of GCC later after installing the CRT. |
| |
| Now the core stuff of GCC is present and we can build the crt itself. |
| |
| |
| == Building the crt (Mingw-w64 itself) == [BLDCRT] |
| |
| Step 1) Create a new "build" directory for the crt. Enter the "build" directory. |
| |
| Step 2) Run configure. |
| For multilib: |
| ../path/to/configure --host=x86_64-w64-mingw32 --enable-lib32 |
| (NOTE: This won't work if you disabled multilib!) |
| |
| Without multilib: |
| ../path/to/configure --host=x86_64-w64-mingw32 |
| |
| If using sysroot/prefix, again add the the --prefix=/mypath and |
| --with-sysroot=/mypath flags. |
| |
| NOTE: For v3 (trunk as of writing, you MUST append x86_64-w64-mingw32 to your prefix, such as --prefix=/mypath/x86_64-w64-mingw32 |
| NOTE: You MUST also do this for the HEADERS |
| |
| Step 3) Type make. This will take a while. |
| |
| Step 4) Type make install |
| |
| Step 5) Make sure you have the following directories in the directory you |
| have installed the mingw-w64 toolchain to: |
| <root>/x86_64-w64-mingw32 |
| <root>/x86_64-w64-mingw32/include |
| <root>/x86_64-w64-mingw32/lib |
| <root>/x86_64-w64-mingw32/lib32 |
| <root>/x86_64-w64-mingw32/lib64 [link to lib] |
| <root>/mingw [link to x86_64-w64-mingw32] |
| <root>/mingw/include |
| <root>/mingw/lib |
| <root>/mingw/lib32 |
| <root>/mingw/lib64 [link to lib] |
| If you are using MSys/MinGW on Windows, remember to copy the "linked" |
| directories to simulate the use of a symbolic link. |
| |
| Note: For non-multilib builds, you can omit the "lib32" and "lib64" |
| directories and only have "lib". |
| |
| Note: Currently there are no dlls built. As long as we use static crt import |
| libraries we won't need a ctor/dtor dll (mingwm10.dll). |
| |
| |
| == Finishing GCC (the libraries built using GCC core and Mingw-w64) == [FNSHGC] |
| |
| Now you are ready to build the rest of GCC: |
| |
| Step 1) Enter back into your GCC "build" directory. |
| |
| Step 2) Type 'make'. This will take a while. |
| |
| Step 3) Type 'make install' |
| |
| |
| == Path update and using your new cross-compiler == [PTHUPD] |
| |
| Permanently update your path to use your new cross-compiler: |
| |
| The binaries are all prefixed with the Mingw-w64 triplet x86_64-w64-mingw32-, |
| so there are no file name clashes. |
| |
| * If you are using Cygwin or *nix, you will add the directory to your path |
| in .bashrc in your home directory (the file may be hidden). |
| |
| * If you are using MSys, you will need to add the directory to your path in |
| /etc/profile. |
| |
| * To reiterate, for default /usr/local, add /usr/local/bin to your PATH (this |
| should not be necessary.) If using a sysroot, add /mypath/bin to your path. |
| |
| You are finished. |
| |
| To use your cross-compiler, simply use --host=x86_64-w64-mingw32 as a |
| configure option. Be sure to -I/usr/local/include or -I/mypath/include |
| and -L/usr/local/lib or -L/mypath/lib to your CFLAGS to link your builds. |
| |
| Often you must --enable-shared if you want DLLs as opposed to static libs, |
| but it is not always the case. |
| |
| Simply use the -mwindows option for windows GUI applications. By default, |
| -mconsole is used and produce console applications. Also, you can use the |
| -mdll option for generating shared objects (dll), however normal gcc/g++ |
| with the -shared flag or a proper ld (linker) command will do this. |
| |