前へ | 次へ | 目次 | 英語原版(gnu.org)

付録C 複雑なMakefileの例

 ここでは、GNU の tar プログラムで使われている makefile を紹介します。これはほどほどに複雑な makefile の例です。冒頭の1行目では #! という指定を使い、この makefile をそのまま直接実行できるようにしています。

 このルールが最初のターゲットなので、デフォルトゴールは ‘all’ になります。この makefile の面白い点として、testpad.htestpad というプログラムによって自動的に生成されるソースファイルになっていることが挙げられます。そしてその testpad 自身も、testpad.c からコンパイルされて作られます。

 ‘make’ または ‘make all’ と入力すると、maketar 実行ファイル、リモートテープアクセスを提供する rmt デーモン、そして tar.info という Info ファイルを生成します。

 ‘make install’ と入力すると、maketarrmttar.info を生成するだけでなく、それらをインストールまで行います。

 ‘make clean’ と入力すると、make は ‘.o’ ファイルと、tarrmttestpadtestpad.hcore の各ファイルを削除します。

 ‘make distclean’ と入力すると、make は ‘make clean’ が削除するのと同じファイルに加えて、TAGSMakefileconfig.status の各ファイルも削除します。(表からはわかりませんが、この makefile(および config.status)は、tar の配布物に含まれている configure というプログラムによって、ユーザの手元で生成されるものです。ただし configure 自体はここには掲載していません。)

 ‘make realclean’ と入力すると、make は ‘make distclean’ が削除するのと同じファイルを削除し、さらに tar.texinfo から生成された Info ファイル群も削除します。

 このほかにも、配布キットを作成するための shar ターゲットと dist ターゲットが用意されています。

#!/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

#### システム設定セクションの開始 ####

srcdir = .

# gcc を使う場合は、付属の fixincludes スクリプトを実行するか、
# あるいは gcc を -traditional オプション付きで使ってください。
# そうしないと、システムによっては ioctl 呼び出しが
# 正しくコンパイルされないことがあります。
CC = gcc -O
YACC = bison -y
INSTALL = /usr/local/bin/install -c
INSTALLDATA = /usr/local/bin/install -c -m 644


# DEFS に追加するとよいもの:
# -DSTDC_HEADERS        ANSI C のヘッダとライブラリが
#                       ある場合。
# -DPOSIX               POSIX.1 のヘッダとライブラリが
#                       ある場合。
# -DBSD42               sys/dir.h(-DPOSIX を使う場合を除く)、
#                       sys/file.h、`struct stat' の
#                       st_blocks がある場合。
# -DUSG                 System V/ANSI C の文字列・メモリ
#                       関数とヘッダ、sys/sysmacros.h、
#                       fcntl.h、getcwd があり、valloc が
#                       なく、ndir.h(-DDIRENT を使う場合を
#                       除く)がある場合。
# -DNO_MEMORY_H         USG または STDC_HEADERS だが
#                       memory.h を include しない場合。
# -DDIRENT              USG で、ndir.h ではなく dirent.h が
#                       ある場合。
# -DSIGTYPE=int         シグナルハンドラが void ではなく
#                       int を返す場合。
# -DNO_MTIO             sys/mtio.h(磁気テープの ioctl)が
#                       ない場合。
# -DNO_REMOTE           リモートシェルや rexec が
#                       ない場合。
# -DUSE_REXEC           リモートテープ操作に、rsh や remsh を
#                       fork する代わりに rexec を
#                       使う場合。
# -DVPRINTF_MISSING     vprintf 関数がない(が _doprnt は
#                       ある)場合。
# -DDOPRNT_MISSING      _doprnt 関数がない場合。
#                       このときは -DVPRINTF_MISSING も
#                       定義する必要があります。
# -DFTIME_MISSING       ftime システムコールがない場合。
# -DSTRSTR_MISSING      strstr 関数がない場合。
# -DVALLOC_MISSING      valloc 関数がない場合。
# -DMKDIR_MISSING       mkdir と rmdir システムコールが
#                       ない場合。
# -DRENAME_MISSING      rename システムコールがない場合。
# -DFTRUNCATE_MISSING   ftruncate システムコールが
#                       ない場合。
# -DV7                  Version 7 Unix の場合(長らく
#                       テストしていません)。
# -DEMUL_OPEN3          引数3個版の open がなく、手持ちの
#                       システムコールでそれをエミュレート
#                       したい場合。
# -DNO_OPEN3            引数3個の open がなく、open を
#                       エミュレートする代わりに tar の -k
#                       オプションを無効にしたい場合。
# -DXENIX               sys/inode.h があり、それを 94 で
#                       include する必要がある場合。

DEFS =  -DSIGTYPE=int -DDIRENT -DSTRSTR_MISSING \
        -DVPRINTF_MISSING -DBSD42
# NO_REMOTE を定義していなければ、これを rtapelib.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
# インストールする各プログラムにつける接頭辞。
# 通常は空か `g' にします。
binprefix =

# tar をインストールするディレクトリ。
bindir = $(prefix)/bin

# info ファイルをインストールするディレクトリ。
infodir = $(prefix)/info


#### システム設定セクションの終わり ####

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 には 8 個の 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

前へ | 次へ | 目次 | 英語原版(gnu.org)