This is Info file make.info, produced by Makeinfo version 1.67 from the
input file make.texinfo.

INFO-DIR-SECTION The GNU make utility
START-INFO-DIR-ENTRY
* Make: (make.info).               The GNU make utility.
END-INFO-DIR-ENTRY

   This file documents the GNU Make utility, which determines
automatically which pieces of a large program need to be recompiled,
and issues the commands to recompile them.

   This is Edition 0.52, last updated 20 May 1998, of `The GNU Make
Manual', for `make', Version 3.77.

   Copyright (C) 1988, '89, '90, '91, '92, '93, '94, '95, '96, '97, '98
Free Software Foundation, Inc.

   Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
preserved on all copies.

   Permission is granted to copy and distribute modified versions of
this manual under the conditions for verbatim copying, provided that
the entire resulting derived work is distributed under the terms of a
permission notice identical to this one.

   Permission is granted to copy and distribute translations of this
manual into another language, under the above conditions for modified
versions, except that this permission notice may be stated in a
translation approved by the Free Software Foundation.


File: make.info,  Node: Make Errors,  Next: Complex Makefile,  Prev: Quick Reference,  Up: Top

Errors Generated by Make
************************

   Here is a list of the most common errors you might see generated by
`make', and some information about what they mean and how to fix them.

   Sometimes `make' errors are not fatal, especially in the presence of
a `-' prefix on a command script line, or the `-k' command line option.
Errors that are fatal are prefixed with the string `***'.

   Error messages are all either prefixed with the name of the program
(usually `make'), or, if the error is found in a makefile, the name of
the file and linenumber containing the problem.

   In the table below, these common prefixes are left off.

