Biblioteca de empaquetamiento Cabal

De Wikihaskell
Saltar a: navegación, buscar
Empaquetamiento
Compilación y empaquetamineto de bibliotecas y programas Haskell
Lenguaje Haskell
Biblioteca Cabal
Autores Moisés Palmero Montero
Rafael Sánchez Martínez
Built-with-Cabal-light.png

Cabal es un sistema para compilar y empaquetar bibliotecas y programas Haskell. Define una interfaz de facto, para que tanto creadores cómo distribuidores puedan empaquetar y compilar fácilmente sus aplicaciones de forma portable. Cabal es parte de una gran infraestructura para la distribución, organización y catalogación de bibliotecas y programas Haskell. Básicamente, Cabal describe cómo es una librería, cómo interactúa con el lenguaje y para qué implementaciones de Haskell están destinados estos paquetes.

Cabal funciona junto a HackageDB, que es un repositorio de paquetes Haskell. Cada paquete tiene un formato Cabal, que cómo comentábamos arriba es un formato estándar de empaquetamiento, lo que en Java llamaríamos un jar, más en concreto con la vertiente Maven[1]. HackageDB y Cabal son componentes software del proyecto Hackage.

Contenido

Instalando Cabal en Linux

Una vez hemos hecho una rápida introducción acerca de qué es Cabal, el siguiente paso sería instalarnos el software necesario para poder empaquetar ó desempaquetar una biblioteca. Así por ejemplo un primer caso de uso sería la instalación de Cabal, como tal.

La versión que vamos a instalar es la 1.6.0[2]. Necesitamos un intérprete de comandos, que podemos descargar de aquí. UNIX[3], Windows[4]. Ejecutamos el script bootstrap.sh para descargar e instalar dependencias. Hackage se conecta al repositorio por HTTP y son necesarias. Si falta la instalación de GHC, parsec, network, estos son los paquetes que hay que instalarse en un sistema debian:

 $  sudo apt-get install ghc6 libghc6-parsec-dev libghc6-network-dev libghc6-http-dev libghc6-mtl-dev zlib1g-dev.

Añadimos cabal al path...~/.cabal/bin y ejecutamos:

 $ cabal update 

Con esto actualizamos nuestro repositorio local con HackageDB. Ya tenemos la shell de Cabal instalada.

Ahora pasamos a instalar Cabal. Descomprimimos el tar del paquete Cabal y ejecutamos sudo cabal install dentro del descomprimido.

Registering Cabal-1.6.0.2...
Reading package info from "dist/installed-pkg-config" ... done.
Writing new package config file... done.


Uso de Cabal-Install

Guía de comandos de Cabal-Install

 Usage: cabal [GLOBAL FLAGS]
    or: cabal COMMAND [FLAGS]
 
 Global flags:
  -h --help            Muestra esta información de ayuda
  -V --version         Muestra la versión
     --numeric-version  Muestra solamente el número de la versión
 
 Commands:
   install      Instala una lista de paquetes.
   list         Lista los paquetes disponibles en el servidor
   update       Actualiza los paquetes instalados
   fetch        Descarga paquetes para su posterior instalación o estudio
   upload       Sube paquetes fuente a Hackage
   configure    Prepara la construcción del paquete
   build        Hace que el paquete esté listo para la instalación
   copy         Copia los ficheros en la dirección de instalación
   haddock     Genera documentacion HTML con Haddock
   clean        Limpia despues de una instalación
   sdist        Genera un fichero fuente de distribución (.tar.gz).
   hscolour     Genera código de color con HsColour, en formato HTML
   register     Registra éste paquete con el compilador
   test         Ejecuta el conjunto de pruebas si existe (configurar con UserHooks)
 
 Paso típoco para instalar paquetes con Cabal:
   cabal install [PAQUETES]
 
 Ocasionalmente necesitas actualizar la lista de paquetes disponibles:
   cabal update
 
 Para mas información sobre un comando, prueba 'cabal COMANDO --help'.


Instalación de una biblioteca en Windows

