Aqui está o makefile do programa tar da GNU. Este é um exemplo de makefile moderadamente complexo. A primeira linha usa uma configuração #! que permite executar o makefile diretamente.
Como é o primeiro alvo, a meta padrão é ‘all’. Uma característica interessante deste makefile é que testpad.h é um arquivo fonte criado automaticamente pelo programa testpad, que por sua vez é compilado a partir de testpad.c.
Se você digitar ‘make’ ou ‘make all’, então make cria o executável tar, o daemon rmt que fornece acesso remoto à fita e o arquivo Info tar.info.
Se você digitar ‘make install’, então make não apenas cria tar, rmt e tar.info, mas também os instala.
Se você digitar ‘make clean’, então make remove os arquivos ‘.o’ e os arquivos tar, rmt, testpad, testpad.h e core.
Se você digitar ‘make distclean’, então make remove não apenas os mesmos arquivos que ‘make clean’ remove, mas também os arquivos TAGS, Makefile e config.status. (Embora não seja evidente, este makefile (e config.status) é gerado no ambiente do usuário pelo programa configure, que está incluído na distribuição do tar, mas que não é mostrado aqui.)
Se você digitar ‘make realclean’, então make remove os mesmos arquivos que ‘make distclean’ remove e também remove os arquivos Info gerados a partir de tar.texinfo.
Além disso, há os alvos shar e dist que criam kits de distribuição.
#!/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
#### Início da seção de configuração do sistema. ####
srcdir = .
# Se você usar gcc, execute o script fixincludes que
# o acompanha ou então use gcc com a opção -traditional.
# Caso contrário, em alguns sistemas as chamadas ioctl
# serão compiladas incorretamente.
CC = gcc -O
YACC = bison -y
INSTALL = /usr/local/bin/install -c
INSTALLDATA = /usr/local/bin/install -c -m 644
# Coisas que você pode adicionar a DEFS:
# -DSTDC_HEADERS Se você tiver cabeçalhos e
# bibliotecas ANSI C.
# -DPOSIX Se você tiver cabeçalhos e
# bibliotecas POSIX.1.
# -DBSD42 Se você tiver sys/dir.h (a menos
# que use -DPOSIX), sys/file.h e
# st_blocks em `struct stat'.
# -DUSG Se você tiver as funções e cabeçalhos
# de string e memória do System V/ANSI
# C, sys/sysmacros.h, fcntl.h, getcwd,
# sem valloc, e ndir.h (a menos que
# use -DDIRENT).
# -DNO_MEMORY_H Se USG ou STDC_HEADERS, mas não
# incluir memory.h.
# -DDIRENT Se USG e você tiver dirent.h em
# vez de ndir.h.
# -DSIGTYPE=int Se seus tratadores de sinal
# retornarem int, não void.
# -DNO_MTIO Se faltar sys/mtio.h (ioctls de
# fita magnética).
# -DNO_REMOTE Se você não tiver um shell remoto
# ou rexec.
# -DUSE_REXEC Para usar rexec nas operações remotas
# de fita em vez de fazer fork de
# rsh ou remsh.
# -DVPRINTF_MISSING Se faltar a função vprintf (mas
# houver _doprnt).
# -DDOPRNT_MISSING Se faltar a função _doprnt.
# Também é necessário definir
# -DVPRINTF_MISSING.
# -DFTIME_MISSING Se faltar a chamada de sistema ftime.
# -DSTRSTR_MISSING Se faltar a função strstr.
# -DVALLOC_MISSING Se faltar a função valloc.
# -DMKDIR_MISSING Se faltarem as chamadas de sistema
# mkdir e rmdir.
# -DRENAME_MISSING Se faltar a chamada de sistema rename.
# -DFTRUNCATE_MISSING Se faltar a chamada de sistema
# ftruncate.
# -DV7 No Unix Version 7 (não testado
# há muito tempo).
# -DEMUL_OPEN3 Se faltar uma versão de open com 3
# argumentos e você quiser emulá-la
# com chamadas de sistema disponíveis.
# -DNO_OPEN3 Se faltar o open de 3 argumentos e
# você quiser desabilitar a opção
# tar -k em vez de emular open.
# -DXENIX Se você tiver sys/inode.h e
# precisar incluí-lo em 94.
DEFS = -DSIGTYPE=int -DDIRENT -DSTRSTR_MISSING \
-DVPRINTF_MISSING -DBSD42
# Defina como rtapelib.o, a menos que tenha definido
# NO_REMOTE; nesse caso, deixe vazio.
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
# Prefixo para cada programa instalado,
# normalmente vazio ou `g'.
binprefix =
# O diretório onde instalar o tar.
bindir = $(prefix)/bin
# O diretório onde instalar os arquivos info.
infodir = $(prefix)/info
#### Fim da seção de configuração do 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 tem 8 conflitos 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