TODO:

* Multi-arch build (i.e., i686 hosted, i686 and x86_64-trageting, just
  like in Qt5). Then will be able to pass -m32/-m64 to the ODB compiler.

An overview of steps required to switch to a new GCC version. This is
a complete toolchain bring up.

1. Get the MinGW-W64 GCC build of this version and get configuration
   flags (gcc -v). The idea is to build both the cross-compiler
   and the native compiler (with linked-in ODB plugin) as close
   to the MinGW-W64 configuration as possible.

2. Build cross-binutils:

   1. Move old cross/mingw to cross/mingw-X.Y.Z.
   2. Unpack binutils, rename to binutils, create or clean binutils-cross-build.
   3. Build and install:

      cd binutils-cross-build
      ../binutils-cross-configure
      make -j 16
      make install

3  Install runtime headers:

   1. Unpack mingw-w64 and rename to mingw-w64, create or clean
      mingw-w64-headers-build.
   2. Configure & install:

      cd mingw-w64-headers-build
      ../rt-headers-cross-configure
      make install

4. Build cross-GCC, phase 1:

   1. Unpack GCC, rename to gcc-cross, create or clean gcc-cross-build.
   2. Adapt older gcc-X.Y.Z-mingw-cross.patch (--dry-run) and apply.
   3. Adapt gcc-cross-configure based on MinGW-W64 config and old config.
   4. Build & install GCC only:

      cd gcc-cross-build
      ../gcc-cross-configure
      make -j 16 all-gcc
      make install-gcc

5. Build runtime:

   1. Create or clean mingw-w64-build.
   2. Build & install:

      export PATH=`pwd`/cross/mingw/bin:$PATH
      cd mingw-w64-build
      ../rt-cross-configure
      make -j 16
      make install

6. Build pthreads:

   1. Get winpthreads, create or clean winpthreads-build

      svn checkout http://mingw-w64.svn.sourceforge.net/svnroot/mingw-w64/experimental/winpthreads

   2. Build and install:

      export PATH=`pwd`/cross/mingw/bin:$PATH
      cd winpthreads-build
      ../pthreads-cross-configure
      make -j 16
      make install

7. Build cross-GCC, phase 2:

   1. Build & install:

      cd gcc-cross-build
      make -j 16
      make install

   2. Disable .dll & .la files in i686-w64-mingw32/lib.

   3. Check that the compiler works. Compile and run sizeof_funds.cxx and
      throw.cxx.

8. Package runtime:

   1. Save mingw-rt as mingw-rt-X.Y.Z

   2. Package:

      cd mingw-w64-headers-build
      make DESTDIR=/home/boris/work/odb/build/mingw-w64/mingw-rt install

      cd mingw-w64-build
      make DESTDIR=/home/boris/work/odb/build/mingw-w64/mingw-rt install

      cd winpthreads-build
      make DESTDIR=/home/boris/work/odb/build/mingw-w64/mingw-rt install

      Move to the top level directory.

9. Build binutils:

   1. Create or clean binutils-build, /mingw.
   2. Build and install:

      export PATH=`pwd`/cross/mingw/bin:$PATH
      cd binutils-build
      ../configure-binutils
      make -j 16
      make install

   3. Copy /mingw/* to mingw-binutils.

10. Build GCC prerequisites (gmp, mpfr, mpc):

    1. Unpack {gmp, mpfr, mpc}
    2. Build and install:

      cd {gmp, mpfr, mpc}
      ../gcc-prereq-configure
      make -j 16
      make install

11. Build the native compiler:

  1. Unpack GCC, rename to gcc, create or clean gcc-build.
  2. Adapt older gcc-X.Y.Z-mingw.patch (--dry-run) and apply.
  3. Adapt older gcc-X.Y.Z-static-plugin.patch (--dry-run) and apply.
     This step will probably require careful review of changes in the
     plugin code (plugin.h and plugin.c).
  4. Regenerate configure script in gcc/gcc/. Use the same autoconf
     version as in the original (see ~/build/autocond-X.Y). For example:

     sudo make -C ~/build/autoconf-2.64 install
     autoconf --version
     cd gcc
     autoconf
     sudo make -C ~/build/autoconf-2.64 uninstall

  4. Adapt gcc-configure.
  5. Configure and make GCC manually:

     export PATH=`pwd`/cross/mingw/bin:$PATH
     cd gcc-build
     ../gcc-configure
     make -j 16

     This step will fail due to lack of libplugin-stub.a. That's
     ok. Copy .h and .def files from gcc-build/gcc/ to gcc-headers/
     (backup old ones).

4. Run the build-dist script with -rebuild

   1. If GCC build fails, then it can be re-configured or re-made
      directly from the gcc-build directory provided you don't
      clean it up (if you do so, you can manually copy libplugin-stub.a
      to gcc-build/gcc/).

   2. Check the package for any stray directories/files. Compare size to
      the old version.

   3. On Windows, check that:

      - Compiler, including exceptions, work. Compile and run sizeof_funds.cxx
        and throw.cxx.

      - Make sure ODB runs, including throwing exceptions (run on object
        with private data members).

5. Copy updates/patches to odb/etc/.