Cross compiler, by definition, is a compiler which builds software for another platform, not the platform it is running on. For example, one may compile from Windows to Linux or Mac OS X; one may compile from x86 to ARM or x86_64.
For the purpose of this tutorial, we consider cross-compiler running on Win32, targeting GNU/Linux, target architecture is x86 or x86_64. We make C/C++ compiler only; Ada, Fortran and GNU Java are out of scope of this tutorial.
We want our cross-compiler to be fully built under Win32 and run in clean Win32 environment, without any special DLLs like cygwin1.dll or other dependencies (so host platform will be MinGW). But some components of cross-compiler can be built only on Cygwin host plaform (MinGW is not powerful enough for them), so we will intermix Cygwin with MinGW during our work.