Bahasa: 日本語 | Español | Français | Português | 中文 | Bahasa Indonesia | English
Sebelumnya | Berikutnya | Daftar Isi | Versi asli bahasa Inggris (gnu.org)

Lampiran C Contoh makefile yang kompleks

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

Sebelumnya | Berikutnya | Daftar Isi | Versi asli bahasa Inggris (gnu.org)