Cross-compiling Mono for Windows
Starting with Mono from git revision SVN/109671 (or version 2.2+) it is now possible to compile Mono for Windows on your Linux machine. To do it you will need to provide a MinGW environment for your Linux distribution and several compile and runtime dependencies for Mono. Distribution-specific instructions follow below. Once you have your MinGW environment set up, go to your Mono source directory and type (make sure that your directory has NO files from previous compilations):
To get an overview of options available for the above script, type
The above command assumes that your cross-compilation environment is installed in the
/opt/cross/i386-mingw32msvc directory and that the MinGW target is
If your environment is in another directory, you can specify it by passing the full path using the
-d PATH argument to the above script. If your MinGW uses a different target, please pass it to the script in the
-m MINGWTARGET argument. Running the script with the
-h argument will give short usage information. The above arguments work with Mono 2.8 or newer.
Mono 2.10 (as of Feb 8 2011, git commit 9d4e229) or 2.11 (master on Feb 8 2011, git commit a8362f1) added two more command line options. First of them,
-e DIR, lets you put the packages needed for cross-compiling in a location different to the one
mingw32 is installed in. The second new option is
-p PREFIX which lets you specify the directory in which Mono will be installed on Windows. The build script will create a subdirectory at that location specific to the current build.
If you have an older version of Mono, you should pass the cross-compile environment path as the first argument to the script and the MINGW target as the second argument.
Building will take some time since the mono runtime needs to be built twice (once for the target Windows platform, the second time to build the compilers and class libraries). Once the process is done, you will find a zip file in the same directory where the build script lives with the name following the pattern:
* X.Y - major.minor Mono version * BRANCH - Mono branch or tarball if git branch could not have been detected * REVISION - Mono git revision or rUNKNOWN if it wasn't possible to determine the revision number
The zip file must be unpacked in the root directory of any Windows disk drive and you will be able to find the Mono installation in the directory whose name follows the pattern:
or, if you used the
-p PREFIX option,
* Z - the letter identifying the Windows disk drive where you unpacked the zip * X.Y - major.minor mono version * BRANCH - Mono branch or tarball if git branch could not have been detected * REVISION - Mono git revision or rUNKNOWN if it wasn't possible to determine the revision number
If you want to permanently put a path to the Mono bin directory from the above package in your global
PATH environment variable, but you’re worried you will have to update it every time you compile new package from another Mono revision, do not despair - there is a way to create symlinks on Windows 2000 onwards if your disk is formatted with the NTFS filesystem. Install this utility and issue the following command from the cmd prompt:
junction Z:\mono-trunk Z:\mono-X.Y-BRANCH-REVISION
where the elements of the path are described above. After that you can add the
z:\mono-trunk\bin path to your system
PATH variable and just update the symlink every time you install new version of Mono built from trunk.
Table of contents
List of packages needed for cross-compiling
Not all of the packages are strictly necessary, but having them around in your mingw environment can’t hurt. If you’re not using any distribution-specific package, you will need to unpack the packages in the top-level directory of your MinGW installation (e.g.
* glib * glib-dev * zlib binaries * zlib devel package * pkg-config * libpng * libpng-dev * libtiff * libtiff-dev * libjpeg * libjpeg-dev * giflib-bin * giflib-lib * freetype * freetype-dev * fontconfig * fontconfig-dev * expat * proxy-libintl * gettext-runtime * gettext-runtime-dev
The list is valid as of
April 2nd, 2010. You can substitute the above packages with newer versions (if supported by Mono).
With openSUSE all you need to do in order to satisfy all the requirements is to add two repositories using Yast:
* http://download.opensuse.org/repositories/Mono:/Community/ * http://download.opensuse.org/repositories/CrossToolchain:/mingw/
Note that the above URLs do NOT specify the final repository - you need to visit them and pick the version of openSUSE you are using (e.g. http://download.opensuse.org/repositories/Mono:/Community/openSUSE_10.3/) After configuring and refreshing the repositories in Yast, proceed to install the following packages:
* cross-mingw-gcc * cross-mono-build-dependencies
And that’s it! You’re set to compile as described above!
Ubuntu ( / Debian? )
Install the packages mingw32, mingw32-binutils and mingw32-runtime.