aboutsummaryrefslogtreecommitdiffstats
path: root/man-pages-posix-2003/man1p/make.1p
diff options
context:
space:
mode:
Diffstat (limited to 'man-pages-posix-2003/man1p/make.1p')
-rw-r--r--man-pages-posix-2003/man1p/make.1p1758
1 files changed, 1758 insertions, 0 deletions
diff --git a/man-pages-posix-2003/man1p/make.1p b/man-pages-posix-2003/man1p/make.1p
new file mode 100644
index 0000000..42554ee
--- /dev/null
+++ b/man-pages-posix-2003/man1p/make.1p
@@ -0,0 +1,1758 @@
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved
+.TH "MAKE" 1P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" make
+.SH PROLOG
+This manual page is part of the POSIX Programmer's Manual.
+The Linux implementation of this interface may differ (consult
+the corresponding Linux manual page for details of Linux behavior),
+or the interface may not be implemented on Linux.
+.SH NAME
+make \- maintain, update, and regenerate groups of programs (\fBDEVELOPMENT\fP)
+.SH SYNOPSIS
+.LP
+\fBmake\fP \fB[\fP\fB-einpqrst\fP\fB][\fP\fB-f\fP \fImakefile\fP\fB]\fP\fB...\fP\fB[\fP
+\fB-k| -S\fP\fB][\fP\fImacro\fP\fB=\fP\fIvalue\fP\fB]\fP\fB...
+.br
+\ \ \ \ \ \ \fP \fB[\fP\fItarget_name\fP\fB...\fP\fB]\fP\fB\fP
+.SH DESCRIPTION
+.LP
+The \fImake\fP utility shall update files that are derived from other
+files. A typical case is one where object files are
+derived from the corresponding source files. The \fImake\fP utility
+examines time relationships and shall update those derived
+files (called targets) that have modified times earlier than the modified
+times of the files (called prerequisites) from which they
+are derived. A description file (makefile) contains a description
+of the relationships between files, and the commands that need to
+be executed to update the targets to reflect changes in their prerequisites.
+Each specification, or rule, shall consist of a
+target, optional prerequisites, and optional commands to be executed
+when a prerequisite is newer than the target. There are two
+types of rule:
+.IP " 1." 4
+\fIInference rules\fP, which have one target name with at least one
+period ( \fB'.'\fP ) and no slash ( \fB'/'\fP )
+.LP
+.IP " 2." 4
+\fITarget rules\fP, which can have more than one target name
+.LP
+.LP
+In addition, \fImake\fP shall have a collection of built-in macros
+and inference rules that infer prerequisite relationships to
+simplify maintenance of programs.
+.LP
+To receive exactly the behavior described in this section, the user
+shall ensure that a portable makefile shall:
+.IP " *" 3
+Include the special target \fB.POSIX\fP
+.LP
+.IP " *" 3
+Omit any special target reserved for implementations (a leading period
+followed by uppercase letters) that has not been
+specified by this section
+.LP
+.LP
+The behavior of \fImake\fP is unspecified if either or both of these
+conditions are not met.
+.SH OPTIONS
+.LP
+The \fImake\fP utility shall conform to the Base Definitions volume
+of IEEE\ Std\ 1003.1-2001, Section 12.2, Utility Syntax Guidelines.
+.LP
+The following options shall be supported:
+.TP 7
+\fB-e\fP
+Cause environment variables, including those with null values, to
+override macro assignments within makefiles.
+.TP 7
+\fB-f\ \fP \fImakefile\fP
+Specify a different makefile. The argument \fImakefile\fP is a pathname
+of a description file, which is also referred to as
+the \fImakefile\fP. A pathname of \fB'-'\fP shall denote the standard
+input. There can be multiple instances of this option,
+and they shall be processed in the order specified. The effect of
+specifying the same option-argument more than once is
+unspecified.
+.TP 7
+\fB-i\fP
+Ignore error codes returned by invoked commands. This mode is the
+same as if the special target \fB.IGNORE\fP were specified
+without prerequisites.
+.TP 7
+\fB-k\fP
+Continue to update other targets that do not depend on the current
+target if a non-ignored error occurs while executing the
+commands to bring a target up-to-date.
+.TP 7
+\fB-n\fP
+Write commands that would be executed on standard output, but do not
+execute them. However, lines with a plus sign (
+\fB'+'\fP ) prefix shall be executed. In this mode, lines with an
+at sign ( \fB'@'\fP ) character prefix shall be written to
+standard output.
+.TP 7
+\fB-p\fP
+Write to standard output the complete set of macro definitions and
+target descriptions. The output format is unspecified.
+.TP 7
+\fB-q\fP
+Return a zero exit value if the target file is up-to-date; otherwise,
+return an exit value of 1. Targets shall not be updated
+if this option is specified. However, a makefile command line (associated
+with the targets) with a plus sign ( \fB'+'\fP )
+prefix shall be executed.
+.TP 7
+\fB-r\fP
+Clear the suffix list and do not use the built-in rules.
+.TP 7
+\fB-S\fP
+Terminate \fImake\fP if an error occurs while executing the commands
+to bring a target up-to-date. This shall be the default
+and the opposite of \fB-k\fP.
+.TP 7
+\fB-s\fP
+Do not write makefile command lines or touch messages (see \fB-t\fP)
+to standard output before executing. This mode shall be
+the same as if the special target \fB.SILENT\fP were specified without
+prerequisites.
+.TP 7
+\fB-t\fP
+Update the modification time of each target as though a \fItouch\fP
+\fItarget\fP had
+been executed. Targets that have prerequisites but no commands (see
+Target Rules ), or that are
+already up-to-date, shall not be touched in this manner. Write messages
+to standard output for each target file indicating the name
+of the file and that it was touched. Normally, the \fImakefile\fP
+command lines associated with each target are not executed.
+However, a command line with a plus sign ( \fB'+'\fP ) prefix shall
+be executed.
+.sp
+.LP
+Any options specified in the \fIMAKEFLAGS\fP environment variable
+shall be evaluated before any options specified on the
+\fImake\fP utility command line. If the \fB-k\fP and \fB-S\fP options
+are both specified on the \fImake\fP utility command line
+or by the \fIMAKEFLAGS\fP environment variable, the last option specified
+shall take precedence. If the \fB-f\fP or \fB-p\fP
+options appear in the \fIMAKEFLAGS\fP environment variable, the result
+is undefined.
+.SH OPERANDS
+.LP
+The following operands shall be supported:
+.TP 7
+\fItarget_name\fP
+Target names, as defined in the EXTENDED DESCRIPTION section. If no
+target is specified, while \fImake\fP is processing the
+makefiles, the first target that \fImake\fP encounters that is not
+a special target or an inference rule shall be used.
+.TP 7
+\fImacro\fP=\fIvalue\fP
+Macro definitions, as defined in Macros .
+.sp
+.LP
+If the \fItarget_name\fP and \fImacro\fP= \fIvalue\fP operands are
+intermixed on the \fImake\fP utility command line, the
+results are unspecified.
+.SH STDIN
+.LP
+The standard input shall be used only if the \fImakefile\fP option-argument
+is \fB'-'\fP . See the INPUT FILES section.
+.SH INPUT FILES
+.LP
+The input file, otherwise known as the makefile, is a text file containing
+rules, macro definitions, and comments. See the
+EXTENDED DESCRIPTION section.
+.SH ENVIRONMENT VARIABLES
+.LP
+The following environment variables shall affect the execution of
+\fImake\fP:
+.TP 7
+\fILANG\fP
+Provide a default value for the internationalization variables that
+are unset or null. (See the Base Definitions volume of
+IEEE\ Std\ 1003.1-2001, Section 8.2, Internationalization Variables
+for
+the precedence of internationalization variables used to determine
+the values of locale categories.)
+.TP 7
+\fILC_ALL\fP
+If set to a non-empty string value, override the values of all the
+other internationalization variables.
+.TP 7
+\fILC_CTYPE\fP
+Determine the locale for the interpretation of sequences of bytes
+of text data as characters (for example, single-byte as
+opposed to multi-byte characters in arguments and input files).
+.TP 7
+\fILC_MESSAGES\fP
+Determine the locale that should be used to affect the format and
+contents of diagnostic messages written to standard
+error.
+.TP 7
+\fIMAKEFLAGS\fP
+.sp
+This variable shall be interpreted as a character string representing
+a series of option characters to be used as the default
+options. The implementation shall accept both of the following formats
+(but need not accept them when intermixed):
+.RS
+.IP " *" 3
+The characters are option letters without the leading hyphens or <blank>
+separation used on a \fImake\fP utility command
+line.
+.LP
+.IP " *" 3
+The characters are formatted in a manner similar to a portion of the
+\fImake\fP utility command line: options are preceded by
+hyphens and <blank>-separated as described in the Base Definitions
+volume of IEEE\ Std\ 1003.1-2001, Section 12.2, Utility Syntax Guidelines.
+The \fImacro\fP= \fIvalue\fP macro
+definition operands can also be included. The difference between the
+contents of \fIMAKEFLAGS\fP and the \fImake\fP utility
+command line is that the contents of the variable shall not be subjected
+to the word expansions (see \fIWord Expansions\fP ) associated with
+parsing the command line values.
+.LP
+.RE
+.TP 7
+\fINLSPATH\fP
+Determine the location of message catalogs for the processing of \fILC_MESSAGES
+\&.\fP
+.TP 7
+\fIPROJECTDIR\fP
+.sp
+Provide a directory to be used to search for SCCS files not found
+in the current directory. In all of the following cases, the
+search for SCCS files is made in the directory \fBSCCS\fP in the identified
+directory. If the value of \fIPROJECTDIR\fP begins
+with a slash, it shall be considered an absolute pathname; otherwise,
+the value of \fIPROJECTDIR\fP is treated as a user name and
+that user's initial working directory shall be examined for a subdirectory
+\fBsrc\fP or \fBsource\fP. If such a directory is
+found, it shall be used. Otherwise, the value is used as a relative
+pathname.
+.LP
+If \fIPROJECTDIR\fP is not set or has a null value, the search for
+SCCS files shall be made in the directory \fBSCCS\fP in the
+current directory.
+.LP
+The setting of \fIPROJECTDIR\fP affects all files listed in the remainder
+of this utility description for files with a
+component named \fBSCCS\fP.
+.sp
+.LP
+The value of the \fISHELL\fP environment variable shall not be used
+as a macro and shall not be modified by defining the
+\fBSHELL\fP macro in a makefile or on the command line. All other
+environment variables, including those with null values, shall
+be used as macros, as defined in Macros .
+.SH ASYNCHRONOUS EVENTS
+.LP
+If not already ignored, \fImake\fP shall trap SIGHUP, SIGTERM, SIGINT,
+and SIGQUIT and remove the current target unless the
+target is a directory or the target is a prerequisite of the special
+target \fB.PRECIOUS\fP or unless one of the \fB-n\fP,
+\fB-p\fP, or \fB-q\fP options was specified. Any targets removed in
+this manner shall be reported in diagnostic messages of
+unspecified format, written to standard error. After this cleanup
+process, if any, \fImake\fP shall take the standard action for
+all other signals.
+.SH STDOUT
+.LP
+The \fImake\fP utility shall write all commands to be executed to
+standard output unless the \fB-s\fP option was specified,
+the command is prefixed with an at sign, or the special target \fB.SILENT\fP
+has either the current target as a prerequisite or
+has no prerequisites. If \fImake\fP is invoked without any work needing
+to be done, it shall write a message to standard output
+indicating that no action was taken. If the \fB-t\fP option is present
+and a file is touched, \fImake\fP shall write to standard
+output a message of unspecified format indicating that the file was
+touched, including the filename of the file.
+.SH STDERR
+.LP
+The standard error shall be used only for diagnostic messages.
+.SH OUTPUT FILES
+.LP
+Files can be created when the \fB-t\fP option is present. Additional
+files can also be created by the utilities invoked by
+\fImake\fP.
+.SH EXTENDED DESCRIPTION
+.LP
+The \fImake\fP utility attempts to perform the actions required to
+ensure that the specified targets are up-to-date. A target
+is considered out-of-date if it is older than any of its prerequisites
+or if it does not exist. The \fImake\fP utility shall treat
+all prerequisites as targets themselves and recursively ensure that
+they are up-to-date, processing them in the order in which they
+appear in the rule. The \fImake\fP utility shall use the modification
+times of files to determine whether the corresponding
+targets are out-of-date.
+.LP
+After \fImake\fP has ensured that all of the prerequisites of a target
+are up-to-date and if the target is out-of-date, the
+commands associated with the target entry shall be executed. If there
+are no commands listed for the target, the target shall be
+treated as up-to-date.
+.SS Makefile Syntax
+.LP
+A makefile can contain rules, macro definitions (see Macros ), and
+comments. There are two kinds
+of rules: \fIinference rules\fP and \fItarget rules\fP. The \fImake\fP
+utility shall contain a set of built-in inference rules.
+If the \fB-r\fP option is present, the built-in rules shall not be
+used and the suffix list shall be cleared. Additional rules of
+both types can be specified in a makefile. If a rule is defined more
+than once, the value of the rule shall be that of the last one
+specified. Macros can also be defined more than once, and the value
+of the macro is specified in Macros . Comments start with a number
+sign ( \fB'#'\fP ) and continue until an unescaped <newline>
+is reached.
+.LP
+By default, the following files shall be tried in sequence: \fB./makefile\fP
+and \fB./Makefile\fP. If neither
+\fB\&./makefile\fP or \fB./Makefile\fP are found, other implementation-defined
+files may also be tried. On
+XSI-conformant systems, the additional files \fB./s.makefile\fP, \fBSCCS/s.makefile\fP,
+\fB\&./s.Makefile\fP, and
+\fBSCCS/s.Makefile\fP shall also be tried.
+.LP
+The \fB-f\fP option shall direct \fImake\fP to ignore any of these
+default files and use the specified argument as a makefile
+instead. If the \fB'-'\fP argument is specified, standard input shall
+be used.
+.LP
+The term \fImakefile\fP is used to refer to any rules provided by
+the user, whether in \fB./makefile\fP or its variants, or
+specified by the \fB-f\fP option.
+.LP
+The rules in makefiles shall consist of the following types of lines:
+target rules, including special targets (see Target Rules ), inference
+rules (see Inference Rules ), macro definitions
+(see Macros ), empty lines, and comments.
+.LP
+When an escaped <newline> (one preceded by a backslash) is found anywhere
+in the makefile except in a command line, it
+shall be replaced, along with any leading white space on the following
+line, with a single <space>. When an escaped
+<newline> is found in a command line in a makefile, the command line
+shall contain the backslash, the <newline>, and
+the next line, except that the first character of the next line shall
+not be included if it is a <tab>.
+.SS Makefile Execution
+.LP
+Makefile command lines shall be processed one at a time by writing
+the makefile command line to the standard output (unless one
+of the conditions listed under \fB'@'\fP suppresses the writing) and
+executing the command(s) in the line. A <tab> may
+precede the command to standard output. Command execution shall be
+as if the makefile command line were the argument to the \fIsystem\fP()
+function. The environment for the command being executed shall contain
+all of
+the variables in the environment of \fImake\fP.
+.LP
+By default, when \fImake\fP receives a non-zero status from the execution
+of a command, it shall terminate with an error
+message to standard error.
+.LP
+Makefile command lines can have one or more of the following prefixes:
+a hyphen ( \fB'-'\fP ), an at sign ( \fB'@'\fP ),
+or a plus sign ( \fB'+'\fP ). These shall modify the way in which
+\fImake\fP processes the command. When a command is written
+to standard output, the prefix shall not be included in the output.
+.TP 7
+\fB-\fP
+If the command prefix contains a hyphen, or the \fB-i\fP option is
+present, or the special target \fB.IGNORE\fP has either
+the current target as a prerequisite or has no prerequisites, any
+error found while executing the command shall be ignored.
+.TP 7
+\fB@\fP
+If the command prefix contains an at sign and the \fImake\fP utility
+command line \fB-n\fP option is not specified, or the
+\fB-s\fP option is present, or the special target \fB.SILENT\fP has
+either the current target as a prerequisite or has no
+prerequisites, the command shall not be written to standard output
+before it is executed.
+.TP 7
+\fB+\fP
+If the command prefix contains a plus sign, this indicates a makefile
+command line that shall be executed even if \fB-n\fP,
+\fB-q\fP, or \fB-t\fP is specified.
+.sp
+.SS Target Rules
+.LP
+Target rules are formatted as follows:
+.sp
+.RS
+.nf
+
+\fItarget\fP \fB[\fP\fItarget\fP\fB...\fP\fB]\fP\fB:\fP \fB[\fP\fIprerequisite\fP\fB...\fP\fB][;\fP\fIcommand\fP\fB]
+[\fP\fB<tab>\fP\fIcommand\fP\fB<tab>\fP\fIcommand\fP\fB...\fP\fB]\fP\fB
+.br
+
+\fP\fIline that does not begin with\fP \fB<tab>
+\fP
+.fi
+.RE
+.LP
+Target entries are specified by a <blank>-separated, non-null list
+of targets, then a colon, then a
+<blank>-separated, possibly empty list of prerequisites. Text following
+a semicolon, if any, and all following lines that
+begin with a <tab>, are makefile command lines to be executed to update
+the target. The first non-empty line that does not
+begin with a <tab> or \fB'#'\fP shall begin a new entry. An empty
+or blank line, or a line beginning with \fB'#'\fP,
+may begin a new entry.
+.LP
+Applications shall select target names from the set of characters
+consisting solely of periods, underscores, digits, and
+alphabetics from the portable character set (see the Base Definitions
+volume of IEEE\ Std\ 1003.1-2001, Section 6.1, Portable Character
+Set). Implementations may allow other characters in
+target names as extensions. The interpretation of targets containing
+the characters \fB'%'\fP and \fB''\fP is
+implementation-defined.
+.LP
+A target that has prerequisites, but does not have any commands, can
+be used to add to the prerequisite list for that target.
+Only one target rule for any given target can contain commands.
+.LP
+Lines that begin with one of the following are called \fIspecial targets\fP
+and control the operation of \fImake\fP:
+.TP 7
+\fB\&.DEFAULT\fP
+If the makefile uses this special target, the application shall ensure
+that it is specified with commands, but without
+prerequisites. The commands shall be used by \fImake\fP if there are
+no other rules available to build a target.
+.TP 7
+\fB\&.IGNORE\fP
+Prerequisites of this special target are targets themselves; this
+shall cause errors from commands associated with them to be
+ignored in the same manner as specified by the \fB-i\fP option. Subsequent
+occurrences of \fB.IGNORE\fP shall add to the list of
+targets ignoring command errors. If no prerequisites are specified,
+\fImake\fP shall behave as if the \fB-i\fP option had been
+specified and errors from all commands associated with all targets
+shall be ignored.
+.TP 7
+\fB\&.POSIX\fP
+The application shall ensure that this special target is specified
+without prerequisites or commands. If it appears as the
+first non-comment line in the makefile, \fImake\fP shall process the
+makefile as specified by this section; otherwise, the
+behavior of \fImake\fP is unspecified.
+.TP 7
+\fB\&.PRECIOUS\fP
+Prerequisites of this special target shall not be removed if \fImake\fP
+receives one of the asynchronous events explicitly
+described in the ASYNCHRONOUS EVENTS section. Subsequent occurrences
+of \fB.PRECIOUS\fP shall add to the list of precious files.
+If no prerequisites are specified, all targets in the makefile shall
+be treated as if specified with \fB.PRECIOUS\fP.
+.TP 7
+\fB\&.SCCS_GET\fP
+The application shall ensure that this special target is specified
+without prerequisites. If this special target is included in a
+makefile, the commands specified with this target shall replace the
+default commands associated with this special target (see Default
+Rules ). The commands specified with this target are used to get all
+SCCS files that are not
+found in the current directory.
+.LP
+When source files are named in a dependency list, \fImake\fP shall
+treat them just like any other target. Because the source
+file is presumed to be present in the directory, there is no need
+to add an entry for it to the makefile. When a target has no
+dependencies, but is present in the directory, \fImake\fP shall assume
+that that file is up-to-date. If, however, an SCCS file
+named \fBSCCS/s.\fP \fIsource_file\fP is found for a target \fIsource_file\fP,
+\fImake\fP compares the timestamp of the target
+file with that of the \fBSCCS/s.source_file\fP to ensure the target
+is up-to-date. If the target is missing, or if the SCCS file
+is newer, \fImake\fP shall automatically issue the commands specified
+for the \fB.SCCS_GET\fP special target to retrieve the most
+recent version. However, if the target is writable by anyone, \fImake\fP
+shall not retrieve a new version.
+.TP 7
+\fB\&.SILENT\fP
+Prerequisites of this special target are targets themselves; this
+shall cause commands associated with them not to be written
+to the standard output before they are executed. Subsequent occurrences
+of \fB.SILENT\fP shall add to the list of targets with
+silent commands. If no prerequisites are specified, \fImake\fP shall
+behave as if the \fB-s\fP option had been specified and no
+commands or touch messages associated with any target shall be written
+to standard output.
+.TP 7
+\fB\&.SUFFIXES\fP
+Prerequisites of \fB.SUFFIXES\fP shall be appended to the list of
+known suffixes and are used in conjunction with the
+inference rules (see Inference Rules ). If \fB.SUFFIXES\fP does not
+have any prerequisites, the
+list of known suffixes shall be cleared.
+.sp
+.LP
+The special targets \fB.IGNORE\fP, \fB.POSIX\fP, \fB.PRECIOUS\fP,
+\fB\&.SILENT\fP, and \fB.SUFFIXES\fP shall be specified
+without commands.
+.LP
+Targets with names consisting of a leading period followed by the
+uppercase letters \fB"POSIX"\fP and then any other
+characters are reserved for future standardization. Targets with names
+consisting of a leading period followed by one or more
+uppercase letters are reserved for implementation extensions.
+.SS Macros
+.LP
+Macro definitions are in the form:
+.sp
+.RS
+.nf
+
+\fIstring1\fP \fB=\fP \fB[\fP\fIstring2\fP\fB]\fP
+.fi
+.RE
+.LP
+The macro named \fIstring1\fP is defined as having the value of \fIstring2\fP,
+where \fIstring2\fP is defined as all
+characters, if any, after the equal sign, up to a comment character
+( \fB'#'\fP ) or an unescaped <newline>. Any
+<blank>s immediately before or after the equal sign shall be ignored.
+.LP
+Applications shall select macro names from the set of characters consisting
+solely of periods, underscores, digits, and
+alphabetics from the portable character set (see the Base Definitions
+volume of IEEE\ Std\ 1003.1-2001, Section 6.1, Portable Character
+Set). A macro name shall not contain an equals sign.
+Implementations may allow other characters in macro names as extensions.
+.LP
+Macros can appear anywhere in the makefile. Macro expansions using
+the forms $( \fIstring1\fP) or ${ \fIstring1\fP} shall be
+replaced by \fIstring2\fP, as follows:
+.IP " *" 3
+Macros in target lines shall be evaluated when the target line is
+read.
+.LP
+.IP " *" 3
+Macros in makefile command lines shall be evaluated when the command
+is executed.
+.LP
+.IP " *" 3
+Macros in the string before the equals sign in a macro definition
+shall be evaluated when the macro assignment is made.
+.LP
+.IP " *" 3
+Macros after the equals sign in a macro definition shall not be evaluated
+until the defined macro is used in a rule or command,
+or before the equals sign in a macro definition.
+.LP
+.LP
+The parentheses or braces are optional if \fIstring1\fP is a single
+character. The macro $$ shall be replaced by the single
+character \fB'$'\fP . If \fIstring1\fP in a macro expansion contains
+a macro expansion, the results are unspecified.
+.LP
+Macro expansions using the forms $( \fIstring1\fP \fB[:\fP \fIsubst1\fP
+\fB=[\fP \fIsubst2\fP \fB]]\fP) or ${
+\fIstring1\fP \fB[:\fP \fIsubst1\fP \fB=[\fP \fIsubst2\fP \fB]]\fP}
+can be used to replace all occurrences of \fIsubst1\fP
+with \fIsubst2\fP when the macro substitution is performed. The \fIsubst1\fP
+to be replaced shall be recognized when it is a
+suffix at the end of a word in \fIstring1\fP (where a \fIword\fP,
+in this context, is defined to be a string delimited by the
+beginning of the line, a <blank>, or a <newline>). If \fIstring1\fP
+in a macro expansion contains a macro expansion,
+the results are unspecified.
+.LP
+Macro expansions in \fIstring1\fP of macro definition lines shall
+be evaluated when read. Macro expansions in \fIstring2\fP of
+macro definition lines shall be performed when the macro identified
+by \fIstring1\fP is expanded in a rule or command.
+.LP
+Macro definitions shall be taken from the following sources, in the
+following logical order, before the makefile(s) are
+read.
+.IP " 1." 4
+Macros specified on the \fImake\fP utility command line, in the order
+specified on the command line. It is unspecified whether
+the internal macros defined in Internal Macros are accepted from this
+source.
+.LP
+.IP " 2." 4
+Macros defined by the \fIMAKEFLAGS\fP environment variable, in the
+order specified in the environment variable. It is
+unspecified whether the internal macros defined in Internal Macros
+are accepted from this
+source.
+.LP
+.IP " 3." 4
+The contents of the environment, excluding the \fIMAKEFLAGS\fP and
+\fISHELL\fP variables and including the variables with null
+values.
+.LP
+.IP " 4." 4
+Macros defined in the inference rules built into \fImake\fP.
+.LP
+.LP
+Macro definitions from these sources shall not override macro definitions
+from a lower-numbered source. Macro definitions from a
+single source (for example, the \fImake\fP utility command line, the
+\fIMAKEFLAGS\fP environment variable, or the other
+environment variables) shall override previous macro definitions from
+the same source.
+.LP
+Macros defined in the makefile(s) shall override macro definitions
+that occur before them in the makefile(s) and macro
+definitions from source 4. If the \fB-e\fP option is not specified,
+macros defined in the makefile(s) shall override macro
+definitions from source 3. Macros defined in the makefile(s) shall
+not override macro definitions from source 1 or source 2.
+.LP
+Before the makefile(s) are read, all of the \fImake\fP utility command
+line options (except \fB-f\fP and \fB-p\fP) and
+\fImake\fP utility command line macro definitions (except any for
+the \fIMAKEFLAGS\fP macro), not already included in the
+\fIMAKEFLAGS\fP macro, shall be added to the \fIMAKEFLAGS\fP macro,
+quoted in an implementation-defined manner such that when
+\fIMAKEFLAGS\fP is read by another instance of the \fImake\fP command,
+the original macro's value is recovered. Other
+implementation-defined options and macros may also be added to the
+\fIMAKEFLAGS\fP macro. If this modifies the value of the
+\fIMAKEFLAGS\fP macro, or, if the \fIMAKEFLAGS\fP macro is modified
+at any subsequent time, the \fIMAKEFLAGS\fP environment
+variable shall be modified to match the new value of the \fIMAKEFLAGS\fP
+macro. The result of setting \fIMAKEFLAGS\fP in the
+Makefile is unspecified.
+.LP
+Before the makefile(s) are read, all of the \fImake\fP utility command
+line macro definitions (except the \fIMAKEFLAGS\fP
+macro or the \fISHELL\fP macro) shall be added to the environment
+of \fImake\fP. Other implementation-defined variables may also
+be added to the environment of \fImake\fP.
+.LP
+The \fBSHELL\fP macro shall be treated specially. It shall be provided
+by \fImake\fP and set to the pathname of the shell
+command language interpreter (see \fIsh\fP ). The \fISHELL\fP environment
+variable shall not affect the
+value of the \fBSHELL\fP macro. If \fBSHELL\fP is defined in the makefile
+or is specified on the command line, it shall replace
+the original value of the \fBSHELL\fP macro, but shall not affect
+the \fISHELL\fP environment variable. Other effects of defining
+\fBSHELL\fP in the makefile or on the command line are implementation-defined.
+.SS Inference Rules
+.LP
+Inference rules are formatted as follows:
+.sp
+.RS
+.nf
+
+\fItarget\fP\fB:
+<tab>\fP\fIcommand
+\fP\fB[\fP\fB<tab>\fP\fIcommand\fP\fB]\fP\fB...
+.sp
+
+\fP\fIline that does not begin with\fP \fB<tab>\fP \fIor\fP \fB#
+\fP
+.fi
+.RE
+.LP
+The application shall ensure that the \fItarget\fP portion is a valid
+target name (see Target
+Rules ) of the form \fB.s2\fP or \fB.s1.s2\fP (where \fB.s1\fP and
+\fB\&.s2\fP are suffixes that have been given as
+prerequisites of the \fB.SUFFIXES\fP special target and \fIs1\fP and
+\fIs2\fP do not contain any slashes or periods.) If there
+is only one period in the target, it is a single-suffix inference
+rule. Targets with two periods are double-suffix inference rules.
+Inference rules can have only one target before the colon.
+.LP
+The application shall ensure that the makefile does not specify prerequisites
+for inference rules; no characters other than
+white space shall follow the colon in the first line, except when
+creating the \fIempty rule,\fP described below. Prerequisites
+are inferred, as described below.
+.LP
+Inference rules can be redefined. A target that matches an existing
+inference rule shall overwrite the old inference rule. An
+empty rule can be created with a command consisting of simply a semicolon
+(that is, the rule still exists and is found during
+inference rule search, but since it is empty, execution has no effect).
+The empty rule can also be formatted as follows:
+.sp
+.RS
+.nf
+
+\fIrule\fP\fB: ;
+\fP
+.fi
+.RE
+.LP
+where zero or more <blank>s separate the colon and semicolon.
+.LP
+The \fImake\fP utility uses the suffixes of targets and their prerequisites
+to infer how a target can be made up-to-date. A
+list of inference rules defines the commands to be executed. By default,
+\fImake\fP contains a built-in set of inference rules.
+Additional rules can be specified in the makefile.
+.LP
+The special target \fB.SUFFIXES\fP contains as its prerequisites a
+list of suffixes that shall be used by the inference rules.
+The order in which the suffixes are specified defines the order in
+which the inference rules for the suffixes are used. New
+suffixes shall be appended to the current list by specifying a \fB.SUFFIXES\fP
+special target in the makefile. A \fB.SUFFIXES\fP
+target with no prerequisites shall clear the list of suffixes. An
+empty \fB.SUFFIXES\fP target followed by a new \fB.SUFFIXES\fP
+list is required to change the order of the suffixes.
+.LP
+Normally, the user would provide an inference rule for each suffix.
+The inference rule to update a target with a suffix
+\fB\&.s1\fP from a prerequisite with a suffix \fB.s2\fP is specified
+as a target \fB.s2.s1\fP. The internal macros provide the
+means to specify general inference rules (see Internal Macros ).
+.LP
+When no target rule is found to update a target, the inference rules
+shall be checked. The suffix of the target ( \fB.s1\fP) to
+be built is compared to the list of suffixes specified by the \fB.SUFFIXES\fP
+special targets. If the \fB.s1\fP suffix is found
+in \fB.SUFFIXES\fP, the inference rules shall be searched in the order
+defined for the first \fB.s2.s1\fP rule whose prerequisite
+file ( \fB$*.s2\fP) exists. If the target is out-of-date with respect
+to this prerequisite, the commands for that inference rule
+shall be executed.
+.LP
+If the target to be built does not contain a suffix and there is no
+rule for the target, the single suffix inference rules shall
+be checked. The single-suffix inference rules define how to build
+a target if a file is found with a name that matches the target
+name with one of the single suffixes appended. A rule with one suffix
+\fB\&.s2\fP is the definition of how to build \fItarget\fP
+from \fBtarget.s2\fP. The other suffix ( \fB.s1\fP) is treated as
+null.
+.LP
+A
+tilde ( \fB'~'\fP ) in the above rules refers to an SCCS file in the
+current directory. Thus, the rule \fB.c~.o\fP
+would transform an SCCS C-language source file into an object file
+( \fB.o\fP). Because the \fBs.\fP of the SCCS files is a
+prefix, it is incompatible with \fImake\fP's suffix point of view.
+Hence, the \fB'~'\fP is a way of changing any file
+reference into an SCCS file reference.
+.SS Libraries
+.LP
+If a target or prerequisite contains parentheses, it shall be treated
+as a member of an archive library. For the \fIlib\fP(
+\fImember\fP \fB.o\fP) expression \fIlib\fP refers to the name of
+the archive library and \fImember\fP \fB.o\fP to the member
+name. The application shall ensure that the member is an object file
+with the \fB.o\fP suffix. The modification time of the
+expression is the modification time for the member as kept in the
+archive library; see \fIar\fP . The
+\fB\&.a\fP suffix shall refer to an archive library. The \fB.s2.a\fP
+rule shall be used to update a member in the library from a
+file with a suffix \fB.s2\fP.
+.SS Internal Macros
+.LP
+The \fImake\fP utility shall maintain five internal macros that can
+be used in target and inference rules. In order to clearly
+define the meaning of these macros, some clarification of the terms
+\fItarget rule\fP, \fIinference rule\fP, \fItarget\fP, and
+\fIprerequisite\fP is necessary.
+.LP
+Target rules are specified by the user in a makefile for a particular
+target. Inference rules are user-specified or
+\fImake\fP-specified rules for a particular class of target name.
+Explicit prerequisites are those prerequisites specified in a
+makefile on target lines. Implicit prerequisites are those prerequisites
+that are generated when inference rules are used.
+Inference rules are applied to implicit prerequisites or to explicit
+prerequisites that do not have target rules defined for them
+in the makefile. Target rules are applied to targets specified in
+the makefile.
+.LP
+Before any target in the makefile is updated, each of its prerequisites
+(both explicit and implicit) shall be updated. This
+shall be accomplished by recursively processing each prerequisite.
+Upon recursion, each prerequisite shall become a target itself.
+Its prerequisites in turn shall be processed recursively until a target
+is found that has no prerequisites, at which point the
+recursion stops. The recursion shall then back up, updating each target
+as it goes.
+.LP
+In the definitions that follow, the word \fItarget\fP refers to one
+of:
+.IP " *" 3
+A target specified in the makefile
+.LP
+.IP " *" 3
+An explicit prerequisite specified in the makefile that becomes the
+target when \fImake\fP processes it during recursion
+.LP
+.IP " *" 3
+An implicit prerequisite that becomes a target when \fImake\fP processes
+it during recursion
+.LP
+.LP
+In the definitions that follow, the word \fIprerequisite\fP refers
+to one of the following:
+.IP " *" 3
+An explicit prerequisite specified in the makefile for a particular
+target
+.LP
+.IP " *" 3
+An implicit prerequisite generated as a result of locating an appropriate
+inference rule and corresponding file that matches the
+suffix of the target
+.LP
+.LP
+The five internal macros are:
+.TP 7
+$@
+The $@ shall evaluate to the full target name of the current target,
+or the archive filename part of a library archive target.
+It shall be evaluated for both target and inference rules.
+.LP
+For example, in the \fB.c.a\fP inference rule, $@ represents the out-of-date
+\fB\&.a\fP file to be built. Similarly, in a
+makefile target rule to build \fBlib.a\fP from \fBfile.c\fP, $@ represents
+the out-of-date \fBlib.a\fP.
+.TP 7
+$%
+The $% macro shall be evaluated only when the current target is an
+archive library member of the form \fIlibname\fP(
+\fImember\fP \fB.o\fP). In these cases, $@ shall evaluate to \fIlibname\fP
+and $% shall evaluate to \fImember\fP \fB.o\fP. The
+$% macro shall be evaluated for both target and inference rules.
+.LP
+For example, in a makefile target rule to build \fBlib.a\fP( \fBfile.o\fP),
+$% represents \fBfile.o\fP, as opposed to $@,
+which represents \fBlib.a\fP.
+.TP 7
+$?
+The $? macro shall evaluate to the list of prerequisites that are
+newer than the current target. It shall be evaluated for both
+target and inference rules.
+.LP
+For example, in a makefile target rule to build \fIprog\fP from \fBfile1.o\fP,
+\fBfile2.o\fP, and \fBfile3.o\fP, and where
+\fIprog\fP is not out-of-date with respect to \fBfile1.o\fP, but is
+out-of-date with respect to \fBfile2.o\fP and
+\fBfile3.o\fP, $? represents \fBfile2.o\fP and \fBfile3.o\fP.
+.TP 7
+$<
+In an inference rule, the $< macro shall evaluate to the filename
+whose existence allowed the inference rule to be chosen
+for the target. In the \fB.DEFAULT\fP rule, the $< macro shall evaluate
+to the current target name. The meaning of the $<
+macro shall be otherwise unspecified.
+.LP
+For example, in the \fB.c.a\fP inference rule, $< represents the prerequisite
+\fB\&.c\fP file.
+.TP 7
+$*
+The $* macro shall evaluate to the current target name with its suffix
+deleted. It shall be evaluated at least for inference
+rules.
+.LP
+For example, in the \fB.c.a\fP inference rule, $*.o represents the
+out-of-date \fB.o\fP file that corresponds to the
+prerequisite \fB.c\fP file.
+.sp
+.LP
+Each of the internal macros has an alternative form. When an uppercase
+\fB'D'\fP or \fB'F'\fP is appended to any of the
+macros, the meaning shall be changed to the \fIdirectory part\fP for
+\fB'D'\fP and \fIfilename part\fP for \fB'F'\fP . The
+directory part is the path prefix of the file without a trailing slash;
+for the current directory, the directory part is
+\fB'.'\fP . When the $? macro contains more than one prerequisite
+filename, the $(?D) and $(?F) (or ${?D} and ${?F}) macros
+expand to a list of directory name parts and filename parts respectively.
+.LP
+For the target \fIlib\fP( \fImember\fP \fB.o\fP) and the \fBs2.a\fP
+rule, the internal macros shall be defined as:
+.TP 7
+$<
+\fImember\fP \fB.s2\fP
+.TP 7
+$*
+\fImember\fP
+.TP 7
+$@
+\fIlib\fP
+.TP 7
+$?
+\fImember\fP \fB.s2\fP
+.TP 7
+$%
+\fImember\fP \fB.o\fP
+.sp
+.SS Default Rules
+.LP
+The default rules for \fImake\fP shall achieve results that are the
+same as if the following were used. Implementations that do
+not support the C-Language Development Utilities option may omit \fBCC\fP,
+\fBCFLAGS\fP, \fBYACC\fP, \fBYFLAGS\fP, \fBLEX\fP,
+\fBLFLAGS\fP, \fBLDFLAGS\fP, and the \fB.c\fP, \fB.y\fP, and \fB.l\fP
+inference rules. Implementations that do not support
+FORTRAN may omit \fBFC\fP, \fBFFLAGS\fP, and the \fB.f\fP inference
+rules. Implementations may provide additional macros and
+rules.
+.sp
+.RS
+.nf
+
+\fISPECIAL TARGETS\fP\fB
+.br
+
+
+\&.SCCS_GET: sccs $(SCCSFLAGS) get $(SCCSGETFLAGS) $@
+
+.sp
+
+
+\&.SUFFIXES: .o .c .y .l .a .sh .f .c~ .y~ .l~ .sh~ .f~
+.sp
+
+\fP\fIMACROS\fP\fB
+.br
+
+MAKE=make
+AR=ar
+ARFLAGS=-rv
+YACC=yacc
+YFLAGS=
+LEX=lex
+LFLAGS=
+LDFLAGS=
+CC=c99
+CFLAGS=-O
+FC=fort77
+FFLAGS=-O 1
+
+GET=get
+GFLAGS=
+SCCSFLAGS=
+SCCSGETFLAGS=-s
+
+.sp
+
+\fP\fISINGLE SUFFIX RULES\fP\fB
+.br
+
+\&.c:
+ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $<
+.sp
+
+\&.f:
+ $(FC) $(FFLAGS) $(LDFLAGS) -o $@ $<
+.sp
+
+\&.sh:
+ cp $< $@
+ chmod a+x $@
+.sp
+
+
+\&.c~:
+ $(GET) $(GFLAGS) -p $< > $*.c
+ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $*.c
+.sp
+
+\&.f~:
+ $(GET) $(GFLAGS) -p $< > $*.f
+ $(FC) $(FFLAGS) $(LDFLAGS) -o $@ $*.f
+.sp
+
+\&.sh~:
+ $(GET) $(GFLAGS) -p $< > $*.sh
+ cp $*.sh $@
+ chmod a+x $@
+
+.sp
+
+\fP\fIDOUBLE SUFFIX RULES\fP\fB
+.br
+
+\&.c.o:
+ $(CC) $(CFLAGS) -c $<
+.sp
+
+\&.f.o:
+ $(FC) $(FFLAGS) -c $<
+.sp
+
+\&.y.o:
+ $(YACC) $(YFLAGS) $<
+ $(CC) $(CFLAGS) -c y.tab.c
+ rm -f y.tab.c
+ mv y.tab.o $@
+.sp
+
+\&.l.o:
+ $(LEX) $(LFLAGS) $<
+ $(CC) $(CFLAGS) -c lex.yy.c
+ rm -f lex.yy.c
+ mv lex.yy.o $@
+.sp
+
+\&.y.c:
+ $(YACC) $(YFLAGS) $<
+ mv y.tab.c $@
+.sp
+
+\&.l.c:
+ $(LEX) $(LFLAGS) $<
+ mv lex.yy.c $@
+.sp
+
+
+\&.c~.o:
+ $(GET) $(GFLAGS) -p $< > $*.c
+ $(CC) $(CFLAGS) -c $*.c
+.sp
+
+\&.f~.o:
+ $(GET) $(GFLAGS) -p $< > $*.f
+ $(FC) $(FFLAGS) -c $*.f
+.sp
+
+\&.y~.o:
+ $(GET) $(GFLAGS) -p $< > $*.y
+ $(YACC) $(YFLAGS) $*.y
+ $(CC) $(CFLAGS) -c y.tab.c
+ rm -f y.tab.c
+ mv y.tab.o $@
+.sp
+
+\&.l~.o:
+ $(GET) $(GFLAGS) -p $< > $*.l
+ $(LEX) $(LFLAGS) $*.l
+ $(CC) $(CFLAGS) -c lex.yy.c
+ rm -f lex.yy.c
+ mv lex.yy.o $@
+.sp
+
+\&.y~.c:
+ $(GET) $(GFLAGS) -p $< > $*.y
+ $(YACC) $(YFLAGS) $*.y
+ mv y.tab.c $@
+.sp
+
+\&.l~.c:
+ $(GET) $(GFLAGS) -p $< > $*.l
+ $(LEX) $(LFLAGS) $*.l
+ mv lex.yy.c $@
+
+.sp
+
+\&.c.a:
+ $(CC) -c $(CFLAGS) $<
+ $(AR) $(ARFLAGS) $@ $*.o
+ rm -f $*.o
+.sp
+
+\&.f.a:
+ $(FC) -c $(FFLAGS) $<
+ $(AR) $(ARFLAGS) $@ $*.o
+ rm -f $*.o
+\fP
+.fi
+.RE
+.SH EXIT STATUS
+.LP
+When the \fB-q\fP option is specified, the \fImake\fP utility shall
+exit with one of the following values:
+.TP 7
+\ 0
+Successful completion.
+.TP 7
+\ 1
+The target was not up-to-date.
+.TP 7
+>1
+An error occurred.
+.sp
+.LP
+When the \fB-q\fP option is not specified, the \fImake\fP utility
+shall exit with one of the following values:
+.TP 7
+\ 0
+Successful completion.
+.TP 7
+>0
+An error occurred.
+.sp
+.SH CONSEQUENCES OF ERRORS
+.LP
+Default.
+.LP
+\fIThe following sections are informative.\fP
+.SH APPLICATION USAGE
+.LP
+If there is a source file (such as \fB./source.c\fP) and there are
+two SCCS files corresponding to it ( \fB./s.source.c\fP and
+\fB\&./SCCS/s.source.c\fP), on XSI-conformant systems \fImake\fP uses
+the SCCS file in the current directory. However, users are
+advised to use the underlying SCCS utilities ( \fIadmin\fP, \fIdelta\fP,
+\fIget\fP, and so on) or the \fIsccs\fP utility for all source files
+in a given directory. If both forms are used for a given
+source file, future developers are very likely to be confused.
+.LP
+It is incumbent upon portable makefiles to specify the \fB.POSIX\fP
+special target in order to guarantee that they are not
+affected by local extensions.
+.LP
+The \fB-k\fP and \fB-S\fP options are both present so that the relationship
+between the command line, the \fIMAKEFLAGS\fP
+variable, and the makefile can be controlled precisely. If the \fBk\fP
+flag is passed in \fIMAKEFLAGS\fP and a command is of the
+form:
+.sp
+.RS
+.nf
+
+\fB$(MAKE) -S foo
+\fP
+.fi
+.RE
+.LP
+then the default behavior is restored for the child \fImake\fP.
+.LP
+When the \fB-n\fP option is specified, it is always added to \fIMAKEFLAGS
+\&.\fP This allows a recursive \fImake\fP \fB-n\fP
+\fItarget\fP to be used to see all of the action that would be taken
+to update \fItarget\fP.
+.LP
+Because of widespread historical practice, interpreting a \fB'#'\fP
+number sign inside a variable as the start of a comment
+has the unfortunate side effect of making it impossible to place a
+number sign in a variable, thus forbidding something like:
+.sp
+.RS
+.nf
+
+\fBCFLAGS = "-D COMMENT_CHAR='#'"
+\fP
+.fi
+.RE
+.LP
+Many historical \fImake\fP utilities stop chaining together inference
+rules when an intermediate target is nonexistent. For
+example, it might be possible for a \fImake\fP to determine that both
+\fB\&.y.c\fP and \fB.c.o\fP could be used to convert a
+\fB\&.y\fP to a \fB.o\fP. Instead, in this case, \fImake\fP requires
+the use of a \fB.y.o\fP rule.
+.LP
+The best way to provide portable makefiles is to include all of the
+rules needed in the makefile itself. The rules provided use
+only features provided by other parts of this volume of IEEE\ Std\ 1003.1-2001.
+The default rules include rules for
+optional commands in this volume of IEEE\ Std\ 1003.1-2001. Only rules
+pertaining to commands that are provided are needed
+in an implementation's default set.
+.LP
+Macros used within other macros are evaluated when the new macro is
+used rather than when the new macro is defined.
+Therefore:
+.sp
+.RS
+.nf
+
+\fBMACRO =\fP \fIvalue1\fP\fBNEW = $(MACRO)
+MACRO =\fP \fIvalue2\fP\fB
+.br
+
+target:
+ echo $(NEW)
+\fP
+.fi
+.RE
+.LP
+would produce \fIvalue2\fP and not \fIvalue1\fP since \fBNEW\fP was
+not expanded until it was needed in the \fIecho\fP command line.
+.LP
+Some historical applications have been known to intermix \fItarget_name\fP
+and \fImacro=name\fP operands on the command line,
+expecting that all of the macros are processed before any of the targets
+are dealt with. Conforming applications do not do this,
+although some backwards-compatibility support may be included in some
+implementations.
+.LP
+The following characters in filenames may give trouble: \fB'='\fP,
+\fB':'\fP, \fB'`'\fP, \fB'"\fP, and
+\fB'@'\fP . For inference rules, the description of $< and $? seem
+similar. However, an example shows the minor difference.
+In a makefile containing:
+.sp
+.RS
+.nf
+
+\fBfoo.o: foo.h
+\fP
+.fi
+.RE
+.LP
+if \fBfoo.h\fP is newer than \fBfoo.o\fP, yet \fBfoo.c\fP is older
+than \fBfoo.o\fP, the built-in rule to make \fBfoo.o\fP
+from \fBfoo.c\fP is used, with $< equal to \fBfoo.c\fP and $? equal
+to \fBfoo.h\fP. If \fBfoo.c\fP is also newer than
+\fBfoo.o\fP, $< is equal to \fBfoo.c\fP and $? is equal to \fBfoo.h
+foo.c\fP.
+.SH EXAMPLES
+.IP " 1." 4
+The following command:
+.sp
+.RS
+.nf
+
+\fBmake
+\fP
+.fi
+.RE
+.LP
+makes the first target found in the makefile.
+.LP
+.IP " 2." 4
+The following command:
+.sp
+.RS
+.nf
+
+\fBmake junk
+\fP
+.fi
+.RE
+.LP
+makes the target \fBjunk\fP.
+.LP
+.IP " 3." 4
+The following makefile says that \fBpgm\fP depends on two files, \fBa.o\fP
+and \fBb.o\fP, and that they in turn depend on
+their corresponding source files ( \fBa.c\fP and \fBb.c\fP), and a
+common file \fBincl.h\fP:
+.sp
+.RS
+.nf
+
+\fBpgm: a.o b.o
+ c99 a.o b.o -o pgm
+a.o: incl.h a.c
+ c99 -c a.c
+b.o: incl.h b.c
+ c99 -c b.c
+\fP
+.fi
+.RE
+.LP
+.IP " 4." 4
+An example for making optimized \fB.o\fP files from \fB.c\fP files
+is:
+.sp
+.RS
+.nf
+
+\fB\&.c.o:
+ c99 -c -O $*.c
+\fP
+.fi
+.RE
+.LP
+or:
+.sp
+.RS
+.nf
+
+\fB\&.c.o:
+ c99 -c -O $<
+\fP
+.fi
+.RE
+.LP
+.IP " 5." 4
+The most common use of the archive interface follows. Here, it is
+assumed that the source files are all C-language source:
+.sp
+.RS
+.nf
+
+\fBlib: lib(file1.o) lib(file2.o) lib(file3.o)
+ @echo lib is now up-to-date
+\fP
+.fi
+.RE
+.LP
+The \fB.c.a\fP rule is used to make \fBfile1.o\fP, \fBfile2.o\fP,
+and \fBfile3.o\fP and insert them into \fBlib\fP.
+.LP
+The treatment of escaped <newline>s throughout the makefile is historical
+practice. For example, the inference rule:
+.sp
+.RS
+.nf
+
+\fB\&.c.o\\
+:
+\fP
+.fi
+.RE
+.LP
+works, and the macro:
+.sp
+.RS
+.nf
+
+\fBf= bar baz\\
+ biz
+a:
+ echo ==$f==
+\fP
+.fi
+.RE
+.LP
+echoes \fB"==bar\ baz\ biz=="\fP .
+.LP
+If $? were:
+.sp
+.RS
+.nf
+
+\fB/usr/include/stdio.h /usr/include/unistd.h foo.h
+\fP
+.fi
+.RE
+.LP
+then $(?D) would be:
+.sp
+.RS
+.nf
+
+\fB/usr/include /usr/include .
+\fP
+.fi
+.RE
+.LP
+and $(?F) would be:
+.sp
+.RS
+.nf
+
+\fBstdio.h unistd.h foo.h
+\fP
+.fi
+.RE
+.LP
+.IP " 6." 4
+The contents of the built-in rules can be viewed by running:
+.sp
+.RS
+.nf
+
+\fBmake -p -f /dev/null 2>/dev/null
+\fP
+.fi
+.RE
+.LP
+.SH RATIONALE
+.LP
+The \fImake\fP utility described in this volume of IEEE\ Std\ 1003.1-2001
+is intended to provide the means for changing
+portable source code into executables that can be run on an IEEE\ Std\ 1003.1-2001-conforming
+system. It reflects the most
+common features present in System V and BSD \fImake\fPs.
+.LP
+Historically, the \fImake\fP utility has been an especially fertile
+ground for vendor and research organization-specific syntax
+modifications and extensions. Examples include:
+.IP " *" 3
+Syntax supporting parallel execution (such as from various multi-processor
+vendors, GNU, and others)
+.LP
+.IP " *" 3
+Additional "operators" separating targets and their prerequisites
+(System V, BSD, and others)
+.LP
+.IP " *" 3
+Specifying that command lines containing the strings \fB"${MAKE}"\fP
+and \fB"$(MAKE)"\fP are executed when the \fB-n\fP
+option is specified (GNU and System V)
+.LP
+.IP " *" 3
+Modifications of the meaning of internal macros when referencing libraries
+(BSD and others)
+.LP
+.IP " *" 3
+Using a single instance of the shell for all of the command lines
+of the target (BSD and others)
+.LP
+.IP " *" 3
+Allowing spaces as well as tabs to delimit command lines (BSD)
+.LP
+.IP " *" 3
+Adding C preprocessor-style "include" and "ifdef" constructs (System
+V, GNU, BSD, and others)
+.LP
+.IP " *" 3
+Remote execution of command lines (Sprite and others)
+.LP
+.IP " *" 3
+Specifying additional special targets (BSD, System V, and most others)
+.LP
+.LP
+Additionally, many vendors and research organizations have rethought
+the basic concepts of \fImake\fP, creating vastly
+extended, as well as completely new, syntaxes. Each of these versions
+of \fImake\fP fulfills the needs of a different community of
+users; it is unreasonable for this volume of IEEE\ Std\ 1003.1-2001
+to require behavior that would be incompatible (and
+probably inferior) to historical practice for such a community.
+.LP
+In similar circumstances, when the industry has enough sufficiently
+incompatible formats as to make them irreconcilable, this
+volume of IEEE\ Std\ 1003.1-2001 has followed one or both of two courses
+of action. Commands have been renamed ( \fIcksum\fP, \fIecho\fP, and
+\fIpax\fP) and/or command line options have been provided to select
+the desired behavior ( \fIgrep\fP, \fIod\fP, and \fIpax\fP).
+.LP
+Because the syntax specified for the \fImake\fP utility is, by and
+large, a subset of the syntaxes accepted by almost all
+versions of \fImake\fP, it was decided that it would be counter-productive
+to change the name. And since the makefile itself is a
+basic unit of portability, it would not be completely effective to
+reserve a new option letter, such as \fImake\fP \fB-P\fP, to
+achieve the portable behavior. Therefore, the special target \fB.POSIX\fP
+was added to the makefile, allowing users to specify
+"standard" behavior. This special target does not preclude extensions
+in the \fImake\fP utility, nor does it preclude such
+extensions being used by the makefile specifying the target; it does,
+however, preclude any extensions from being applied that
+could alter the behavior of previously valid syntax; such extensions
+must be controlled via command line options or new special
+targets. It is incumbent upon portable makefiles to specify the \fB.POSIX\fP
+special target in order to guarantee that they are
+not affected by local extensions.
+.LP
+The portable version of \fImake\fP described in this reference page
+is not intended to be the state-of-the-art software
+generation tool and, as such, some newer and more leading-edge features
+have not been included. An attempt has been made to
+describe the portable makefile in a manner that does not preclude
+such extensions as long as they do not disturb the portable
+behavior described here.
+.LP
+When the \fB-n\fP option is specified, it is always added to \fIMAKEFLAGS
+\&.\fP This allows a recursive \fImake\fP \fB-n\fP
+\fItarget\fP to be used to see all of the action that would be taken
+to update \fItarget\fP.
+.LP
+The definition of \fIMAKEFLAGS\fP allows both the System V letter
+string and the BSD command line formats. The two formats are
+sufficiently different to allow implementations to support both without
+ambiguity.
+.LP
+Early proposals stated that an "unquoted" number sign was treated
+as the start of a comment. The \fImake\fP utility does not
+pay any attention to quotes. A number sign starts a comment regardless
+of its surroundings.
+.LP
+The text about "other implementation-defined pathnames may also be
+tried" in addition to \fB./makefile\fP and
+\fB\&./Makefile\fP is to allow such extensions as \fBSCCS/s.Makefile\fP
+and other variations. It was made an implementation-defined
+requirement (as opposed to unspecified behavior) to highlight surprising
+implementations that might select something unexpected
+like \fB/etc/Makefile\fP. XSI-conformant systems also try \fB./s.makefile\fP,
+\fBSCCS/s.makefile\fP, \fB./s.Makefile\fP, and
+\fBSCCS/s.Makefile\fP.
+.LP
+Early proposals contained the macro \fBNPROC\fP as a means of specifying
+that \fImake\fP should use \fIn\fP processes to do
+the work required. While this feature is a valuable extension for
+many systems, it is not common usage and could require other
+non-trivial extensions to makefile syntax. This extension is not required
+by this volume of IEEE\ Std\ 1003.1-2001, but
+could be provided as a compatible extension. The macro \fBPARALLEL\fP
+is used by some historical systems with essentially the same
+meaning (but without using a name that is a common system limit value).
+It is suggested that implementors recognize the existing
+use of \fBNPROC\fP and/or \fBPARALLEL\fP as extensions to \fImake\fP.
+.LP
+The default rules are based on System V. The default \fBCC=\fP value
+is \fIc99\fP instead
+of \fIcc\fP because this volume of IEEE\ Std\ 1003.1-2001 does not
+standardize the utility named \fIcc\fP. Thus, every
+conforming application would be required to define \fBCC=\fP \fIc99\fP
+to expect to run.
+There is no advantage conferred by the hope that the makefile might
+hit the "preferred" compiler because this cannot be
+guaranteed to work. Also, since the portable makescript can only use
+the \fIc99\fP options, no
+advantage is conferred in terms of what the script can do. It is a
+quality-of-implementation issue as to whether \fIc99\fP is as valuable
+as \fIcc\fP.
+.LP
+The \fB-d\fP option to \fImake\fP is frequently used to produce debugging
+information, but is too implementation-defined to
+add to this volume of IEEE\ Std\ 1003.1-2001.
+.LP
+The \fB-p\fP option is not passed in \fIMAKEFLAGS\fP on most historical
+implementations and to change this would cause many
+implementations to break without sufficiently increased portability.
+.LP
+Commands that begin with a plus sign ( \fB'+'\fP ) are executed even
+if the \fB-n\fP option is present. Based on the GNU
+version of \fImake\fP, the behavior of \fB-n\fP when the plus-sign
+prefix is encountered has been extended to apply to \fB-q\fP
+and \fB-t\fP as well. However, the System V convention of forcing
+command execution with \fB-n\fP when the command line of a
+target contains either of the strings \fB"$(MAKE)"\fP or \fB"${MAKE}"\fP
+has not been adopted. This functionality appeared in
+early proposals, but the danger of this approach was pointed out with
+the following example of a portion of a makefile:
+.sp
+.RS
+.nf
+
+\fBsubdir:
+ cd subdir; rm all_the_files; $(MAKE)
+\fP
+.fi
+.RE
+.LP
+The loss of the System V behavior in this case is well-balanced by
+the safety afforded to other makefiles that were not aware of
+this situation. In any event, the command line plus-sign prefix can
+provide the desired functionality.
+.LP
+The double colon in the target rule format is supported in BSD systems
+to allow more than one target line containing the same
+target name to have commands associated with it. Since this is not
+functionality described in the SVID or XPG3 it has been allowed
+as an extension, but not mandated.
+.LP
+The default rules are provided with text specifying that the built-in
+rules shall be the same as if the listed set were used.
+The intent is that implementations should be able to use the rules
+without change, but will be allowed to alter them in ways that
+do not affect the primary behavior.
+.LP
+The best way to provide portable makefiles is to include all of the
+rules needed in the makefile itself. The rules provided use
+only features provided by other portions of this volume of IEEE\ Std\ 1003.1-2001.
+The default rules include rules for
+optional commands in this volume of IEEE\ Std\ 1003.1-2001. Only rules
+pertaining to commands that are provided are needed
+in the default set of an implementation.
+.LP
+One point of discussion was whether to drop the default rules list
+from this volume of IEEE\ Std\ 1003.1-2001. They
+provide convenience, but do not enhance portability of applications.
+The prime benefit is in portability of users who wish to type
+\fImake\fP \fIcommand\fP and have the command build from a \fBcommand.c\fP
+file.
+.LP
+The historical \fIMAKESHELL\fP feature was omitted. In some implementations
+it is used to let a user override the shell to be
+used to run \fImake\fP commands. This was confusing; for a portable
+\fImake\fP, the shell should be chosen by the makefile writer
+or specified on the \fImake\fP command line and not by a user running
+\fImake\fP.
+.LP
+The \fImake\fP utilities in most historical implementations process
+the prerequisites of a target in left-to-right order, and
+the makefile format requires this. It supports the standard idiom
+used in many makefiles that produce \fIyacc\fP programs; for example:
+.sp
+.RS
+.nf
+
+\fBfoo: y.tab.o lex.o main.o
+ $(CC) $(CFLAGS) -o $\fP@ \fBt.tab.o lex.o main.o
+\fP
+.fi
+.RE
+.LP
+In this example, if \fImake\fP chose any arbitrary order, the \fBlex.o\fP
+might not be made with the correct \fBy.tab.h\fP.
+Although there may be better ways to express this relationship, it
+is widely used historically. Implementations that desire to
+update prerequisites in parallel should require an explicit extension
+to \fImake\fP or the makefile format to accomplish it, as
+described previously.
+.LP
+The algorithm for determining a new entry for target rules is partially
+unspecified. Some historical \fImake\fPs allow blank,
+empty, or comment lines within the collection of commands marked by
+leading <tab>s. A conforming makefile must ensure that
+each command starts with a <tab>, but implementations are free to
+ignore blank, empty, and comment lines without triggering
+the start of a new entry.
+.LP
+The ASYNCHRONOUS EVENTS section includes having SIGTERM and SIGHUP,
+along with the more traditional SIGINT and SIGQUIT, remove
+the current target unless directed not to do so. SIGTERM and SIGHUP
+were added to parallel other utilities that have historically
+cleaned up their work as a result of these signals. When \fImake\fP
+receives any signal other than SIGQUIT, it is required to
+resend itself the signal it received so that it exits with a status
+that reflects the signal. The results from SIGQUIT are
+partially unspecified because, on systems that create \fBcore\fP files
+upon receipt of SIGQUIT, the \fBcore\fP from \fImake\fP
+would conflict with a \fBcore\fP file from the command that was running
+when the SIGQUIT arrived. The main concern was to prevent
+damaged files from appearing up-to-date when \fImake\fP is rerun.
+.LP
+The \fB.PRECIOUS\fP special target was extended to affect all targets
+globally (by specifying no prerequisites). The
+\fB\&.IGNORE\fP and \fB.SILENT\fP special targets were extended to allow
+prerequisites; it was judged to be more useful in some
+cases to be able to turn off errors or echoing for a list of targets
+than for the entire makefile. These extensions to \fImake\fP
+in System V were made to match historical practice from the BSD \fImake\fP.
+.LP
+Macros are not exported to the environment of commands to be run.
+This was never the case in any historical \fImake\fP and
+would have serious consequences. The environment is the same as the
+environment to \fImake\fP except that \fIMAKEFLAGS\fP and
+macros defined on the \fImake\fP command line are added.
+.LP
+Some implementations do not use \fIsystem\fP() for all command lines,
+as required by the
+portable makefile format; as a performance enhancement, they select
+lines without shell metacharacters for direct execution by \fIexecve\fP().
+There is no requirement that \fIsystem\fP() be used specifically,
+but merely that the same results be achieved. The
+metacharacters typically used to bypass the direct \fIexecve\fP()
+execution have been any
+of:
+.sp
+.RS
+.nf
+
+\fB= | ^ ( ) ; & < > * ? [ ] : $ ` ' " \\ \\n
+\fP
+.fi
+.RE
+.LP
+The default in some advanced versions of \fImake\fP is to group all
+the command lines for a target and execute them using a
+single shell invocation; the System V method is to pass each line
+individually to a separate shell. The single-shell method has the
+advantages in performance and the lack of a requirement for many continued
+lines. However, converting to this newer method has
+caused portability problems with many historical makefiles, so the
+behavior with the POSIX makefile is specified to be the same as
+that of System V. It is suggested that the special target \fB.ONESHELL\fP
+be used as an implementation extension to achieve the
+single-shell grouping for a target or group of targets.
+.LP
+Novice users of \fImake\fP have had difficulty with the historical
+need to start commands with a <tab>. Since it is often
+difficult to discern differences between <tab>s and <space>s on terminals
+or printed listings, confusing bugs can
+arise. In early proposals, an attempt was made to correct this problem
+by allowing leading <blank>s instead of <tab>s.
+However, implementors reported many makefiles that failed in subtle
+ways following this change, and it is difficult to implement a
+\fImake\fP that unambiguously can differentiate between macro and
+command lines. There is extensive historical practice of
+allowing leading spaces before macro definitions. Forcing macro lines
+into column 1 would be a significant backwards-compatibility
+problem for some makefiles. Therefore, historical practice was restored.
+.LP
+The System V INCLUDE feature was considered, but not included. This
+would treat a line that began in the first column and
+contained INCLUDE <\fIfilename\fP> as an indication to read <\fIfilename\fP>
+at that point in the makefile. This is
+difficult to use in a portable way, and it raises concerns about nesting
+levels and diagnostics. System V, BSD, GNU, and others
+have used different methods for including files.
+.LP
+The System V dynamic dependency feature was not included. It would
+support:
+.sp
+.RS
+.nf
+
+\fBcat: $$@.c
+\fP
+.fi
+.RE
+.LP
+that would expand to;
+.sp
+.RS
+.nf
+
+\fBcat: cat.c
+\fP
+.fi
+.RE
+.LP
+This feature exists only in the new version of System V \fImake\fP
+and, while useful, is not in wide usage. This means that
+macros are expanded twice for prerequisites: once at makefile parse
+time and once at target update time.
+.LP
+Consideration was given to adding metarules to the POSIX \fImake\fP.
+This would make \fB%.o:\ %.c\fP the same as
+\fB\&.c.o:\fP. This is quite useful and available from some vendors,
+but it would cause too many changes to this \fImake\fP to
+support. It would have introduced rule chaining and new substitution
+rules. However, the rules for target names have been set to
+reserve the \fB'%'\fP and \fB''\fP characters. These are traditionally
+used to implement metarules and quoting of target
+names, respectively. Implementors are strongly encouraged to use these
+characters only for these purposes.
+.LP
+A request was made to extend the suffix delimiter character from a
+period to any character. The metarules feature in newer
+\fImake\fPs solves this problem in a more general way. This volume
+of IEEE\ Std\ 1003.1-2001 is staying with the more
+conservative historical definition.
+.LP
+The standard output format for the \fB-p\fP option is not described
+because it is primarily a debugging option and because the
+format is not generally useful to programs. In historical implementations
+the output is not suitable for use in generating
+makefiles. The \fB-p\fP format has been variable across historical
+implementations. Therefore, the definition of \fB-p\fP was
+only to provide a consistently named option for obtaining \fImake\fP
+script debugging information.
+.LP
+Some historical implementations have not cleared the suffix list with
+\fB-r\fP.
+.LP
+Implementations should be aware that some historical applications
+have intermixed \fItarget_name\fP and \fImacro\fP=
+\fIvalue\fP operands on the command line, expecting that all of the
+macros are processed before any of the targets are dealt with.
+Conforming applications do not do this, but some backwards-compatibility
+support may be warranted.
+.LP
+Empty inference rules are specified with a semicolon command rather
+than omitting all commands, as described in an early
+proposal. The latter case has no traditional meaning and is reserved
+for implementation extensions, such as in GNU \fImake\fP.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIShell Command Language\fP, \fIar\fP, \fIc99\fP, \fIget\fP,
+\fIlex\fP, \fIsccs\fP, \fIsh\fP, \fIyacc\fP, the System Interfaces
+volume
+of IEEE\ Std\ 1003.1-2001, \fIexec\fP, \fIsystem\fP()
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .