Voici le makefile du programme GNU tar. C'est un exemple de makefile modérément complexe. La première ligne utilise un réglage #! qui permet d'exécuter directement ce makefile.
Comme c'est la première cible, le but par défaut est ‘all’. Une particularité intéressante de ce makefile est que testpad.h est un fichier source créé automatiquement par le programme testpad, lui-même compilé à partir de testpad.c.
Si vous tapez ‘make’ ou ‘make all’, alors make crée l'exécutable tar, le démon rmt qui fournit l'accès distant aux bandes, ainsi que le fichier Info tar.info.
Si vous tapez ‘make install’, alors make ne se contente pas de créer tar, rmt et tar.info : il les installe également.
Si vous tapez ‘make clean’, alors make supprime les fichiers ‘.o’ ainsi que les fichiers tar, rmt, testpad, testpad.h et core.
Si vous tapez ‘make distclean’, alors make supprime les mêmes fichiers que ‘make clean’, mais aussi les fichiers TAGS, Makefile et config.status. (Bien que cela ne soit pas évident, ce makefile (ainsi que config.status) est généré chez l'utilisateur par le programme configure, fourni dans la distribution de tar, mais qui n'est pas reproduit ici.)
Si vous tapez ‘make realclean’, alors make supprime les mêmes fichiers que ‘make distclean’ et supprime en outre les fichiers Info générés à partir de tar.texinfo.
Il existe par ailleurs des cibles shar et dist qui créent des kits de distribution.
#!/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
#### Début de la section de configuration système. ####
srcdir = .
# Si vous utilisez gcc, exécutez le script fixincludes
# qui l'accompagne, ou bien utilisez gcc avec l'option
# -traditional. Sinon, les appels ioctl seront compilés
# de façon incorrecte sur certains systèmes.
CC = gcc -O
YACC = bison -y
INSTALL = /usr/local/bin/install -c
INSTALLDATA = /usr/local/bin/install -c -m 644
# Éléments que vous pourriez ajouter à DEFS :
# -DSTDC_HEADERS Si vous avez des en-têtes et
# bibliothèques ANSI C.
# -DPOSIX Si vous avez des en-têtes et
# bibliothèques POSIX.1.
# -DBSD42 Si vous avez sys/dir.h (sauf si
# vous utilisez -DPOSIX), sys/file.h
# et st_blocks dans `struct stat'.
# -DUSG Si vous avez les fonctions et en-têtes
# de chaîne et de mémoire System V/ANSI C,
# sys/sysmacros.h, fcntl.h, getcwd, pas de
# valloc, et ndir.h (sauf si vous
# utilisez -DDIRENT).
# -DNO_MEMORY_H Si USG ou STDC_HEADERS mais sans
# inclure memory.h.
# -DDIRENT Si USG et que vous avez dirent.h
# au lieu de ndir.h.
# -DSIGTYPE=int Si vos gestionnaires de signaux
# renvoient int, et non void.
# -DNO_MTIO Si vous n'avez pas sys/mtio.h
# (ioctls de bande magnétique).
# -DNO_REMOTE Si vous n'avez pas de shell distant
# ni rexec.
# -DUSE_REXEC Pour utiliser rexec pour les opérations
# de bande distantes au lieu de forker
# rsh ou remsh.
# -DVPRINTF_MISSING Si vous n'avez pas la fonction vprintf
# (mais avez _doprnt).
# -DDOPRNT_MISSING Si vous n'avez pas la fonction _doprnt.
# Il faut alors aussi définir
# -DVPRINTF_MISSING.
# -DFTIME_MISSING Si vous n'avez pas l'appel système ftime.
# -DSTRSTR_MISSING Si vous n'avez pas la fonction strstr.
# -DVALLOC_MISSING Si vous n'avez pas la fonction valloc.
# -DMKDIR_MISSING Si vous n'avez pas les appels système
# mkdir et rmdir.
# -DRENAME_MISSING Si vous n'avez pas l'appel système rename.
# -DFTRUNCATE_MISSING Si vous n'avez pas l'appel système
# ftruncate.
# -DV7 Sur Unix Version 7 (non testé
# depuis longtemps).
# -DEMUL_OPEN3 Si vous n'avez pas de version à 3
# arguments de open et voulez l'émuler
# avec les appels système dont vous disposez.
# -DNO_OPEN3 Si vous n'avez pas le open à 3 arguments
# et voulez désactiver l'option -k de tar
# au lieu d'émuler open.
# -DXENIX Si vous avez sys/inode.h et avez besoin
# de l'inclure 94.
DEFS = -DSIGTYPE=int -DDIRENT -DSTRSTR_MISSING \
-DVPRINTF_MISSING -DBSD42
# Réglez ceci sur rtapelib.o sauf si vous avez défini NO_REMOTE,
# auquel cas laissez-le vide.
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
# Préfixe pour chaque programme installé,
# normalement vide ou `g'.
binprefix =
# Le répertoire où installer tar.
bindir = $(prefix)/bin
# Le répertoire où installer les fichiers info.
infodir = $(prefix)/info
#### Fin de la section de configuration système. ####
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 a 8 conflits 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