Introducción
Mono es la alternativa libre y de código abierto del marco de trabajo .NET de Microsoft, una iniciativa de Miguel de Icaza conjuntamente con la empresa Novell, la creadora de la distribución Suse Linux. Su sitio web oficial es http://www.mono-project.com, en el cual se puede encontrar información general, descargas, tutoriales, documentación e intercambiar con la activa comunidad.
En este artículo se abordará el tema de la instalación de Mono a partir del código fuente en Ubuntu o Debian y antes de comenzar, debemos aclarar algunos aspectos particulares:
- Este tutorial se probó con la versión 2.10 de Mono, aunque también puede aplicarse para versiones posteriores a la 2.6.7.
- En mi grupo de desarrollo trabajamos además de Windows con las distribuciones Ubuntu (área de desarrollo) y Debian (área de producción) para abaratar los costos de los servidores de aplicaciones, además de que ofrecen alta disponibilidad, eficiencia y flexibilidad de configuración, mantenimiento, despliegue y compatibilidad. Esto, con el valor agregado de que son sistemas bajo la GPL.
- Aunque los repositorios oficiales de las distribuciones Debian y Ubuntu contienen la última versión con soporte de larga duración (LTS) de Mono (2.6.7 en la actualidad), siempre preferimos usar la última versión liberada, de manera que podamos aprovechar las últimas tecnologías incorporadas y las correcciones de bugs que se realizan con cada release.
Cómo obtener el código fuente de Mono
Para obtener la última versión estable de Mono puede accederse al sitio http://ftp.novell.com/pub/mono/sources/. Las páginas tienen vínculos al estilo FTP y existen más de 50 carpetas con proyectos relacionados con Mono. A continuación veremos una breve descripción de los principales:
Carpeta | Descripción |
libgdiplus/ | Librería nativa que funciona como wrapper del GDI+ de Windows. |
mono/ | Marco de trabajo Mono, que incluye las librerías nativas del CLR, aplicaciones básicas del framework, más la Base Class Library (BCL) junto a varias librerías de clases específicas de Mono. |
mono-debugger/ | Debugger de Mono. |
mono-basic/ | Extensión de Mono para el soporte de proyectos Visual Basic .NET. |
monodevelop/ | IDE similar a Visual Studio para desarrollo de aplicaciones Mono. |
monodevelop-database/ | Extensión para conectarse a varios tipos de base de datos desde MonoDevelop. |
monodevelop-debugger-gdb/ | Debugger para MonoDevelop versión GNU que genera archivos gdb con información de depuración. |
monodevelop-debugger-mdb/ | Debugger para MonoDevelop que genera archivos MDB (Managed Debugging Engine) de Visual Studio. |
monodoc/ | Documentación de Mono. |
mono-tools/ | Herramientas comunes de desarrollo y pruebas para Mono. |
mod_mono/ | Módulo de Apache2 para el hospedaje de aplicaciones ASP.NET. |
ikvm/ | Puerto de Mono para aplicaciones que interactúan con el byte code de Java. |
gtk-sharp/ | Wrapper de las librerías del GTK para Mono. |
gnome-sharp2/ | Wrapper de las librerías de Gnome para Mono. |
gnome-desktop-sharp2/ | Wrapper de las librerías del escritorio Gnome para Mono. |
gluezilla/ | Puerto para Mono de las librerías de Mozilla. |
gtksourceview-sharp-2.0/ | Wrapper de las librerías de GTK para la visualización de código fuente. |
monodevelop-java/ | Add-in de MonoDevelop para proyectos de Java. |
monodevelop-python/ | Add-in de MonoDevelop para proyectos de Python. |
webkit-sharp/ | Librerías con herramientas de internet para Mono. |
xsp/ | Servidor web para desarrollo que permite hospedar aplicaciones ASP.NET. |
moon/ | Librerías y binarios de MoonLight, versión libre de Silverlight. |
Cada carpeta contiene los paquetes de código fuente como archivos compactados (generalmente de extensión .tar.bz2) con el número de la versión. Una vez descargados, se pueden descompactar desde bash con la línea siguiente:
tar -xvf nombreDeArchivo.tar.bz2
Prerrequisitos para la compilación
Antes de comenzar los procesos de compilación, debemos instalar los paquetes de desarrollo que constituyen requerimientos y que normalmente están incluidos en los repositorios. Para ello, podemos ejecutar el siguiente comando desde una terminal bash:
sudo aptitude install build-essential libglib2.0-dev libtiff4-dev \ libgif-dev libpng12-dev libx11-dev libcairo-dev bison gettext
Crearemos el directorio mono dentro la carpeta /opt, la cual se usa normalmente para instalar software que no procede del repositorio. Esto nos traerá dos ventajas:
- La instalación posterior a la compilación se hará completamente dentro del directorio, lo cual nos permitirá copiarla a cualquier otra máquina para usarla sin necesidad de recompilar.
- Podrán convivir varias versiones de Mono, por ejemplo, la 2.6.7 instalada por defecto desde Ubuntu 9.04, y la que compilaremos.
Para crear el directorio podemos hacerlo así:
sudo mkdir /opt/mono
Compilación básica de Mono
Mono requiere de la librería nativa libgdiplus.so para funcionar, fundamentalmente porque es la que usa el ensamblado System.Drawing.dll, por tanto la debemos compilar primero. A continuación, podemos repetir el mismo procedimiento para el código de Mono.
Tres procesos secuenciales definen la compilación.
Configuración
Dentro de las carpetas de los paquetes de código fuente descompactados, se encuentra un archivo con permiso de ejecución denominado configure. A través de él, se realiza la configuración y verificación de los prerrequisitos de manera automática. Aunque su empleo más simple es:
./configure
no usaremos esta alternativa, pues creará las condiciones para que la instalación se realice por defecto en el directorio /usr/local, que no es el que creamos para esos fines. En cambio, utilizaremos la siguiente alternativa, que sí realiza la configuración deseada:
./configure --prefix=/opt/mono
La configuración verifica cada una de las versiones de los encabezados C/C++ que existen en el sistema, comprueba los paquetes instalados y se detiene en caso de algún error o ausencia de algún prerrequisito. Es posible que los mensajes de error no sean muy descriptivos, por lo que incorporamos con anterioridad un epígrafe de prerrequisitos. Además, prepara la compilación e instalación para que se realicen con las opciones especificadas. Puede hacerse lo siguiente para ver una ayuda completa de las opciones de configuración:
./configure --help
Compilación
La compilación se realiza mediante la herramienta make, que se instala con el paquete build-essential. Este último también contiene los compiladores de C (gcc) y C++ (g++) que son utilizados por make para realizar compilaciones consecutivas y diferenciadas. make ofrece la opción -j n la cual usaremos para indicar que la compilación se hará con el máximo uso del CPU (si la computadora tiene procesador Dual Core, Core 2 Duo, Quad Core, etc. será mucho más rápido); en este caso, n indica la cantidad de jobs o procesos paralelos que realizarán la compilación.
El comando para compilar tanto el CLR (código C/C++) como la BCL (código C#), puede ser entonces:
make -j 4
Esto puede demorar, así que sin pena puede levantarse de su asiento, estirarse, tomarse un café o ir al baño. Le aseguro que sin la opción -j podría tranquilamente resolver un Sudoku de dificultad media. Esto me recuerda la primera vez que compilé un código fuente en Linux: se trataba del emulador de Super Nintendo ZSNES, en cuyo README, al final, tenía un mensaje de aliento algo así: "type make, then return, cross your fingers and start praying" (teclee make, luego enter, cruce sus dedos y comience a rezar).
Instalación
Una vez que compruebe que la compilación no terminó con un mensaje en rojo con alguna excepción .NET o un error precedido de varios asteriscos (en cuyo caso tendrá que arreglárselas googleando o con sus propios conocimientos), puede ejecutar el comando para instalar:
sudo make install
La ejecución de este es mucho más rápida y el resultado lo podrá ver dentro de la carpeta /opt/mono, que contendrá las siguientes subcarpetas:
- bin: Archivos binarios y ejecutables de Mono, como el intérprete mono o el compilador de C# gmcs.
- lib: Librerías nativas y ensamblados, junto con la Global Assembly Cache (GAC).
- share: Documentación básica.
- include: Encabezados de C/C++ para el trabajo con librerías nativas del CLR.
- etc: Archivos de configuración.
¿Es todo?
No. Falta reconfigurar la caché de librerías nativas, especificar convenientemente las variables de entorno y probar que el intérprete funciona. El primer paso lo logramos ejecutando como root lo siguiente en bash:
echo /opt/mono/lib >/etc/ld.so.conf.d/mono.conf ldconfig
El primer comando crea el archivo mono.conf en el directorio /etc/ld.so.conf.d/ con el texto "/opt/mono/lib", que es el directorio donde se encuentran las librerías nativas de Mono. El segundo comando actualiza la caché de librerías nativas del sistema, de manera que cuando alguna se solicite, se pueda encontrar sin problemas.
Luego, incluimos las siguientes líneas en el archivo .bashrc de nuestra carpeta home o base :
export PATH=/opt/mono/bin:$PATH
export MONO_GAC_PREFIX=/opt/mono/lib/mono/gac:$MONO_GAC_PREFIX
Incluimos el camino /opt/mono/bin en la variable de entorno PATH para poder ejecutar el intérprete mono directamente. También agregamos el nuevo directorio base del GAC a través de la variable MONO_GAC_PREFIX para que las aplicaciones ejecuten con las últimas versiones de los ensamblados. Por último creamos un archivo HelloWorld.cs con el código siguiente:
using System; namespace HelloWorld { public class MainClass { public static void Main (string[] args) { Console.WriteLine("Hello world!"); } } }
ejecutamos el comando para compilar:
gmcs -r:System.dll -out:HelloWorld.exe HelloWorld.cs
Finalmente ejecutamos:
mono HelloWorld.exe
y obtendremos un amistoso "Hello world!" en la consola.
En otro artículo veremos cómo instalar desde código y configurar MonoDevelop y ASP.NET, así como ejecutar las aplicaciones de Mono sin usar el intérprete y otros aspectos importantes o interesantes.
Hola Jeffrey, me gustaría poder realizar esta labor pero tengo dudas como por ejemplo ¿dónde encuentro el archivo configure? Mencionas que esta dentro de las carpetas de código fuente pero no logro encontrarlo.
ResponderEliminarEspero me puedas guiar, gracias y felicitaciones por el blog y su contenido.
Hola Jorge. Después de usar el comando tar para descompactar los archivos .tar.gz de código fuente, en la raíz de la carpeta que se crean los archivos debe estar el configure. Si no está, entonces habrá cambiado la filosofía de la compilación con make. ¿Desde qué URL descargaste estos archivos?
ResponderEliminarYa entendí!! debo bajar primero la lista de la tabla con los principales paquetes...uff no había entendido disculpa, luego en esas carpetas descomprimidas debe estar el "configure". Yo pasé a la parte de la instalación de los paquetes de desarrollo y no puse atención a lo anterior..que distraído soy, disculpas nuevamente. Voy a realizarlo y te cuento. Gracias por todo, Saludos
ResponderEliminarHola, estoy instalando Mono en Windows 7 y cuando trabajo en Mono-2.10.9 Command Prompt y escribo > mcs -pkg:gtk-sharp-2.0 ejemplo02.cs y al dar enter me dice el error CS0006: Metadata file pango-Sharp.dll could not be found
ResponderEliminar¿podrias ayudarme a solucionar este error?
de antemano gracias.