Linux: el makefile gnu

En Linux, una makefile es un archivo de texto que describe el cual se requieren archivos para construir un programa en particular, así como la forma de compilar y enlazar los archivos para construir el programa. Para un programa de Linux compuesto por varios archivos de origen y de cabecera, el makefile especifica lo siguiente:

  • Los elementos que hacer crea - por lo general los archivos objeto y el ejecutable. El uso del término objetivo para referirse a cualquier elemento que haga tiene que crear es común.

  • Los archivos u otras acciones necesarias para crear el objetivo.

  • ¿Qué comandos para ejecutar para crear cada objetivo.

Suponga que tiene un archivo fuente C ++ llamado form.C que contiene la siguiente directiva de preprocesador:

#include "form.h" // Incluir archivo de cabecera

El archivo de objeto form.o depende claramente en el archivo de origen form.C y el archivo de cabecera form.h. Además de estas dependencias, debe especificar cómo hacer convierte la form.C presentar al archivo objeto form.o. Suponga que desea hacer para invocar g ++ (porque el archivo fuente está en C ++) con las siguientes opciones:

  • -c (sólo compilar)

  • -g (generar información de depuración)

  • -O2 (optimizar algunos)

en el makefile, usted puede expresar estas opciones con la siguiente regla:

# Este un comentario en el archivo MAKE # Las siguientes líneas indican cómo form.o depende # en form.C y form.h y cómo crear form.o.form.o: form.C form.hg ++ -c -g -O2 form.C

En este ejemplo, la primera línea muestra noncomment form.o como destino y form.C y form.h como los archivos dependientes.

La línea que sigue la dependencia indica cómo construir el blanco de sus dependientes. Esta línea debe comenzar con una ficha. De lo contrario el hacer comando sale con un mensaje de error, y uno se queda rascándose la cabeza porque cuando nos fijamos en la makefile en un editor de texto, no se puede decir la diferencia entre una ficha y un espacio.

Ahora que usted sabe el secreto, la solución es reemplazar el espacio al principio de la línea ofensiva con una sola ficha.

La ventaja de utilizar maquillaje es que evita compilaciones innecesarias. Después de todo, puede ejecutar g ++ (o gcc) Desde un script de shell para compilar y enlazar todos los archivos que componen la aplicación, pero el shell script compila todo, incluso si las compilaciones son innecesarias.

GNU hacer, por el contrario, construye un objetivo sólo si uno o más de sus dependientes han cambiado desde la última vez que el objetivo fue construido. hacer verifica este cambio mediante el examen de la hora de la última modificación de la diana y los dependientes.

hacer trata el destino como el nombre de un objetivo de ser se alcanza- el objetivo no tiene que ser un archivo. Usted puede tener una norma como ésta:

limpia: rm -f * .o

Esta regla especifica un objetivo abstracto llamado limpio que no depende de nada. Esta declaración la dependencia dice que para crear el blanco limpio, GNU hacer invoca el comando rm -f * .o, que borra todos los archivos que tengan la .o extensión (es decir, los archivos de objetos). Por lo tanto, el efecto de crear el objetivo nombrado limpio es eliminar los archivos objeto.