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:
- mono
- xsp
- libgdiplus
- nuget
- nant
- mod_mono
- gtksharp
- vb.net
Assumptions
- For simplicity, I’ve ommitted the ‘sudo’ from the parts where it is needed.
- The source code is going to be checked out under
/usr/local/src
. - Installation is going to be made in
/usr/local
.
Prerequisites
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:
mkdir /usr/local/src
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.
mono
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
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
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
tests/Makefile.am
First, edit src/gdiplus-private.h
. Instead of including the
filefreetype/tttables.h
, you need to include
ft2build.h
and 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
nuget certificates
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.
nuget
And now, nuget itself. Why not create a script so that nuget can be easily accessible from the command line?
First, download 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.
nant
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 /usr/local/lib
. So
Create a shell script named nant
and place it in
/usr/local/bin
:
#!/bin/sh
exec mono $MONO_OPTIONS /usr/local/lib/nant-0.92/bin/NAnt.exe $*
you might need to invoke it with MONO_OPTIONS=--runtime=v4.0
You’ll probably need to modify NAnt.exe.config
too.
- set mono-4.5 the default
```
``` </li> - 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 source
The 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_mono
If 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, thea2enmod
utility is looking for module configurations in the directory/etc/apache2/mods-available
. If you want to usea2enmod
, you should linkmod_mono.conf
inside 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> ```gtksharp
gtksharp 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.gtk3
First 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 ```gtk2
Prerequisites: ``` 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.net
This one goes pretty fast: ``` git clone https://github.com/mono/mono-basic.git cd mono-basic ./configure --prefix=/usr/local make make install ```Summary
The 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 ```