Un ejemplo de un archivo Makefile

A continuación se muestra un ejemplo de un archivo Makefile completo, donde se incluyen todas los tipos de declaraciones. En este ejemplo, se utiliza el programa make para compilar los programas funciones.c y main.c para crear un ejecutable llamado main. Tanto funciones.c como main.c utilizan el archivo funciones.h.

Ejemplo 1. Makefile

# La siguiente no es necesariamente requerida, se agrega para
# mostrar como funciona.

.SUFFIXES: .o .c
.c.o:
	$(CC) -c $(CFLAGS) $<


# Macros

CC = gcc
CFLAGS = -g -Wall -O2
SRC = main.c funciones.c funciones.h
OBJ = main.o funciones.o


# Reglas explícitas

all: $(OBJ)
	$(CC) $(CFLAGS) -o main $(OBJ)

clean:
	$(RM) $(OBJ) main

# Reglas implícitas

funciones.o: funciones.c funciones.h
main.o: main.c funciones.h

		

En este archivo Makefile se han definido dos reglas explícitas, que indican como contruir all y clean. Para llevar a cabo las acciones, basta ejecutar

	$ make
	

lo cual ejecutará la primera regla que encuentra, es decir, all, la cual compilará los programas definidos en la variable $(OBJECT). Si se desea que se ejecuten las tareas de la regla clean, se debe ejecutar:

	$ make clean
	

El archivo funciones.h contiene el prototipo de las funciones empleada en el programa main.c y que se encuentra implementada en funciones.c. De esta manera, es posible separar en distintos pogramas y funciones cada pieza del programa final, lo cual ayuda con la mantención.

Ejemplo 2. funciones.h

void swap (int *, int *);

		

Para efectos de ejemplificar, el archivo funciones.c sólo contiene una función, llamada swap, la cual intercambia dos valores recibidos por referencia.

Ejemplo 3. funciones.c

void
swap (int *a, int *b)
{
	int tmp;
	tmp = (*a);
	(*a) = (*b);
	(*b) = tmp;
};

		

Finalmente, el programa principal, main.c, el cual lee dos valores desde la entrada estándar, los intercambia llamando a la función swap y entrega el resultado en la salida estándar.

Ejemplo 4. main.c

#include <stdio.h>
#include "funciones.h"

int
main (int argc, char **argv)
{
	int x, y;

	printf ("x: "); scanf ("%d", &x);
	printf ("y: "); scanf ("%d", &y);
	
	swap (&x, &y);

	printf ("x: %d, y: %d\n", x, y);

	exit (1);
}