Difference between revisions of "Building mono from source"

From LSDevLinux
Jump to: navigation, search
(On Mac: Add automake etc. to dependencies)
(Check out sources)
Line 18: Line 18:
  
 
== Check out sources ==
 
== Check out sources ==
 +
 +
Note: If you are developing FieldWorks, you may already have the mono repositories checked out at <code>~/fwrepo/mono</code>.
  
 
You'll need clones of a number of git repositories. The recommended directory layout is to have a single parent directory called <code>mono-sil</code> with the clones as subdirectories:
 
You'll need clones of a number of git repositories. The recommended directory layout is to have a single parent directory called <code>mono-sil</code> with the clones as subdirectories:

Revision as of 15:06, 24 February 2016

We use a custom version of mono that has a number of patches applied relative to the official, "upstream" mono releases. We have forks of the various git repos involved, and a branch named develop in each of these. This branch is based on an official upstream release with additional commits for each of our patches.

Dependencies

On Ubuntu or Debian Linux

$ sudo apt-get install gnulib mono-devel mono-mcs libgif-dev libjpeg-dev libtiff4-dev libexif-dev git quilt

And of course to build the package you'll also need:

$ sudo apt-get install devscripts cdbs

On Mac

$ sudo port install git getopt autoconf automake libtool bison giflib jpeg libpng tiff

Note: port is the MacPorts package management command. For further information, see Build FieldWorks for Mac.

Check out sources

Note: If you are developing FieldWorks, you may already have the mono repositories checked out at ~/fwrepo/mono.

You'll need clones of a number of git repositories. The recommended directory layout is to have a single parent directory called mono-sil with the clones as subdirectories:

  • mono-sil
    • gtk-sharp
    • libgdiplus
    • mono
    • mono-basic
    • mono-calgary

The directory and clones can be created using the following commands:

mkdir mono-sil
cd mono-sil
for R in gtk-sharp libgdiplus mono mono-basic mono-calgary; do
    git clone git@github.com:sillsdev/$R.git
done

The mono repository is fairly large, so this will take a while, especially on slower internet connections.

Build and install

Building mono is done with the BuildOptMono.sh script in mono-calgary. Ensure you are in the mono-sil directory, and then run:

mono-calgary/BuildOptMono.sh

This uses the sudo command internally (to gain permission to install to /opt/mono-sil) and so will ask for your password at various points.

If there are build problems it may help to "clean" the mono subdirectory:

(cd mono && git clean -dxf)

Note that the Linux binfmt system that allows you to execute interpreted programs without specifying the interpreter on the command line (eg by typing just application.exe) will still use /usr/bin/mono unless you reconfigure it.

On Mac

Some environment variables need to be set in order for the build of libgdiplus to find the MacPorts libraries it needs. Unfortunately, when these variables are set the builds of the other repos fail. The solution is to build in two stages, each time restricting the build to a subset of the repos. This is done by passing the name the repo(s) to the build script. You should have some variables set permanently in ~/.profile, but others are set temporarily just for building libgdiplus. The complete sequence of commands is as follows:

export CPATH=/opt/local/include
export LIBRARY_PATH=/opt/local/lib
mono-calgary/BuildOptMono.sh libgdiplus
unset CPATH
unset LIBRARY_PATH
mono-calgary/BuildOptMono.sh gtk-sharp mono mono-basic

gtk-sharp and mono-basic aren't needed for some Mac programs (eg WeSay) and so can optionally be omitted from the list of repos in the second step above.

Updating

Updating is done by pulling the latest changes in each repo and rebuilding. From the mono-sil directory:

for R in gtk-sharp libgdiplus mono mono-basic mono-calgary; do
    (cd $R && git pull)
done
mono-calgary/BuildOptMono.sh