Manual de C/C++ en Linux: El estándar de programación GNU
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 Mundo\n"); }
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:
/HolaMundo-0.1 > AUTHORS > ChangeLog configure configure.in > COPYING > INSTALL Makefile.am Makefile.in > NEWS > README > TODO /src callbacks.c callbacks.h interface.c interface.h main.c Makefile.am Makefile.in
Estos son los archivos generados por automake y compañía:
/HolaMundo-0.1 AUTHORS ChangeLog > configure > configure.in COPYING INSTALL > Makefile.am > Makefile.in NEWS README TODO /src callbacks.c callbacks.h interface.c interface.h main.c > Makefile.am > Makefile.in
Esto es el código fuente:
/HolaMundo-0.1 AUTHORS ChangeLog configure configure.in COPYING INSTALL Makefile.am Makefile.in NEWS README TODO /src > callbacks.c > callbacks.h > interface.c > interface.h > main.c Makefile.am Makefile.in
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.
Deja un comentario