Al programar en C lo habitual es dividir el programa en varios archivos diferentes y estructurar el programa en módulos. Tendremos:
- el archivo principal (.c), que contiene la función main.
- headers o archivos cabecera (.h), que contienen los prototipos de las funciones.
- librerías (.c), que contienen las funciones.
Veamos Hola mundo con estructura modular:
- el archivo principal hello_mod.c:
#include <escribe.h> main() { escribeHolaMundo (); }
- el archivo cabecera /include/escribe.h:
void escribeHolaMundo();
- la librería /lib/escribe.c:
#include <stdio.h> void escribeHolaMundo() { printf ("Hola Mundon"); }
Para compilar hello_mod.c haremos:
$ gcc -I./include hello_mod.c ./lib/escribe.c -o hello_mod |
Aunque el comando gcc admite varias opciones para el enlazado (-I<ruta_header>, -L<ruta_librería> y -l<nombre_librería>), generalmente los programas dependen de muchos headers y librerías diferentes por lo que son demasiado complicados para compilarlos utilizando directamente el comando gcc.
Para resolver este problema (y algunos otros) el GNU desarrolló el estándar de programación GNU y las herramientas automake y compañía. Utilizando los comandos aclocal, autoheader, autoconf y automake se genera el script configure y varios archivos con extensión .in y .am (configure.in, Makefile.in, Makefile.am…). El script configure prepara la compilación del programa y detecta una gran variedad de datos acerca de nuestro sistema: el procesador, el Sistema Operativo, el compilador C, las bibliotecas y los recursos necesarios para compilar el código fuente (si falta algún programa o librería nos avisará). Para crear el archivo Makefile adaptado a nuestra máquina (que utilizará después make para compilar) ejecutaremos:
# ./configure |
Para compilar el programa usaremos make:
# make |
Para instalar el programa en nuestro sistema, poniendo cada cosa en su sitio y dejándolo listo para usar usaremos make install:
# make install |
El comando make suele tener una opción clean que borra el ejecutable y todos los archivos objeto para comenzar la compilación desde cero:
# make clean |
Y también una opción uninstall para desinstalar el programa:
# make uninstall |
Si queremos que el programa se ejecute al iniciar el ordenador añadiremos un script en el directorio /etc/init.d, le daremos permisos de ejecución con:
# chmod a+x /etc/init.d/<script> |
y crearemos enlaces dentro de los runlevels que nos interese:
# ln -s /etc/init.d/<script> /etc/rc2.d/S90<script> |
Si no pensamos volver a compilar el programa podemos borrar el directorio que contiene las fuentes /usr/src/<programa>.
De esta manera, cuando nos descargamos un tar.gz con las fuentes de un programa y lo descomprimimos vemos que su contenido es similar a:
Veamos qué es cada archivo. Estos archivos contienen información:
Estos son los archivos generados por automake y compañía:
Esto es el código fuente:
Nota
La mayor parte del software libre está desarrollado en C, pensado para ser compilado con GCC y empaquetado según el estándar GNU.
Una de las excepciones a las normas de empaquetado de GNU es el kernel Linux que, por su complejidad, incluye un menú de configuración propio y un procedimiento de instalación diferente.