Programación de Aplicaciones GNU/Preliminares

Antes de comenzar con la programación de aplicaciones es bueno conocer algunas cosas. Lo que es totalmente necesario es conocer el lenguaje de programación en que vamos a desarrollar la aplicación. El proyecto GNU recomienda el uso de C, aunque no descarta ninguno de los otros. La razón de la programación en C y no en otro lenguaje, es porque casi todos los programadores lo conocen, y además C es un estándar bien definido.

Compilación e instalación de software GNU

editar

El software libre es distribuido con el código. Muchas distribuciones como GNU/Linux Debian mantienen unos gestores de aplicaciones en los cuales no es necesario el código fuente, pues está compilado para la plataforma. Sin embargo, se ha de conocer la forma de instalar aplicaciones a partir del código, mediante la compilación y el enlazado con las librerías que disponemos. La forma de instalar paquetes GNU es muy sencilla, y por regla general se suele hacer de la misma forma, aunque como en todo siempre hay excepciones.

  1. Normalmente el código se distribuye en un único fichero comprimido y empaquetado, y tienen la extensión .tar.gz o .tar.bz2 (dependiendo de la compresión). El nombre de los ficheros suele ser paquete-versión.tar.gz, donde paquete es el nombre del paquete (aplicación) y versión es un número formado por dos cifras (1.0, 3.18). Lo primero que tenemos que hacer es descomprimirlo y desempaquetarlo en un directorio:
 tar -xvf paquete-version.tar.gz ó tar -xvf paquete-version.tar.bz2

Mirando el directorio, nos encontramos con el fichero README. Este fichero contiene información relativa sobre el paquete, además de indicar sugerencias de instalación y dependencias con otros paquetes.

  1. Ahora hay que configurar el código a nuestras necesidades y disponibilidad . Con ello lo que hacemos es configurar los ficheros Makefile, que se usarán para la compilación. Con el comando
 ./configure --help

se puede ver las opciones de configuración disponibles. Normalmente, a menos que queramos indicar el directorio de instalación o de añadir/quitar opciones de la aplicación, podemos llamar a configure sin ninguna opción:

 ./configure
  1. Para compilar el paquete ejecutamos:
 make

Si queremos comprobar que las opciones que queremos funcionan, o que todo funciona bien, podemos ejecutar

 make check

con lo que ejecuta los test que dispone

  1. Para la instalación, dependiendo del directorio donde queramos instalarlo, necesitaremos ser administradores. Normalmente el directorio de instalación por defecto es /usr/local. Aunque se puede modificar con la opción --prefix=/directorio/de/instalación al llamar a configure. Para instalarlo, ejecutamos
 make install

Cuando se termina con la instalación se recomienda hacer un make clean y copiar el directorio del paquete a /usr/src o /usr/local/src, para mantener una copia de la configuración que se ha hecho.

Configuración

editar

El programa configure es un shell script que comprueba que nuestro sistema está listo para ejecutar la aplicación, es decir, que no le falten los programas dependientes, o si es posible activar una opción. Cuando el script termina, nos genera un Makefile a partir de la plantilla Makefile.in. Antes este script era creado a mano, pero se puede automatizar con Autoconf y el fichero configure.in

El fichero Makefile.in, tampoco se escribe a mano, se genera a partir del fichero Makefile.am y el programa Automake

 Autoconf y Configure.in → configure
 Automake y Makefile.am → Makefile.in
 configure y Makefile.in → Makefile

Mediante la opción --help, se muestra una lista completa de todas las opciones en la configuración. Una de las más importantes es --prefix, y sirve para indicar el lugar de instalación del software. Por defecto, la instalación es en /usr/local, y mediante --prefix se puede modificar. La instalación no se realiza sobre un único directorio, sino que se divide en subdirectorios dependiendo de los ficheros a instalar. Por defecto son:

Ejecutables → /usr/local/bin
Librerías → /usr/local/lib
Ficheros de Cabecera → /usr/local/include
Páginas Man → /usr/local/man/man?
Ficheros Info → /usr/local/info

Si indicamos --prefix=/usr, la instalación se modificaría a:

Ejecutables → /usr/bin
Librerías → /usr/lib
Ficheros de Cabecera → /usr/include
Páginas Man → /usr/man/man?
Ficheros Info → /usr/info

