Berikut adalah makefile untuk program GNU tar. Ini adalah contoh makefile yang cukup kompleks. Baris pertama menggunakan pengaturan #! agar makefile ini dapat dijalankan langsung.
Karena aturan ini adalah target pertama, sasaran default-nya adalah ‘all’. Salah satu hal menarik dari makefile ini adalah testpad.h merupakan file sumber yang dibuat secara otomatis oleh program testpad, yang dikompilasi dari testpad.c.
Jika Anda mengetik ‘make’ atau ‘make all’, maka make membuat executable tar, daemon rmt yang menyediakan akses tape jarak jauh, dan file Info tar.info.
Jika Anda mengetik ‘make install’, maka make tidak hanya membuat tar, rmt, dan tar.info, tetapi juga menginstalnya.
Jika Anda mengetik ‘make clean’, maka make menghapus file ‘.o’, serta file tar, rmt, testpad, testpad.h, dan core.
Jika Anda mengetik ‘make distclean’, maka make tidak hanya menghapus file yang sama seperti ‘make clean’, tetapi juga file TAGS, Makefile, dan config.status. (Meskipun tidak terlihat dari sini, makefile ini (dan config.status) dihasilkan oleh pengguna dengan program configure, yang disertakan dalam distribusi tar, tetapi tidak ditampilkan di sini.)
Jika Anda mengetik ‘make realclean’, maka make menghapus file yang sama seperti ‘make distclean’, dan juga menghapus file-file Info yang dihasilkan dari tar.texinfo.
Selain itu, tersedia juga target shar dan dist yang membuat kit distribusi.
#!/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
#### Awal bagian konfigurasi sistem ####
srcdir = .
# Jika Anda menggunakan gcc, jalankan skrip
# fixincludes yang disertakan, atau gunakan gcc
# dengan opsi -traditional. Jika tidak, pada
# sebagian sistem panggilan ioctl akan salah dikompilasi.
CC = gcc -O
YACC = bison -y
INSTALL = /usr/local/bin/install -c
INSTALLDATA = /usr/local/bin/install -c -m 644
# Hal-hal yang bisa Anda tambahkan ke DEFS:
# -DSTDC_HEADERS Jika Anda memiliki header dan
# pustaka ANSI C.
# -DPOSIX Jika Anda memiliki header dan
# pustaka POSIX.1.
# -DBSD42 Jika Anda memiliki sys/dir.h
# (kecuali menggunakan -DPOSIX),
# sys/file.h, dan st_blocks dalam
# `struct stat'.
# -DUSG Jika Anda memiliki fungsi dan
# header string serta memori
# System V/ANSI C, sys/sysmacros.h,
# fcntl.h, getcwd, tidak memiliki
# valloc, dan memiliki ndir.h
# (kecuali menggunakan -DDIRENT).
# -DNO_MEMORY_H Jika USG atau STDC_HEADERS tetapi
# tidak meng-include memory.h.
# -DDIRENT Jika USG dan Anda memiliki
# dirent.h, bukan ndir.h.
# -DSIGTYPE=int Jika penangan sinyal Anda
# mengembalikan int, bukan void.
# -DNO_MTIO Jika Anda tidak memiliki
# sys/mtio.h (ioctl tape magnetik).
# -DNO_REMOTE Jika Anda tidak memiliki remote
# shell atau rexec.
# -DUSE_REXEC Untuk menggunakan rexec pada
# operasi tape jarak jauh, alih-alih
# melakukan fork rsh atau remsh.
# -DVPRINTF_MISSING Jika Anda tidak memiliki fungsi
# vprintf (tetapi memiliki _doprnt).
# -DDOPRNT_MISSING Jika Anda tidak memiliki fungsi
# _doprnt. -DVPRINTF_MISSING juga
# harus didefinisikan.
# -DFTIME_MISSING Jika Anda tidak memiliki system
# call ftime.
# -DSTRSTR_MISSING Jika Anda tidak memiliki fungsi strstr.
# -DVALLOC_MISSING Jika Anda tidak memiliki fungsi valloc.
# -DMKDIR_MISSING Jika Anda tidak memiliki system
# call mkdir dan rmdir.
# -DRENAME_MISSING Jika Anda tidak memiliki system call rename.
# -DFTRUNCATE_MISSING Jika Anda tidak memiliki system
# call ftruncate.
# -DV7 Pada Version 7 Unix (sudah lama
# tidak diuji).
# -DEMUL_OPEN3 Jika Anda tidak memiliki open
# versi 3 argumen, dan ingin
# mengemulasikannya dengan system
# call yang Anda miliki.
# -DNO_OPEN3 Jika Anda tidak memiliki open
# versi 3 argumen dan ingin
# menonaktifkan opsi -k pada tar,
# alih-alih mengemulasikan open.
# -DXENIX Jika Anda memiliki sys/inode.h
# dan perlu menyertakannya pada 94.
DEFS = -DSIGTYPE=int -DDIRENT -DSTRSTR_MISSING \
-DVPRINTF_MISSING -DBSD42
# Atur ini ke rtapelib.o kecuali Anda mendefinisikan
# NO_REMOTE; jika sudah, biarkan kosong.
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
# Awalan (prefix) untuk setiap program yang diinstal,
# biasanya kosong atau `g'.
binprefix =
# Direktori tempat tar akan diinstal.
bindir = $(prefix)/bin
# Direktori tempat file info akan diinstal.
infodir = $(prefix)/info
#### Akhir bagian konfigurasi sistem ####
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 memiliki 8 konflik 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