Imprimir

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:

  1. el archivo principal (.c), que contiene la función main.
  2. headers o archivos cabecera (.h), que contienen los prototipos de las funciones.
  3. 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:

Contenido tar.gz

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