Instalar GHC

Lo primero que hay que hacer es instalar el compilador GHC (Glasgow Haskell Compiler). GHC es requerido por cabal.exe para la ejecución de sus comandos. Además, cabal registra los paquetes descargados en el compilador, lo cual nos ahorra bastante trabajo.

El instalador de GHC para Windows se puede descargar en:

http://www.haskell.org/ghc/download.html

Una vez en esta página, elegid el link que está debajo del subtítulo “Current Stable Release”, que tiene el número de la última versión estable.

Dentro de la página a la que os lleva este link, se puede encontrar el ejecutable de la instalación para Windows. Dicho ejecutable tiene la siguiente estructura de nombre:

ghc-x.y.z-i386-windows.exe

La instalación se realiza siguiendo las instrucciones. Es una instalación sin ninguna dificultad.

Descarga

Descargar el ejecutable para Windows de Cabal, y comprobar que funciona.

El ejecutable se descarga en el siguiente link:

http://haskell.org/cabal/release/cabal-install-latest/cabal.exe

Una vez descargado, copiad el ejecutable a cualquier carpeta que esté en el path del sistema, para que pueda ser llamado desde cualquier sitio en la ventana de línea de comandos.

Podéis comprobar su funcionamiento desde cualquier carpeta del PC ejecutando la siguiente orden:

>cabal --version
cabal-install version 0.6.2
using version 1.6.0.2 of the Cabal library

Si todo ha ido bien, Cabal mostrará su número de versión.

Otra opción del comando cabal que se puede ejecutar para probarlo es:

>cabal --help

Comprobación de permisos

Aseguraros de que nuestro usuario posee los permisos necesarios para crear estructuras de carpetas en la siguiente carpeta:

C:\program files\haskell.

Cabal descarga los paquetes en esta carpeta. Cread la carpeta si no existe, y si existe comprobad los permisos. No tener los permisos adecuados puede crear problemas en Windows Vista.

Instalar un paquete para su uso

