1. Introducción

Una de las diferencias principales entre el software libre y el software propietario es el acceso al código fuente del software. Esto significa que el software libre se distribuye como archivos de ficheros fuente. Esto puede resultar poco familiar a los principiantes, porque los usuarios de software libre deben compilar ellos mismos los fuentes antes de poder usar el software.

Hay versiones compiladas de la mayoría del software libre existente. El usuario apurado no tiene más que instalar estos binarios precompilados. Sin embargo, algún software libre no se distribuye bajo esta forma, o las versiones más recientes todavía no se distribuyen en forma binaria. Más aun, si usa un sistema operativo exótico o una arquitectura exótica, un montón de software no va a estar ya compilado para Usted. Es más, compilar el software uno mismo permite conservar sólo las opciones interesantes o extender las funcionalidades del mismo agregando extensiones para obtener un software que responde perfectamente a sus necesidades.

1.1. Requisitos

Para compilar software, necesitará:

  • una computadora con un sistema operativo funcionando;

  • conocimiento general del sistema operativo que Usted usa;

  • algo de espacio en su disco rígido;

  • un compilador (generalmente para el lenguaje C) y un archivador (tar);

  • algo de comer (en los casos difíciles, puede durar un tiempo largo). Un verdadero hacker come pizza, no tornillos;

  • algo de beber (por las mismas razones). Un verdadero hacker bebe cola con gas – por la cafeína;

  • el número de teléfono de su “gurú” tecnológico, ese que recompila el núcleo todas las semanas;

  • pero por sobre todo, paciencia, ¡y mucha!

Compilar desde el código fuente generalmente no presenta muchos problemas, pero si Usted no está acostumbrado, el menor tropiezo lo puede poner en una posición dificultosa o puede hacer que desista. El propósito de este documento es precisamente mostrarle como escapar de tal situación.

1.2. Compilación

1.2.1. Los principios

Para poder traducir código fuente a un fichero binario, es necesario efectuar una compilación. Esta se hace generalmente sobre programas escritos en lenguaje C o C++ (que son los lenguajes más usados en la comunidad de software libre, notablemente en el mundo UNIX®). Ciertos software libres están escritos en lenguajes que no necesitan compilación (por ejemplo perl o shell), pero aún así, estos necesitan algo de configuración.

Lógicamente, la compilación C está hecha por un compilador C que por lo general es gcc, el compilador libre escrito por el proyecto GNU. La compilación de todo un paquete de software es una tarea compleja, que pasa por la compilación satisfactoria de ficheros fuente diferentes (para el programador es más fácil poner las diferentes partes de su trabajo en ficheros separados, por varios motivos) Para hacer más fácil esta tarea, estas operaciones repetitivas son efectuadas por un utilitario denominado make.

1.2.2. Las cuatro fases de la compilación

Para comprender como funciona la compilación (para poder resolver posibles problemas), uno tiene que conocer las fases involucradas. El objetivo es convertir poco a poco un texto escrito en un lenguaje comprensible por un ser humano entrenado (por ejemplo, el lenguaje C), a un lenguaje comprensible por una máquina (o por un ser humano muy entrenado, aunque sólo en casos raros). gcc ejecuta cuatro programas uno tras otro, cada uno de los cuales se encarga de una etapa:

  1. cpp: la primera etapa consiste en reemplazar las directivas (preprocesadores) por instrucciones C puras. Típicamente, esto significa insertar un fichero de encabezado o header (#include), o definir una función macro (#define). Al final de esta fase, se genera código C puro.

  2. cc1: esta fase consiste en convertir el C en lenguaje ensamblador. El código generado depende de la arquitectura de destino.

  3. as: esta fase consiste en generar el código objeto (o código binario) a partir del lenguaje ensamblador. Al final de esta fase, se generará un fichero con extensión .o.

  4. ld: la última fase (la “edición de vínculos”, en inglés linkage) ensambla (o vincula) todos los ficheros objeto (.o) y las bibliotecas asociadas, y produce un fichero ejecutable.

1.3. La estructura de una distribución

Una distribución de software libre correctamente estructurado siempre tiene la misma organización:

  • Un fichero denominado INSTALL, que describe el proceso de instalación.

  • Un fichero denominado README, que contiene información general relacionada con el programa (descripción breve, autor, la URL desde donde se puede bajar, documentación relacionada, vínculos útiles, etc). Si falta el fichero INSTALL, generalmente el fichero README contiene una descripción breve del procedimiento de instalación.

  • Un fichero denominado COPYING, que contiene la licencia o describe las condiciones de distribución del software. A veces lo reemplaza un fichero denominado LICENSE, con el mismo contenido.

  • Un fichero denominado CONTRIB o CREDITS que contiene una lista de las personas relacionadas con el software (participación activa, comentarios pertinentes, programas de terceros, etc.)

  • Un fichero denominado CHANGES (o, con menor frecuencia, NEWS, que contiene las mejoras y las correcciones de los bugs (errores en el software).

  • Un fichero denominado Makefile (consulte la sección Sección 4.1, “Make”), que permite compilar el software (es un fichero que necesita make). Generalmente este fichero no existe al principio y se genera durante el proceso de configuración.

  • Bastante seguido, un fichero configure o Imakefile, que permitirá generar un fichero Makefile nuevo personalizado para un sistema en particular (consulte Sección 3, “Configuración”).

  • Un directorio que contendrá los fuentes, y donde generalmente se almacena el fichero binario al final de la compilación. Por lo general, este directorio se denomina src.

  • Un directorio que contiene la documentación relacionada con el programa (generalmente en formato man o en formato Texinfo), cuyo nombre es, por lo general, doc.

  • Eventualmente, un directorio que contiene los datos propios del programa (típicamente, los ficheros de configuración, los ejemplos de los datos producidos, o ficheros de recursos)