Al igual, también se pueden modificar los directorios de instalación para los distintos tipos con: --exec-prefix=, --lib-prefix=, etc. Un ejemplo de ello sería cuando tenemos dos sistemas operativos usando el mismo sistema de ficheros para las aplicaciones. Por tanto, podemos tener los datos compartidos como la documentación o los ficheros de cabecera, pero debemos mantener separados los binarios de un sistema de otro.

Ejecutables GNU/Linux → /usr/local/gnulinux/bin
Ejecutables GNU/Hurd → /usr/local/gnuhurd/bin
Librerías GNU/Linux → /usr/local/gnulinux/lib
Librerías GNU/Hurd → /usr/local/gnuhurd/lib
Ficheros de Cabecera → /usr/local/include
Páginas Man → /usr/local/man/man?
Ficheros Info → /usr/local/info

También, algunos paquetes permiten activar y desactivar ciertas funcionalidades cuando se configura el código. Para ello se pueden usar distintas opciones:

 --with-package
 --without-package
 --enable-funcionalidad
 --disable-funcionalidad

donde package es el nombre del componente que queremos compilar e instalar, normalmente depende de algún otro paquete, aunque también podemos no instalarlo mediante --without-package. Mediante --enable/--disable, le indicamos las opciones que queremos activar/desactivar.

Make y Makefiles

editar

El programa make utiliza los comandos shell necesarios para la compilación, pruebas e instalación de las aplicaciones. Sin embargo necesitamos un fichero adicional, el Makefile. En este fichero se indica cómo se han de realizar la compilación, las pruebas y las instalaciones. Hay un fichero Makefile en cada subdirectorio, que es llamado desde el Makefile del directorio principal. En el fichero Makefile, se definen los objetivos (target) o tareas que puede hacer el make. La tarea por defecto es la compilación (no se indica ninguna opción al make), y para realizar las otras tareas se llama al make seguido con el objetivo que queremos (install, check, etc)

 make [target]

Las tareas que realiza un programa de GNU son:

  • clean - Elimina los ficheros generados al ejecutar make (compilación) y make check (pruebas), pero no borra el generado por configure
  • distclean - Hace los mismo que clean, y además borra los ficheros generado por configure. Es como si se volviera a desempaquetar.
  • maintainer-clean - Hace lo mismo que distclean, y además borra los fichero generados con Automake y Autoconf
  • install - Instala la aplicación
  • uninstall - La desinstala (se debe tener la configuración con la que se instaló)
  • check - Ejecuta los tests de pruebas
  • dist - Genera un paquete para la distribución
  • distcheck - Hace los mismo que dist, y además comprueba que la distribución funcione bien. Es decir, lo desempaqueta, lo configura, lo compila, lo prueba y lo instala en un directorio temporal
  • tags - Genera un fichero de TAGS que es usado por GNU Emacs

Hacer una construcción VPATH

editar

Las aplicaciones autoconfiguradas, que han sido desarrolladas con autoconf, soportan la construcción mediante VPATH. En la construcción mediante VPATH, el código está almacenado en un directorio de solo lectura (o puede que no), y el directorio que contendrá los ficheros generados por la compilación estarán en otro directorio aparte donde se pueda escribir. Con lo cual tendremos dos árboles de directorios, uno para los ficheros fuente (source tree) y otro para los ficheros generados por la compilación (build tree). El build tree puede ser subdirectorio del source tree, aunque no se recomienda.

Para poder utilizar esta funcionalidad es necesario que el código sea compilado con GNU Make, porque muchos de los Unix make no lo soportan, y además las aplicaciones han de haber sido desarrolladas con GNU Build System, o que el desarrollador lo haya implementado en su fichero configure.

Por ejemplo suponer que en el directorio /source/foo-1.0 tenemos los ficheros fuente, y queremos tener una construcción en /build/foo-1.0

 cd /build/foo-1.0
 /source/foo-1.0/configure ...options...
 make
 make check

Las ventajas de usar VPATH son:

  1. Permite dejar el directorio con ficheros fuentes limpio de archivos compilados
  2. Quitar la construcción, se puede hacer mediante el borrado del build tree
  3. Permite construir el mismo código con distintas opciones, permitiendo probarlas mediante test y ver cuales son las más eficientes (de forma más sencilla)