This is an updated guide on how to compile mono from source on Ubuntu. This time, it’s about Ubuntu 14.04 (trusty tahr). This post covers:
- For simplicity, I’ve ommitted the ‘sudo’ from the parts where it is needed.
- The source code is going to be checked out under
- Installation is going to be made in
These are the basic requirements for a build environment. Remember that
apt-get install is supposed to be run as root.
apt-get install git build-essential pkg-config autoconf automake libtool gettext
We’ll be checking out the code in
/usr/local/src, so lets go and create that directory:
After everything is installed you can delete it to save some disk space. Personally I keep it around in case I want to fetch the latest code again from upstream and rebuild.
First, mono itself:
cd /usr/local/src git clone git://github.com/mono/mono.git cd mono ./autogen.sh --prefix=/usr/local make get-monolite-latest make make install
XSP is a web server:
cd /usr/local/src git clone git://github.com/mono/xsp.git cd xsp ./autogen.sh --prefix=/usr/local make make install
libgdiplus is needed for drawing and stuff:
cd /usr/local/src git clone https://github.com/mono/libgdiplus.git cd libgdiplus git checkout 2.10.8
It has some extra prerequisites:
apt-get install libglib2.0-dev libjpeg-dev libtiff5-dev libpng12-dev libgif-dev libexif-dev libx11-dev libxrender-dev libfreetype6-dev libfontconfig1-dev
Now this is going to be tricky. On Ubuntu 14.04, it no longer builds without some editing of the source code. There are just two files to edit:
src/gdiplus-private.h. Instead of including the file
freetype/tttables.h, you need to include
FT_TRUETYPE_TABLES_H. This is shown in the following diff:
ngeor@mini:/usr/local/src/libgdiplus$ git diff src diff --git a/src/gdiplus-private.h b/src/gdiplus-private.h index 59edf9e..283280d 100644 --- a/src/gdiplus-private.h +++ b/src/gdiplus-private.h @@ -30,7 +30,9 @@ #include <stdio.h> #include <math.h> #include <glib.h> -#include <freetype/tttables.h> +#include <ft2build.h> +#include FT_TRUETYPE_TABLES_H +
Then, edit the second file that is causing problems,
tests/Makefile.am. You need to add a LIBS dependency, as shown in the following diff:
diff --git a/tests/Makefile.am b/tests/Makefile.am index 5b8c67c..b07da64 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1,4 +1,5 @@ ## Makefile.am for libgdiplus/tests +LIBS = $(GDIPLUS_LIBS) INCLUDES = -I$(top_srcdir)
This should be enough to make libgdiplus compile with the usual incantation:
./autogen.sh --prefix=/usr/local make make install
For every user that is going to be using NuGet, you need to import some certificates with:
mozroots --import --sync
This needs to be run only once but it should be run for every user that needs nuget. That’s also the user that is running your continuous integration builds.
And now, nuget itself. Why not create a script so that nuget can be easily accessible from the command line?
nuget.exe and copy it to /usr/local/bin/. Then, create the following script:
#!/bin/sh exec mono $MONO_OPTIONS $(dirname $0)/nuget.exe $*
and save it as
/usr/local/bin/nuget. Don’t forget to grant it execute permissions.
I always have some problems when it comes to
nant. Usually something goes wrong with
pkg-config or sometimes it defaults to using .NET 2.0. I tried two approaches here. The first one was to download the latest tarball and try to install it. The second one was to get the latest source and build it. I believe that the second option is better in the end. Here are both of them:
first option: use the latest tarball
Download the latest tarball and extract it into
Create a shell script named
nant and place it in
#!/bin/sh exec mono $MONO_OPTIONS /usr/local/lib/nant-0.92/bin/NAnt.exe $*
you might need to invoke it with
You’ll probably need to modify
- set mono-4.5 the default
- add mono-4.5 definition based on 4.0 ```</ul>
Unable to locate 'mono' module using pkg-config. Download the Mono development packages from http://www.mono-project.com/downloads/. true mcs true linq true true true true true true true mjs strict vbnc true true true sn true false true
second option: build from sourceThe following commands might be just enough to install nant: ``` git clone https://github.com/nant/nant.git cd nant make install MONO='mono --runtime=v4.0' prefix=/usr/local/ TARGET=mono-4.0 ``` Notice the extra parameters trying to convince nant it should use .NET 4.
apache2 mod_monoIf you want to host ASP.NET websites with Apache, you can use mod_mono. Prerequisites: ``` apt-get install apache2-dev ``` Installation: ``` git clone https://github.com/mono/mod_mono.git cd mod_mono ./autogen.sh --prefix=/usr/local --with-mono-prefix=/usr/local make make install ``` Note that the module configuration is installed in
/etc/apache2/mod_mono.conf. However, the
a2enmodutility is looking for module configurations in the directory
/etc/apache2/mods-available. If you want to use
a2enmod, you should link
mod_mono.confinside the expected directory. Or, you can just include the module configuration inside your site configuration as needed. For example: ``` <VirtualHost *:80> ServerName my.site.that.runs.mono.com DocumentRoot /var/www/ Include mod_mono.conf </VirtualHost> ```
gtksharpgtksharp is currently building against gtk3. If you need gtk2 support, you can checkout the latest tag that supports gtk2 and build that. You can also build both of them and install them side by side.
gtk3First the prerequisites: ``` apt-get install libgtk-3-dev ``` And then the usual build: ``` git clone https://github.com/mono/gtk-sharp.git cd gtk-sharp ./autogen.sh --prefix=/usr/local make make install ```
gtk2Prerequisites: ``` apt-get install libgtk2.0-dev libpango1.0-dev libglade2-dev ``` And the build (notice we’re building the tag 2.12.22): ``` git clone https://github.com/mono/gtk-sharp.git gtk-sharp-2 cd gtk-sharp-2 git checkout 2.12.22 ./bootstrap-2.12 --prefix=/usr/local make make install ```
vb.netThis one goes pretty fast: ``` git clone https://github.com/mono/mono-basic.git cd mono-basic ./configure --prefix=/usr/local make make install ```
SummaryThe above will give you mono (latest and greatest!) and more or less anything related to it. One thing that is missing is monodevelop, the IDE. Perhaps I’ll cover that in a future post, together with the programming language boo.
- add mono-4.5 definition based on 4.0 ```