Home
  Software
    Howto
      Make

Make y Makefile

Un programa, make, instalado en todas las versiones de Linux, hace la rutina de compilar mucho mas facil. El precio es que la preparación es un poco críptica. Trataré de describir un caso muy sencillo. El mecanismo es el siguiente. Ejecutando make, este programa busca en el directorio actual para obtener instrucciones a ejecutar. Por facilidad, el nombre de archivo utilizado es frecuentemente Makefile, ya que, por la 'M', se ordena entre los primeros archivos del directorio. Puede ser makefile o gmakefile.

Este archivo puede contener mucha información, pero, la parte mas útil para nosotros consta de construcciones sencillas de la forma:


      meta: dependencia1 dependencia2 ...
              instrucciones para construir la meta
    
meta es lo que queremos obtener, por ejemplo, en el caso de compilar un programa en C, el ejecutable.
dependencia1 dependencia2 ... son los elementos que influyen en determinar si es preciso recompilar o no. En el caso sencillo de un solo codigo fuente (ejemplo.c), es nada mas que este nombre.
En la segunda línea, después de exactamente una tabulación (make es muy estricto!), aparecen las instrucciones para obtener la meta.

Un caso minimalista

Un caso ultra-simple: Un programita simple que queremos que imprima 'Hola', y el programa lo llamamos hola.c.

El Makefile contendrá:

hola: hola.c
	    gcc hola.c -o hola
Cada vez que tipeamos make, este programa se fijará si la fecha de modificación de hola.c es mas nueva que el ejecutable hola. De ser asi, recompilará (también, por supuesto, si hola no existe todavía!).

Un caso un poquita mas complicado

Supongamos ahora que hola es un poco mas complicado, y necesita de dos modulos externos llamados ayuda.c (con su encabezamiento ayuda.h, y imprimir.c y imprimir.h.

Ahora la compilación es algo mas complicado: primero tenemos que compilar los programas auxiliares, luego generar el ejecutable. El Makefile ahora se vé asi:

hola: hola.c ayuda.o imprimir.o
            gcc -o hola hola.c ayuda.o imprimir.o

imprimir.o: imprimir.c imprimir.h
            gcc -c imprimir.c

ayuda.o: ayuda.c ayuda.h
            gcc -c ayuda.c
Ahora, hay dos pasos:

-hola depende (como antes) del programa principal hola.c, pero también de dos modulos separados. Los elementos que tenemos que 'linkear' son ayuda.o y imprimir.o, que son los 'objetos' creados cuando compilamos ayuda.c y imprimir.c por separado.

-Claro, ahora necesitamos reglas para generar estos dos 'objetos'. Entonces, incluimos dos reglas nuevas, para determinar la necesidad de compilar de ayuda.o y/o imprimir.o.

Notas

En muchos casos, make es capaz de generar la instrucción automáticamente. Pero, frecuéntemente, es mas facil de incluirla de todas formas, ya que facilita la inclusión de opciones como, por ejemplo, '-g' para generar información de depuración.

make no está limitado a tareas de compilación, o a una sola acción en las instrucciones. Otro ejemplo es si queremos generar un PDF de un archivo de texto sencillo (texto.txt):

texto.pdf: texto.txt
          a2ps -o texto.ps texto.txt
          ps2pdf texto.ps
          rm texto.ps
a2ps convierte el texto a Postscript, luego ps2pdf lo convierte de Postscript a PDF. Puede bajar Makefile.

5543


(c) John Coppens ON6JC/LW3HAZ correo