lunes, mayo 04, 2015

Autotools (VI): Creando librerías estáticas

Cuando se está compilando un programa, puede que sea necesario compilar varios ficheros para crear una librería estática que se utilizará para enlazar su contenido con varios ejecutables, aunque posteriormente, dicha librería no se instalará en el sistema. El sistema de autotools tiene una serie de macros que permiten realizar esta labor con una pequeña configuración.

Para empezar, es necesario que el fichero configure.ac incluya la macro AC_PROG_RANLIB:

1 dnl Esto es un comentario
2 dnl Esta macro fuerza a una versión mínima de autoconf
3 AC_PREREQ([2.59])
4 AC_INIT([tut4],[1.0],[cterron@users.sourceforge.net],[tut4.tar.gz],[https://sourceforge.net/p/autotutorial/])
5 dnl Necesitamos el compilador de C
6 AC_CONFIG_HEADERS([config.h])
7 AC_PROG_CC
8 AC_PROG_RANLIB
9 dnl Init automake
10 AM_INIT_AUTOMAKE
11 dnl Debe de ir al final de la plantilla. Genera el fichero config.status
12 AC_CONFIG_FILES([Makefile])
13 AC_OUTPUT

Ahora supongamos que se quiere crear la librería libtest.a que vamos a enlazar para generar el fichero tut4. La librería se generará a partir de los ficheros de código fuente test1.c, test2.c y test3.c. Las macros que utilizaremos en el fichero Makefile.am permitirán que se genere toda la lógica que permite la compilación de la librería. Veamos un fichero de ejemplo:

1 bin_PROGRAMS= tut4
2 tut4_SOURCES = tut4.c
3 # Creación de la librería
4 noinst_LIBRARIES = libtest.a
5 libtest_a_SOURCES = test1.c test2.c test3.c
6 libtest_a_CFLAGS = -DTEST="Defined"
7 tut4_LDADD = libtest.a

La primera macro es la que define la librería que se quiere crear noinst_LIBRARIES, definiendo el nombre de la librería que se quiere crear. Si esta librería es libtest.a, los prefijos que se va a usar para definir las fuentes y los flags serán libtest_a_ . Se añade la librería al binario que le va a utilizar con nombre_binario_LDADD.

Como el resto de la serie, el código se puede encontrar en repositorio autotutorial, en SourceForge.

No hay comentarios: