Idioma: 日本語 | Español | Français | Português | 中文 | English
Anterior | Próximo | Índice | Original em inglês (gnu.org)

Apêndice C Exemplo de Makefile Complexo

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

Anterior | Próximo | Índice | Original em inglês (gnu.org)