Herramientas de Programación

Curso 2003-2004

Práctica 1: make

En esta práctica se debe diseñar la organización de las fuentes de un proyecto y se deben escribir los makefiles necesarios para su manejo.

Las fuentes que se van a manejar se encuentran en el directorio /iilabs/HP/PRAC1.

Primera parte

En esta parte de la práctica se deben distribuir las fuentes en 3 directorios:

  • Directorio con las fuentes de la biblioteca minig.
  • Directorio con las fuentes de la biblioteca cgi.
  • Directorio con las fuentes de las demostraciones.

Las fuentes de la biblioteca minig son: builtin.cc, error.c, hash.cc, Regex.cc, rx.c, String.cc y los includes de los que dependen.

Las fuentes de la biblioteca cgi son: CGI.cc, Form.cc, FEP.cc, FileStream.cc, Escape.cc, static.cc, StringBag.cc, String.FEP.VHMap.cc, String.FEP.Map, String.SLBag.cc, String.SLList.cc, String.String.AVLMap.cc, String.String.Map.cc y los includes de los que dependen (excepto los ya usados en la biblioteca anterior).

Las fuentes de las demostraciones son: demo.cc y filedemo.cc.

Tras distribuir los fuentes deben escribirse 3 makefiles (uno por directorio) que permitan llevar a cabo los siguientes objetivos principales:

  • all: Generar las dos bibliotecas estáticas: libminig.a y libcgi.a, y los dos ejecutables de demostración: demo y filedemo, dejando cada elemento en el directorio donde están sus fuentes.
  • install: Instalar las bibliotecas en $HOME/lib y los ejecutables en $HOME/bin.
  • clean: Borrar los objetos, bibliotecas y ejecutables generados en los directorios de trabajo, pero no los instalados.
  • dist-clean: Borra tanto los objetos, bibliotecas y ejecutables generados en los directorios de trabajo como los instalados.

Los makefiles deben permitir generar todo lo solicitado y realizar la limpieza desde el directorio de las demostraciones.

Además, se debe realizar el mínimo número de acciones necesarias en cualquier situación. Para lo cual se deben de hacer pruebas borrando alguna de las bibliotecas o de los objetos y reintentando el objetivo all.

Para generar las bibliotecas estáticas se utilizará la orden ar. Ver página de manual (man ar).

Segunda parte

Hay que repetir el proceso de la primera parte pero generando las bibliotecas compartidas: libminig.so y libcgi.so.

Para ello, se utilizará la opción -shared del linker. Ver página de manual (man ld).

Es conveniente borrar las bibliotecas estáticas antes de generar las compartidas para evitar que enmascaren errores en su generación y uso.

A la hora de realizar las pruebas deberá instanciarse la variable de entorno $LIBRARY_PATH con el camino al directorio donde se encuentren las bibliotecas compartidas: directorio de trabajo o $HOME/lib.

Esto podría evitarse si las librerias se instalasen en /usr/lib o alguno de los directorios enumerados en el fichero /etc/ld.so.conf.
También se podría incluir el directorio $HOME/lib en /etc/ld.so.conf y ejecutar ldconfig (siendo root).
Puesto que todos los alumnos van a crear las mismas bibliotecas, ninguna de estas posibilidades tiene sentido en este caso.