oreilly.comSafari Books Online.Conferences.


AddThis Social Bookmark Button

Building Mono on Windows
Pages: 1, 2

3. Completing the Build

The last phase of the build process will require you to obtain a copy of the Mono source code. The recommended way to accomplish this is by using anonymous Subversion checkout. The Mono project uses Subversion as its source code management tool. In order to use Subversion, you first need to have a Subversion client installed on your machine. Finally, once you have Subversion installed, and you have checked out and exported the Mono source code, then you can complete the build steps.

3.1 Installing Subversion

If you already have the Subversion, then you can skip this section. You will need to obtain the the Windows installer with the basic Subversion Win32 binaries. You can obtain the installer from the documents and files area.

  1. Run the setup routine from the the directory chosen during the setup download.
  2. Click the Yes button to proceed with the installation.
  3. Click the Next button to begin the installation.
  4. Select "I accept the agreement" and click the Next button.
  5. Click the Next button again, and the installation wizard will request the Subversion install location.
  6. Accept the default, C:\Program Files\Subversion, by clicking the Next button. The installation wizard will then request the start menu folder.
  7. Accept the default, Subversion, and click the Next button. The installation wizard will then request whether you want to install desktop and Quick Launch icons.
  8. Make your desired selections for shortcut icons and click Next to finalize the installation wizard selections.
  9. Finally, on the "Ready to Install" screen, click the Install button to begin the installation. You will receive an information screen after the installation is complete.
  10. Click Next and then Finish to complete the installation. The installation wizard should ask if you want to restart your system. Click Yes to restart your system.

When your system restarts, you should verify that the Tortoise Subversion Windows Explorer plugin was successfully installed. From within Explorer, right-click on any directory. You should see a new menu item: TortoiseSVN. Click on this entry and you should see another menu list. Select the About menu option. You should receive the TortoiseSVN 1.1.1, Build 1857 about dialog box.

3.2 Check Out the Mono Source Code

In order to build Mono, you will need to check out three source subtrees: mono, mcs, and libgdiplus. To anonymously check out the Mono source code:

  1. First, create a directory as a sandbox to check out the source code files. I suggest C:\monosvn\mono\x.x, where x.x should represent the version of the source code.
  2. From within Windows Explorer, locate the sandbox directory you created in the previous step and right-click on the directory.
  3. You should have two TortoiseSVN menu options. Select the Checkout option.
  4. The Subversion Checkout dialog will appear. In order to access the Mono Project source code, you need to point the Subversion client to the Mono Project Subversion repository. In the URL for repository enter "svn://".
  5. Ensure that your sandbox directory is identified in the checkout directory, and click Ok.
    Note: When the checkout is complete, the subtree will appear in the sandbox directory in explorer. The directory icon will appear with a little check in the lower left-hand corner. This illustrates that the directory was checked out from Subversion.
  6. You need to export the directory into your Cygwin directory structure. Right-click on the c:\monosvn\mono\1.2 directory. On the context menu, select TortoiseSVN and then export. Subversion will provide the Browse For Folder dialog window.
  7. Select C:\cygwin\download\mono-1.1.4 and then click Ok. This will copy the files from the sandbox to the build directory.
  8. Repeat the checkout and export steps for the mcs and libgdiplus subtrees. In the checkout step, substitute the subtree at the end of the repository URL, for example: "svn://".

3.3 Build Setup

You are now almost ready to begin the build process. You first need to take care of few preparatory steps and then you'll be ready for the build. These fews steps will redirect the calls for the C# compiler to the Mono C# compiler, allowing you to build Mono with Mono. To finish our preparations, complete the following:

  1. From within the Cygwin environment, type mkdir -p /opt/mono and press Enter.
  2. You now need to mount, within the Cygwin environment, the root directory you used for the Mono combined installation. Enter mount -s c:/mono/Mono-1.1.3 /usr/local and press Enter.
  3. Next, you need to create two symbolic links. First type ln -s /usr/local/bin/mcs ./csc.exe and press Enter. This will substitute the Mono C# compiler for the C# compiler. You can test this by typing csc.exe --version. You should receive the result shown in Figure 4.

    Figure 4. csc.exe --version output
    Figure 4. Checking the CSC version

  1. Next you need to type ln -s /usr/local/bin/monoresgen.exe ./resgen.exe and press Enter. This will substitute the Mono Resource File Generator for the .NET Framework Resource File Generator. Confirm this by typing resgen.exe. You should receive the result shown in Figure 5.

    Figure 5. resgen.exe output
    Figure 5. Generating the resources

3.4 Building Mono With Mono