`[FOO] Error NN'
`[FOO] SIGNAL DESCRIPTION'
     These errors are not really `make' errors at all.  They mean that a
     program that `make' invoked as part of a command script returned a
     non-0 error code (`Error NN'), which `make' interprets as failure,
     or it exited in some other abnormal fashion (with a signal of some
     type).

     If no `***' is attached to the message, then the subprocess failed
     but the rule in the makefile was prefixed with the `-' special
     character, so `make' ignored the error.

`missing separator.  Stop.'
     This is `make''s generic "Huh?" error message.  It means that
     `make' was completely unsuccessful at parsing this line of your
     makefile.  It basically means "syntax error".

     One of the most common reasons for this message is that you (or
     perhaps your oh-so-helpful editor, as is the case with many
     MS-Windows editors) have attempted to indent your command scripts
     with spaces instead of a TAB character.  Remember that every line
     in the command script must begin with a TAB character.  Eight
     spaces do not count.

`commands commence before first target.  Stop.'
`missing rule before commands.  Stop.'
     This means the first thing in the makefile seems to be part of a
     command script: it begins with a TAB character and doesn't appear
     to be a legal `make' command (such as a variable assignment).
     Command scripts must always be associated with a target.

     The second form is generated if the line has a semicolon as the
     first non-whitespace character; `make' interprets this to mean you
     left out the "target: dependency" section of a rule.

`No rule to make target `XXX'.'
`No rule to make target `XXX', needed by `YYY'.'
     This means that `make' decided it needed to build a target, but
     then couldn't find any instructions in the makefile on how to do
     that, either explicit or implicit (including in the default rules
     database).

     If you want that file to be built, you will need to add a rule to
     your makefile describing how that target can be built.  Other
     possible sources of this problem are typos in the makefile (if
     that filename is wrong) or a corrupted source tree (if that file
     is not supposed to be built, but rather only a dependency).

`No targets specified and no makefile found.  Stop.'
`No targets.  Stop.'
     The former means that you didn't provide any targets to be built
     on the command line, and `make' couldn't find any makefiles to
     read in.  The latter means that some makefile was found, but it
     didn't contain any default target and none was given on the
     command line.  GNU `make' has nothing to do in these situations.

`Makefile `XXX' was not found.'
`Included makefile `XXX' was not found.'
     A makefile specified on the command line (first form) or included
     (second form) was not found.

`warning: overriding commands for target `XXX''
`warning: ignoring old commands for target `XXX''
     GNU `make' allows commands to be specified only once per target
     (except for double-colon rules).  If you give commands for a target
     which already has been defined to have commands, this warning is
     issued and the second set of commands will overwrite the first set.

`Circular XXX <- YYY dependency dropped.'
     This means that `make' detected a loop in the dependency graph:
     after tracing the dependency YYY of target XXX, and its
     dependencies, etc., one of them depended on XXX again.

`Recursive variable `XXX' references itself (eventually).  Stop.'
     This means you've defined a normal (recursive) `make' variable XXX
     that, when its expanded, will refer to itself (XXX).  This is not
     allowed; either use simply-expanded variables (`:=') or use the
     append operator (`+=').

`Unterminated variable reference.  Stop.'
     This means you forgot to provide the proper closing parenthesis or
     brace in your variable or function reference.

`insufficient arguments to function `XXX'.  Stop.'
     This means you haven't provided the requisite number of arguments
     for this function.  See the documentation of the function for a
     description of its arguments.

`missing target pattern.  Stop.'
`multiple target patterns.  Stop.'
`target pattern contains no `%'.  Stop.'
     These are generated for malformed static pattern rules.  The first
     means there's no pattern in the target section of the rule, the
     second means there are multiple patterns in the target section,
     and the third means the target doesn't contain a pattern character
     (`%').


File: make.info,  Node: Complex Makefile,  Next: Concept Index,  Prev: Make Errors,  Up: Top

Complex Makefile Example
************************

   Here is the makefile for the GNU `tar' program.  This is a
moderately complex makefile.

   Because it is the first target, the default goal is `all'.  An
interesting feature of this makefile is that `testpad.h' is a source
file automatically created by the `testpad' program, itself compiled
from `testpad.c'.

   If you type `make' or `make all', then `make' creates the `tar'
executable, the `rmt' daemon that provides remote tape access, and the
`tar.info' Info file.

   If you type `make install', then `make' not only creates `tar',
`rmt', and `tar.info', but also installs them.

   If you type `make clean', then `make' removes the `.o' files, and
the `tar', `rmt', `testpad', `testpad.h', and `core' files.

   If you type `make distclean', then `make' not only removes the same
files as does `make clean' but also the `TAGS', `Makefile', and
`config.status' files.  (Although it is not evident, this makefile (and
`config.status') is generated by the user with the `configure' program,
which is provided in the `tar' distribution, but is not shown here.)

   If you type `make realclean', then `make' removes the same files as
does `make distclean' and also removes the Info files generated from
`tar.texinfo'.

   In addition, there are targets `shar' and `dist' that create
distribution kits.

     # 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
     
     #### Start of system configuration section. ####
     
     srcdir = .
     
     # If you use gcc, you should either run the
     # fixincludes script that comes with it or else use
     # gcc with the -traditional option.  Otherwise ioctl
     # calls will be compiled incorrectly on some systems.
     CC = gcc -O
     YACC = bison -y
     INSTALL = /usr/local/bin/install -c
     INSTALLDATA = /usr/local/bin/install -c -m 644
     
     # Things you might add to DEFS:
     # -DSTDC_HEADERS        If you have ANSI C headers and
     #                       libraries.
     # -DPOSIX               If you have POSIX.1 headers and
     #                       libraries.
     # -DBSD42               If you have sys/dir.h (unless
     #                       you use -DPOSIX), sys/file.h,
     #                       and st_blocks in `struct stat'.
     # -DUSG                 If you have System V/ANSI C
     #                       string and memory functions
     #                       and headers, sys/sysmacros.h,
     #                       fcntl.h, getcwd, no valloc,
     #                       and ndir.h (unless
     #                       you use -DDIRENT).
     # -DNO_MEMORY_H         If USG or STDC_HEADERS but do not
     #                       include memory.h.
     # -DDIRENT              If USG and you have dirent.h
     #                       instead of ndir.h.
     # -DSIGTYPE=int         If your signal handlers
     #                       return int, not void.
     # -DNO_MTIO             If you lack sys/mtio.h
     #                       (magtape ioctls).
     # -DNO_REMOTE           If you do not have a remote shell
     #                       or rexec.
     # -DUSE_REXEC           To use rexec for remote tape
     #                       operations instead of
     #                       forking rsh or remsh.
     # -DVPRINTF_MISSING     If you lack vprintf function
     #                       (but have _doprnt).
     # -DDOPRNT_MISSING      If you lack _doprnt function.
     #                       Also need to define
     #                       -DVPRINTF_MISSING.
     # -DFTIME_MISSING       If you lack ftime system call.
     # -DSTRSTR_MISSING      If you lack strstr function.
     # -DVALLOC_MISSING      If you lack valloc function.
     # -DMKDIR_MISSING       If you lack mkdir and
     #                       rmdir system calls.
     # -DRENAME_MISSING      If you lack rename system call.
     # -DFTRUNCATE_MISSING   If you lack ftruncate
     #                       system call.
     # -DV7                  On Version 7 Unix (not
     #                       tested in a long time).
     # -DEMUL_OPEN3          If you lack a 3-argument version
     #                       of open, and want to emulate it
     #                       with system calls you do have.
     # -DNO_OPEN3            If you lack the 3-argument open
     #                       and want to disable the tar -k
     #                       option instead of emulating open.
     # -DXENIX               If you have sys/inode.h
     #                       and need it 94 to be included.
     
     DEFS =  -DSIGTYPE=int -DDIRENT -DSTRSTR_MISSING \
             -DVPRINTF_MISSING -DBSD42
     # Set this to rtapelib.o unless you defined NO_REMOTE,
     # in which case make it empty.
     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
     # Prefix for each installed program,
     # normally empty or `g'.
     binprefix =
     
     # The directory to install tar in.
     bindir = $(prefix)/bin
     
     # The directory to install the info files in.
     infodir = $(prefix)/info
     
     #### End of system configuration section. ####
     
     SRC1 =  tar.c create.c extract.c buffer.c \
             getoldopt.c update.c gnu.c mangle.c
     SRC2 =  version.c list.c names.c diffarch.c \
             port.c wildmat.c getopt.c
     SRC3 =  getopt1.c regex.c getdate.y
     SRCS =  $(SRC1) $(SRC2) $(SRC3)
     OBJ1 =  tar.o create.o extract.o buffer.o \
             getoldopt.o update.o gnu.o mangle.o
     OBJ2 =  version.o list.o names.o diffarch.o \
             port.o wildmat.o getopt.o
     OBJ3 =  getopt1.o regex.o getdate.o $(RTAPELIB)
     OBJS =  $(OBJ1) $(OBJ2) $(OBJ3)
     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
     
     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
     
     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 has 8 shift/reduce conflicts.
     
     testpad.h: testpad
             ./testpad
     
     testpad: testpad.o
             $(CC) -o $@ testpad.o
     
     TAGS:   $(SRCS)
             etags $(SRCS)
     
     clean:
             rm -f *.o tar rmt testpad testpad.h core
     
     distclean: clean
             rm -f TAGS Makefile config.status
     
     realclean: distclean
             rm -f tar.info*
     
     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
     
     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`
             -rm -rf `cat .fname` .fname
             tar chZf `cat .fname`.tar.Z `cat .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

