Aquí se presenta el makefile usado por el programa GNU tar. Es un ejemplo de makefile moderadamente complejo. La primera línea usa una indicación #! para que este makefile pueda ejecutarse directamente.
Como esta regla es el primer objetivo, la meta predeterminada es ‘all’. Un detalle interesante de este makefile es que testpad.h es un archivo fuente generado automáticamente por el programa testpad, que a su vez se compila a partir de testpad.c.
Si escribe ‘make’ o ‘make all’, make genera el ejecutable tar, el demonio rmt que proporciona acceso remoto a la cinta, y el archivo Info tar.info.
Si escribe ‘make install’, make no solo genera tar, rmt y tar.info, sino que además los instala.
Si escribe ‘make clean’, make elimina los archivos ‘.o’ y los archivos tar, rmt, testpad, testpad.h y core.
Si escribe ‘make distclean’, make elimina los mismos archivos que ‘make clean’ y, además, los archivos TAGS, Makefile y config.status. (Aunque no resulte evidente, este makefile (y config.status) lo genera el usuario en su equipo mediante el programa configure, que se incluye en la distribución de tar, pero que no se muestra aquí.)
Si escribe ‘make realclean’, make elimina los mismos archivos que ‘make distclean’ y, además, los archivos Info generados a partir de tar.texinfo.
Además, existen los objetivos shar y dist que crean kits de distribución.
#!/usr/bin/make -f
# Generated automatically from Makefile.in by configure.
# Un*x Makefile for GNU tar program.
# Copyright (C) 1991 Free Software Foundation, Inc.
# This program is free software; you can redistribute
# it and/or modify it under the terms of the GNU
# General Public License …
…
…
SHELL = /bin/sh
#### Inicio de la sección de configuración del sistema. ####
srcdir = .
# Si usa gcc, ejecute el script fixincludes que lo
# acompaña, o bien use gcc con la opción -traditional.
# De lo contrario, en algunos sistemas las llamadas a
# ioctl se compilarán de forma incorrecta.
CC = gcc -O
YACC = bison -y
INSTALL = /usr/local/bin/install -c
INSTALLDATA = /usr/local/bin/install -c -m 644
# Cosas que podría añadir a DEFS:
# -DSTDC_HEADERS Si tiene cabeceras y bibliotecas
# ANSI C.
# -DPOSIX Si tiene cabeceras y bibliotecas
# POSIX.1.
# -DBSD42 Si tiene sys/dir.h (salvo que use
# -DPOSIX), sys/file.h, y st_blocks
# en `struct stat'.
# -DUSG Si tiene las funciones y cabeceras
# de cadenas y memoria de System V/
# ANSI C, sys/sysmacros.h, fcntl.h,
# getcwd, no tiene valloc, y tiene
# ndir.h (salvo que use -DDIRENT).
# -DNO_MEMORY_H Si USG o STDC_HEADERS pero no
# incluye memory.h.
# -DDIRENT Si USG y tiene dirent.h en lugar
# de ndir.h.
# -DSIGTYPE=int Si sus manejadores de señal
# devuelven int, no void.
# -DNO_MTIO Si carece de sys/mtio.h
# (ioctls de cinta magnética).
# -DNO_REMOTE Si no tiene un shell remoto
# o rexec.
# -DUSE_REXEC Para usar rexec en las operaciones
# remotas de cinta en lugar de
# lanzar (fork) rsh o remsh.
# -DVPRINTF_MISSING Si carece de la función vprintf
# (pero tiene _doprnt).
# -DDOPRNT_MISSING Si carece de la función _doprnt.
# También debe definir
# -DVPRINTF_MISSING.
# -DFTIME_MISSING Si carece de la llamada al sistema
# ftime.
# -DSTRSTR_MISSING Si carece de la función strstr.
# -DVALLOC_MISSING Si carece de la función valloc.
# -DMKDIR_MISSING Si carece de las llamadas al
# sistema mkdir y rmdir.
# -DRENAME_MISSING Si carece de la llamada al sistema
# rename.
# -DFTRUNCATE_MISSING Si carece de la llamada al sistema
# ftruncate.
# -DV7 En Version 7 Unix (no se prueba
# desde hace mucho tiempo).
# -DEMUL_OPEN3 Si carece de una versión de open
# con 3 argumentos y quiere emularla
# con las llamadas al sistema que sí
# tiene.
# -DNO_OPEN3 Si carece del open de 3 argumentos
# y quiere desactivar la opción -k de
# tar en lugar de emular open.
# -DXENIX Si tiene sys/inode.h y necesita
# incluirlo en 94.
DEFS = -DSIGTYPE=int -DDIRENT -DSTRSTR_MISSING \
-DVPRINTF_MISSING -DBSD42
# Asigne esto a rtapelib.o salvo que haya definido
# NO_REMOTE; en ese caso, déjelo vacío.
RTAPELIB = rtapelib.o
LIBS =
DEF_AR_FILE = /dev/rmt8
DEFBLOCKING = 20
CDEBUG = -g
CFLAGS = $(CDEBUG) -I. -I$(srcdir) $(DEFS) \
-DDEF_AR_FILE=\"$(DEF_AR_FILE)\" \
-DDEFBLOCKING=$(DEFBLOCKING)
LDFLAGS = -g
prefix = /usr/local
# Prefijo para cada programa instalado;
# normalmente vacío o `g'.
binprefix =
# El directorio donde instalar tar.
bindir = $(prefix)/bin
# El directorio donde instalar los archivos info.
infodir = $(prefix)/info
#### Fin de la sección de configuración del sistema. ####
SRCS_C = tar.c create.c extract.c buffer.c \
getoldopt.c update.c gnu.c mangle.c \
version.c list.c names.c diffarch.c \
port.c wildmat.c getopt.c getopt1.c \
regex.c
SRCS_Y = getdate.y
SRCS = $(SRCS_C) $(SRCS_Y)
OBJS = $(SRCS_C:.c=.o) $(SRCS_Y:.y=.o) $(RTAPELIB)
AUX = README COPYING ChangeLog Makefile.in \
makefile.pc configure configure.in \
tar.texinfo tar.info* texinfo.tex \
tar.h port.h open3.h getopt.h regex.h \
rmt.h rmt.c rtapelib.c alloca.c \
msd_dir.h msd_dir.c tcexparg.c \
level-0 level-1 backup-specs testpad.c
.PHONY: all
all: tar rmt tar.info
tar: $(OBJS)
$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
rmt: rmt.c
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ rmt.c
tar.info: tar.texinfo
makeinfo tar.texinfo
.PHONY: install
install: all
$(INSTALL) tar $(bindir)/$(binprefix)tar
-test ! -f rmt || $(INSTALL) rmt /etc/rmt
$(INSTALLDATA) $(srcdir)/tar.info* $(infodir)
$(OBJS): tar.h port.h testpad.h
regex.o buffer.o tar.o: regex.h
# getdate.y tiene 8 conflictos shift/reduce.
testpad.h: testpad
./testpad
testpad: testpad.o
$(CC) -o $@ testpad.o
TAGS: $(SRCS)
etags $(SRCS)
.PHONY: clean
clean:
rm -f *.o tar rmt testpad testpad.h core
.PHONY: distclean
distclean: clean
rm -f TAGS Makefile config.status
.PHONY: realclean
realclean: distclean
rm -f tar.info*
.PHONY: shar
shar: $(SRCS) $(AUX)
shar $(SRCS) $(AUX) | compress \
> tar-`sed -e '/version_string/!d' \
-e 's/[^0-9.]*\([0-9.]*\).*/\1/' \
-e q
version.c`.shar.Z
.PHONY: dist
dist: $(SRCS) $(AUX)
echo tar-`sed \
-e '/version_string/!d' \
-e 's/[^0-9.]*\([0-9.]*\).*/\1/' \
-e q
version.c` > .fname
-rm -rf `cat .fname`
mkdir `cat .fname`
ln $(SRCS) $(AUX) `cat .fname`
tar chZf `cat .fname`.tar.Z `cat .fname`
-rm -rf `cat .fname` .fname
tar.zoo: $(SRCS) $(AUX)
-rm -rf tmp.dir
-mkdir tmp.dir
-rm tar.zoo
for X in $(SRCS) $(AUX) ; do \
echo $$X ; \
sed 's/$$/^M/' $$X \
> tmp.dir/$$X ; done
cd tmp.dir ; zoo aM ../tar.zoo *
-rm -rf tmp.dir