Se pueden encontrar multitud de bibliotecas para Haskell en el sitio web “Hackage” (http://hackage.haskell.org)

Las bibliotecas de Hackage están empaquetadas con Cabal. Para usarlas, lo primero que hay que hacer es instalarlas en nuestra máquina.

El funcionamiento de Cabal es parecido al de rpg de Linux. Por lo tanto, necesitáis una conexión a internet para conseguir que funcione.

La primera vez que intentéis usar cabal, os pedirá que ejecutéis la opción update para generar la estructura del repositorio de paquetes en vuestro PC. De manera que, en este moemento, podéis hacer:

>cabal update

Si todo va bien, ya estamos en disposición de instalar un paquete.

Probaremos con instalar la biblioteca “xml”:

>cabal install xml
Resolving dependencies...
Downloading xml-1.3.4...
Configuring xml-1.3.4...
Preprocessing library xml-1.3.4...
Building xml-1.3.4...
[1 of 6] Compiling Text.XML.Light.Types ( Text\XML\Light\Types.hs, dist\build\Text\XML\Light\Types.o )
[2 of 6] Compiling Text.XML.Light.Output ( Text\XML\Light\Output.hs, dist\build\Text\XML\Light\Output.o )
[3 of 6] Compiling Text.XML.Light.Proc ( Text\XML\Light\Proc.hs, dist\build\Text\XML\Light\Proc.o )
[4 of 6] Compiling Text.XML.Light.Input ( Text\XML\Light\Input.hs, dist\build\Text\XML\Light\Input.o )
[5 of 6] Compiling Text.XML.Light.Cursor ( Text\XML\Light\Cursor.hs, dist\build\Text\XML\Light\Cursor.o )
[6 of 6] Compiling Text.XML.Light   ( Text\XML\Light.hs, dist\build\Text\XML\Light.o )
C:\ghc\ghc-6.10.4\bin\ar.exe: creating dist\build\libHSxml-1.3.4.a
Installing library in C:\Program Files\Haskell\xml-1.3.4\ghc-6.10.4
Registering xml-1.3.4...
Reading package info from "dist\\installed-pkg-config" ... done.
Writing new package config file... done.

En caso de existir alguna dependencia con otra biblioteca, cabal descarga e instala todas las dependencias. Además, registra automáticamente las bibliotecas para ghc. Podeis comprobarlo ejecutando el comando:

>ghc-pkg list

Este comando os dirá las bibliotecas disponibles para la compilación.

Para el siguiente ejemplo, descárgate la biblioteca “boxes”:

>cabal install boxes

Problemas Comunes en Windows

No existe la capa intérprete de comandos sh

Este problema es fácilmente reconocible porque, al intentar instalar un paquete, obtenemos un error parecido a éste:

Error "sh: runProcess: does not exist (No such file or directory)"

La clave está en sh: sh es el ejecutable de la capa intérprete de comandos de unix/linux. El problema aquí estriba en que, por la forma en que fué diseñado, el paquete intenta ejecutar un shell script de linux, y lógicamente, Windows no viene preparado para ello de fábrica.

Este problema se soluciona fácilmente. En nuestro socorro viene Cygwin. Cygwin es un conjunto de aplicaciones pensadas para simular los aspectos más relevantes de la interacción de unix/linux con nuestro computador, entre ellos, la ejecución de shellscripts.

Por tanto, si experimentais este problema, instalad Cygwin en vuestro sistema. Es una instalación bastante fácil.

En Windows Vista, recomendamos que no utilicéis \Program Files para que residan ahí paquetes o instalaciones de este tipo.

Instalaos el paquete Cygwin completo. No hace daño, y seguro que teneis espacio de sobra en el disco duro.

La instalación no modifica el path del sistema, así que eso necesitais hacerlo vosotros mismos. Si habéis realizado la instalación por defecto, la carpeta que tendréis que añadir a vuestro path será c:\cygwin\bin.

Podeis comprobar que la instalación se ha realizado correctamente ejecutando sh desde la línea de comandos.

>sh
sh-3.2$ exit
exit

Una vez correctamente instalado, este problema desaparece.

No se encuentra un compilador de C o C++

Otro problema que nos podemos encontrar es la ausencia de un compilador de C o C++ en nuestro computador. De nuevo nos encontramos con el hecho de que Windows no lo trae de fábrica.

Podemos localizar este problema cuando nos encontramos un error como el siguiente:

checking for gcc... no
checking for cc... no
checking for cl.exe... no
configure: error: no acceptable C compiler found in $PATH

También existe una solución para esto: instalarse un compilador de C++. Nosotros hemos optado por MinGW

La descarga de un instalador para windows la encontramos en el siguiente link. Se trata de una referencia a la última versión disponible en SourceForge.

http://www.mingw.org/wiki/HOWTO_Install_the_MinGW_GCC_Compiler_Suite

Sólo hay que seguir las instrucciones. Al final, también tenemos que añadir el path a nuestro sistema:

c:\minGW\bin

Una vez instalado, cabal podrá compilar los archivos C o C++ incluidos en los paquetes.

Ejemplos

Uso de la biblioteca "boxes"

Para vuestra referencia, la página de esta biblioteca la podéis encontrar en:

http://hackage.haskell.org/package/boxes-0.1.1

En un paso anterior, habéis descargado la biblioteca con cabal. Podeis aseguraros de que está disponible para el compilador:

ghc-pkg list
C:/ghc/ghc-6.10.4\package.conf:
   Cabal-1.6.0.3, HUnit-1.2.0.3, QuickCheck-1.2.0.0, Win32-2.2.0.0,
   array-0.2.0.0, base-3.0.3.1, base-4.1.0.0, boxes-0.1.1,
   bytestring-0.9.1.4, containers-0.2.0.1, directory-1.0.0.3,
   (dph-base-0.3), (dph-par-0.3), (dph-prim-interface-0.3),
   (dph-prim-par-0.3), (dph-prim-seq-0.3), (dph-seq-0.3),
   extensible-exceptions-0.1.1.0, filepath-1.1.0.2, (ghc-6.10.4),
   ghc-prim-0.1.0.0, haddock-2.4.2, haskell-src-1.0.1.3,
   haskell98-1.0.1.0, hpc-0.5.0.3, html-1.0.1.2, integer-0.1.0.1,
   mtl-1.1.0.2, network-2.2.1.2, old-locale-1.0.0.1, old-time-1.0.0.2,
   packedstring-0.1.0.1, parallel-1.1.0.1, parsec-2.1.0.1,
   pretty-1.0.1.0, process-1.0.1.1, random-1.0.0.1,
   regex-base-0.72.0.2, regex-compat-0.71.0.1, regex-posix-0.72.0.3,
   rts-1.0, split-0.1.1, stm-2.1.1.2, syb-0.1.0.1,
   template-haskell-2.3.0.1, time-1.1.4, xhtml-3000.2.0.1, xml-1.3.4

Después de aseguraros que la librería boxes está disponible para el compilador ghc (ghc-pkg list), cread en un directorio cualquiera un archivo con el nombre “ShowBoxes.hs”

Cortad y pegad lo siguiente dentro del archivo. Contiene el texto del programa que vamos a compilar.

import Text.PrettyPrint.Boxes
main = printBox ((<+>)((//) (text "Arriba Izquierda") (text "Abajo Izquierda")) ((//) (text "Arriba Derecha") (text "Abajo Derecha")))

Abrid una ventana de línea de comandos, y posicionaros en la carpeta donde esté este archivo.

Ahora, ejecutad el siguiente comando:

>ghc --make ShowBox
[1 of 1] Compiling Main             ( ShowBox.hs, ShowBox.o )
Linking ShowBox.exe ...

¡El programa ShowBox.exe está listo para usarse!

Si lo ejecutáis, éste ha de ser el resultado:

>ShowBox
Arriba Izquierda Arriba Derecha
Abajo Izquierda  Abajo Derecha


Creando un paquete

Vamos a ver un ejemplo de creación e instalación de un pequeño programa usando cabal.


Estructura de un proyecto simple

La estructura básica que debe tener un proyecto es la siguiente:

  • Haq.hs -- el código fuente principal
  • haq.cabal -- el fichero de descripción del paquete.
  • Setup.hs-- el script de instalación.
  • _darcs -- control de revisiones (si se ha usado darcs)
  • README -- info
  • LICENSE -- licencia

Esa es la estructura básica para un proyecto con un solo fichero fuente, aunque por supuesto se puede mejorar para proyectos mas complejos, con subdirectorios y varios módulos.


Escriba el código

$ cat > Haq.hs

--
-- Copyright (c) 2006 Don Stewart - http://www.cse.unsw.edu.au/~dons/
-- GPL version 2 or later (see http://www.gnu.org/copyleft/gpl.html)
--
import System.Environment

-- | 'main' runs the main program
main :: IO ()
main = getArgs >>= print . haqify . head

haqify s = "Haq! " ++ s


Añada el fichero de descripción

$ cat > haq.cabal

Name:                haq
Version:             0.0
Description:         Super cool mega lambdas
License:             GPL
License-file:        LICENSE
Author:              Don Stewart
Maintainer:          dons@cse.unsw.edu.au
Build-Type:          Simple
Cabal-Version:       >=1.2
Executable haq
     Main-is:           Haq.hs
     Build-Depends:     base >= 3 && < 5


Añada el script de instalación

$ cat > Setup.hs

import Distribution.Simple
main = defaultMain


Añadir README y LICENSE.

Instala el proyecto

Hay dos formas de instalar el proyecto:

Usando cabal-install:

$ cabal install --prefix=$HOME –user

Usando el script Setup.hs:

$ runhaskell Setup configure --prefix=$HOME --user
$ runhaskell Setup build
$ runhaskell Setup install

Esto instalará tu nuevo programa en $HOME/bin.

Ejecutalo

$ haq me
"Haq! me"


Documentación

Herramientas personales