Finally, you are ready to build Mono with Mono. From the mono subdirectory, you will complete the three-step build process involving autogen, make, and make install. To finish the process:

  1. From within the Cygwin environment, type cd /download/mono-1.1.4/mono and press Enter. This will put you in the Mono directory of the source code.
  2. Type ./ --prefix=/opt/mono --with-preview=yes and press Enter. If autogen encounters any problems with the environment or in terms of dependencies, it will stop. If the process does not halt, you should receive a long stream of console comments; at the end, however, it should resemble Figure 6.

    Thumbnail--click for full-size image.
    Figure 6. Building Mono--Click for full-size image

  1. Type make and press Enter. The make command will take a few minutes, so please be patient. Also, just as with the autogen command, the make command will produce a long stream of console comments. What you should be alert for is any type of error message that appears immediately before the make command completes. The output should look like Figure 7.

    Figure 7 - make results
    Figure 7. Making Mono

  1. Type make install and press Enter. Once again, this will take a few minutes. A successful make install should look like Figure 8.

    Thumbnail--click for full-size image.
    Figure 8. Making the installer--Click for full-size image.

Congratulations! This concludes the Mono build with Mono process.

4. Post-Build Instructions

Now that you have successfully built Mono, you now have a directory structure in /opt/mono that is similar to the one that the Mono Combined installer creates for Win32. Keep in mind that the resulting output does not include GTK+, Gtk#, MonoDoc, or XSP. Also missing are prerequisites that almost never change and that originate from other parties like Microsoft (as in the case for msvcr71.dll, found in C:\mono\Mono-1.1.3\bin). However, you now have the essence of the latest Mono release. Your options at this point include repackaging all of the framework and its supporting components or just using a particular library or executable that you know was just fixed in SVN.

To verify the results of the build process, change to the prefix directory, /opt/mono, and study its contents and structure. There are two significant kinds of files created in the directory hierarchy. There are binary files like /opt/mono/lib/mono/1.0/mcs.exe and /opt/mono/lib/mono/1.0/System.Xml.dll. These are examples of managed assemblies. Other resulting binary files include unmanaged executables and static libraries such as /opt/mono/bin/monodis.exe and /opt/mono/lib/libmono.a.

The build process also creates many configuration and/or supporting files that might contain file PATH information that is specific to the choices made when was run for the first time (remember ./ --prefix=/opt/mono --with-preview=yes? Refer to 3.4, "Building Mono With Mono"). Examples of these files are /opt/mono/lib/pkgconfig/mono.pc and /opt/mono/bin/ilasm. These are generic text files, so you can edit their contents with any ASCII-friendly text editor. Changing these files is a critical function of the Windows Combined Installer, as you will now see.

In theory, you could take all of the child directories that are found in /opt/mono and simply copy and paste them over to C:\mono\Mono-1.1.3. Unfortunately, the text files that I mentioned above contain an unusable path reference to /opt/mono. The Windows operating system would not be able to resolve this path, and your Mono installation would not work. Remember, that path is only viable in the Cygwin environment, which is not required to run the resulting Mono in Win32. You would also be missing some batch files that parallel the shell scripts. The batch files are the ones that actually invoke the execution of the Mono runtime (C:\mono\Mono-1.1.3\bin\mono.bat) and indispensable tools like gacutil (C:\mono\Mono-1.1.3\bin\gacutil.bat) while in Windows. In fact, if you were to look at the Inno Setup installer script that was used to generate mono-1.1.3-gtksharp-1.9.1-win32-0.4.exe, you will notice that the largest portion of the script goes to searching and replacing a constant, C:\Target, by the path that the user selects during the installation routine.

5. Call to Action

Today, building and deploying Mono on the Win32 platform without the Win32 Mono Combined installer requires extensive manual intervention. This must change. The Linux Mono community enjoys great autonomy with the Linux build process. As I have described, it is clear that the Windows Mono community does not share that same autonomy. I understand that this is partially because Mono originates from a Linux-friendly environment. However, I'm sure that the same spirit of innovation and ingenuity that has distinguished the Mono project thus far, can also help resolve this disparity. Therefore, I urge the Mono community and especially the core Mono team to provide the necessary guidance, resources, and focus to help automate the Windows build and deployment process. I'm sure that if we accomplish this goal, we will unleash significant pent-up demand for the Mono project from the Windows C# community. And if there's anything I've learned about open source software, is that it is all about the community, and the bigger the community the better.


As has been the case for me so many times before, this effort would not be possible without the determination and drive of my good friend Francisco (Paco) Martinez. Through countless hours and cups of coffee, he perfected this process and then made it seem simple as we went through it step by step. Eric Raymond once said that you're not a hacker until someone calls you one, so I'm here to say: "Paco is a hacker extraordinaire." With the continued support of O'Reilly Network, we look forward to sharing many other articles focusing on Mono for Windows geeks.

Kevin Shockey is an emerging high technology entrepreneur.

Return to