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

Apéndice C Ejemplo de Makefile complejo

Aquí se presenta el makefile usado por el programa GNU tar. Es un ejemplo de makefile moderadamente complejo. La primera línea usa una indicación #! para que este makefile pueda ejecutarse directamente.

Como esta regla es el primer objetivo, la meta predeterminada es ‘all’. Un detalle interesante de este makefile es que testpad.h es un archivo fuente generado automáticamente por el programa testpad, que a su vez se compila a partir de testpad.c.

Si escribe ‘make’ o ‘make all’, make genera el ejecutable tar, el demonio rmt que proporciona acceso remoto a la cinta, y el archivo Info tar.info.

Si escribe ‘make install’, make no solo genera tar, rmt y tar.info, sino que además los instala.

Si escribe ‘make clean’, make elimina los archivos ‘.o’ y los archivos tar, rmt, testpad, testpad.h y core.

Si escribe ‘make distclean’, make elimina los mismos archivos que ‘make clean’ y, además, los archivos TAGS, Makefile y config.status. (Aunque no resulte evidente, este makefile (y config.status) lo genera el usuario en su equipo mediante el programa configure, que se incluye en la distribución de tar, pero que no se muestra aquí.)

Si escribe ‘make realclean’, make elimina los mismos archivos que ‘make distclean’ y, además, los archivos Info generados a partir de tar.texinfo.

Además, existen los objetivos shar y dist que crean kits de distribución.

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

#### Inicio de la sección de configuración del sistema. ####

srcdir = .

# Si usa gcc, ejecute el script fixincludes que lo
# acompaña, o bien use gcc con la opción -traditional.
# De lo contrario, en algunos sistemas las llamadas a
# ioctl se compilarán de forma incorrecta.
CC = gcc -O
YACC = bison -y
INSTALL = /usr/local/bin/install -c
INSTALLDATA = /usr/local/bin/install -c -m 644


# Cosas que podría añadir a DEFS:
# -DSTDC_HEADERS        Si tiene cabeceras y bibliotecas
#                       ANSI C.
# -DPOSIX               Si tiene cabeceras y bibliotecas
#                       POSIX.1.
# -DBSD42               Si tiene sys/dir.h (salvo que use
#                       -DPOSIX), sys/file.h, y st_blocks
#                       en `struct stat'.
# -DUSG                 Si tiene las funciones y cabeceras
#                       de cadenas y memoria de System V/
#                       ANSI C, sys/sysmacros.h, fcntl.h,
#                       getcwd, no tiene valloc, y tiene
#                       ndir.h (salvo que use -DDIRENT).
# -DNO_MEMORY_H         Si USG o STDC_HEADERS pero no
#                       incluye memory.h.
# -DDIRENT              Si USG y tiene dirent.h en lugar
#                       de ndir.h.
# -DSIGTYPE=int         Si sus manejadores de señal
#                       devuelven int, no void.
# -DNO_MTIO             Si carece de sys/mtio.h
#                       (ioctls de cinta magnética).
# -DNO_REMOTE           Si no tiene un shell remoto
#                       o rexec.
# -DUSE_REXEC           Para usar rexec en las operaciones
#                       remotas de cinta en lugar de
#                       lanzar (fork) rsh o remsh.
# -DVPRINTF_MISSING     Si carece de la función vprintf
#                       (pero tiene _doprnt).
# -DDOPRNT_MISSING      Si carece de la función _doprnt.
#                       También debe definir
#                       -DVPRINTF_MISSING.
# -DFTIME_MISSING       Si carece de la llamada al sistema
#                       ftime.
# -DSTRSTR_MISSING      Si carece de la función strstr.
# -DVALLOC_MISSING      Si carece de la función valloc.
# -DMKDIR_MISSING       Si carece de las llamadas al
#                       sistema mkdir y rmdir.
# -DRENAME_MISSING      Si carece de la llamada al sistema
#                       rename.
# -DFTRUNCATE_MISSING   Si carece de la llamada al sistema
#                       ftruncate.
# -DV7                  En Version 7 Unix (no se prueba
#                       desde hace mucho tiempo).
# -DEMUL_OPEN3          Si carece de una versión de open
#                       con 3 argumentos y quiere emularla
#                       con las llamadas al sistema que sí
#                       tiene.
# -DNO_OPEN3            Si carece del open de 3 argumentos
#                       y quiere desactivar la opción -k de
#                       tar en lugar de emular open.
# -DXENIX               Si tiene sys/inode.h y necesita
#                       incluirlo en 94.

DEFS =  -DSIGTYPE=int -DDIRENT -DSTRSTR_MISSING \
        -DVPRINTF_MISSING -DBSD42
# Asigne esto a rtapelib.o salvo que haya definido
# NO_REMOTE; en ese caso, déjelo vací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
# Prefijo para cada programa instalado;
# normalmente vacío o `g'.
binprefix =

# El directorio donde instalar tar.
bindir = $(prefix)/bin

# El directorio donde instalar los archivos info.
infodir = $(prefix)/info


#### Fin de la sección de configuración del 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 tiene 8 conflictos 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 | Siguiente | Índice | Original en inglés (gnu.org)