Provided by: manpages-posix_2.16-1_all bug

NAME

       make - maintain, update, and regenerate groups of programs (DEVELOPMENT)

SYNOPSIS

       make [-einpqrst][-f makefile]...[ -k| -S][macro=value]...
              [target_name...]

DESCRIPTION

       The  make  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  make  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:

        1. Inference  rules,  which  have one target name with at least one period ( '.' ) and no
           slash ( '/' )

        2. Target rules, which can have more than one target name

       In addition, make shall have a collection of built-in  macros  and  inference  rules  that
       infer prerequisite relationships to simplify maintenance of programs.

       To  receive  exactly  the behavior described in this section, the user shall ensure that a
       portable makefile shall:

        * Include the special target .POSIX

        * Omit any special target reserved for implementations  (a  leading  period  followed  by
          uppercase letters) that has not been specified by this section

       The behavior of make is unspecified if either or both of these conditions are not met.

OPTIONS

       The  make  utility  shall  conform to the Base Definitions volume of IEEE Std 1003.1-2001,
       Section 12.2, Utility Syntax Guidelines.

       The following options shall be supported:

       -e     Cause environment variables, including those with null values,  to  override  macro
              assignments within makefiles.

       -f  makefile
              Specify  a different makefile. The argument makefile is a pathname of a description
              file, which is also referred to as the makefile. A pathname of '-' 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.

       -i     Ignore  error  codes  returned by invoked commands. This mode is the same as if the
              special target .IGNORE were specified without prerequisites.

       -k     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.

       -n     Write  commands that would be executed on standard output, but do not execute them.
              However, lines with a plus sign ( '+' ) prefix shall be  executed.  In  this  mode,
              lines with an at sign ( '@' ) character prefix shall be written to standard output.

       -p     Write  to  standard  output  the  complete  set  of  macro  definitions  and target
              descriptions. The output format is unspecified.

       -q     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  (  '+'  )
              prefix shall be executed.

       -r     Clear the suffix list and do not use the built-in rules.

       -S     Terminate  make  if  an error occurs while executing the commands to bring a target
              up-to-date. This shall be the default and the opposite of -k.

       -s     Do not write makefile command lines or touch messages (see -t) to  standard  output
              before executing. This mode shall be the same as if the special target .SILENT were
              specified without prerequisites.

       -t     Update the modification time of each target as  though  a  touch  target  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 makefile command lines associated with each  target  are
              not  executed.   However,  a  command line with a plus sign ( '+' ) prefix shall be
              executed.

       Any options specified in the MAKEFLAGS environment variable shall be evaluated before  any
       options  specified  on  the  make  utility command line. If the -k and -S options are both
       specified on the make utility command line or by the MAKEFLAGS environment  variable,  the
       last  option  specified  shall  take  precedence.  If  the  -f or -p options appear in the
       MAKEFLAGS environment variable, the result is undefined.

OPERANDS

       The following operands shall be supported:

       target_name
              Target names, as defined in the EXTENDED  DESCRIPTION  section.  If  no  target  is
              specified,  while  make  is  processing  the  makefiles, the first target that make
              encounters that is not a special target or an inference rule shall be used.

       macro=value
              Macro definitions, as defined in Macros .

       If the target_name and macro= value operands are intermixed on the  make  utility  command
       line, the results are unspecified.

STDIN

       The  standard  input  shall  be used only if the makefile option-argument is '-' . See the
       INPUT FILES section.

INPUT FILES

       The input file, otherwise known as the makefile, is a text file  containing  rules,  macro
       definitions, and comments. See the EXTENDED DESCRIPTION section.

ENVIRONMENT VARIABLES

       The following environment variables shall affect the execution of make:

       LANG   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.)

       LC_ALL If set to  a  non-empty  string  value,  override  the  values  of  all  the  other
              internationalization variables.

       LC_CTYPE
              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).

       LC_MESSAGES
              Determine  the  locale  that  should  be  used to affect the format and contents of
              diagnostic messages written to standard error.

       MAKEFLAGS

              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):

               * The characters are  option  letters  without  the  leading  hyphens  or  <blank>
                 separation used on a make utility command line.

               * The  characters  are  formatted  in  a  manner  similar to a portion of the make
                 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 macro= value macro definition operands can  also
                 be  included.  The  difference  between  the  contents of MAKEFLAGS and the make
                 utility command line is that the contents of the variable shall not be subjected
                 to  the  word  expansions  (see  Word  Expansions  ) associated with parsing the
                 command line values.

       NLSPATH
              Determine the location of message catalogs for the processing of LC_MESSAGES .

       PROJECTDIR

              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 SCCS in the identified directory. If the value of PROJECTDIR begins  with
              a  slash,  it  shall  be  considered  an absolute pathname; otherwise, the value of
              PROJECTDIR is treated as a user name and  that  user's  initial  working  directory
              shall  be  examined for a subdirectory src or source. If such a directory is found,
              it shall be used. Otherwise, the value is used as a relative pathname.

       If PROJECTDIR is not set or has a null value, the search for SCCS files shall be  made  in
       the directory SCCS in the current directory.

       The  setting  of  PROJECTDIR  affects  all  files  listed in the remainder of this utility
       description for files with a component named SCCS.

       The value of the SHELL environment variable shall not be used as a macro and shall not  be
       modified  by  defining  the  SHELL  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 .

ASYNCHRONOUS EVENTS

       If  not  already  ignored, make 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  .PRECIOUS  or  unless one of the -n, -p, or -q 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, make shall take the
       standard action for all other signals.

STDOUT

       The make utility shall write all commands to be executed to standard output unless the  -s
       option  was  specified,  the  command  is  prefixed with an at sign, or the special target
       .SILENT has either the current target as a prerequisite or has no prerequisites.  If  make
       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 -t option is  present  and  a  file  is
       touched,  make  shall  write to standard output a message of unspecified format indicating
       that the file was touched, including the filename of the file.

STDERR

       The standard error shall be used only for diagnostic messages.

OUTPUT FILES

       Files can be created when the -t option is present. Additional files can also  be  created
       by the utilities invoked by make.

EXTENDED DESCRIPTION

       The  make  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 make 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 make utility shall use the modification times
       of files to determine whether the corresponding targets are out-of-date.

       After make 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.

   Makefile Syntax
       A makefile can contain rules, macro definitions (see Macros ), and comments. There are two
       kinds  of rules: inference rules and target rules. The make utility shall contain a set of
       built-in inference rules.  If the -r 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  (  '#'  )  and  continue
       until an unescaped <newline> is reached.

       By  default, the following files shall be tried in sequence: ./makefile and ./Makefile. If
       neither ./makefile or ./Makefile are found, other implementation-defined files may also be
       tried.     On  XSI-conformant systems, the additional files ./s.makefile, SCCS/s.makefile,
       ./s.Makefile, and SCCS/s.Makefile shall also be tried.

       The -f option shall direct make to ignore any of these default files and use the specified
       argument  as a makefile instead. If the '-' argument is specified, standard input shall be
       used.

       The term makefile is used to  refer  to  any  rules  provided  by  the  user,  whether  in
       ./makefile or its variants, or specified by the -f option.

       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.

       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>.

   Makefile Execution
       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 '@' 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 system() function. The environment for the command  being  executed  shall
       contain all of the variables in the environment of make.

       By default, when make receives a non-zero status from the execution of a command, it shall
       terminate with an error message to standard error.

       Makefile command lines can have one or more of the following prefixes: a hyphen (  '-'  ),
       an  at  sign  (  '@'  ),  or a plus sign ( '+' ). These shall modify the way in which make
       processes the command. When a command is written to standard output, the prefix shall  not
       be included in the output.

       -      If  the  command  prefix  contains  a  hyphen,  or the -i option is present, or the
              special target .IGNORE has either the current target as a prerequisite  or  has  no
              prerequisites, any error found while executing the command shall be ignored.

       @      If  the  command  prefix  contains  an at sign and the make utility command line -n
              option is not specified, or the -s option is present, or the special target .SILENT
              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.

       +      If the command prefix contains a plus sign, this indicates a makefile command  line
              that shall be executed even if -n, -q, or -t is specified.

   Target Rules
       Target rules are formatted as follows:

              target [target...]: [prerequisite...][;command]
              [<tab>command<tab>command...]

              line that does not begin with <tab>

       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 '#' shall begin a new entry. An empty or blank line, or a line beginning
       with '#' , may begin a new entry.

       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 '%' and '' is implementation-defined.

       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.

       Lines that begin with one of the following are called  special  targets  and  control  the
       operation of make:

       .DEFAULT
              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
              make if there are no other rules available to build a target.

       .IGNORE
              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 -i option. Subsequent occurrences of .IGNORE shall add to the list
              of targets ignoring command errors. If no prerequisites are specified,  make  shall
              behave  as  if  the  -i  option  had  been  specified  and errors from all commands
              associated with all targets shall be ignored.

       .POSIX 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, make shall process the makefile as specified by this section;  otherwise,
              the behavior of make is unspecified.

       .PRECIOUS
              Prerequisites  of  this special target shall not be removed if make receives one of
              the asynchronous events explicitly described in the  ASYNCHRONOUS  EVENTS  section.
              Subsequent occurrences of .PRECIOUS 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 .PRECIOUS.

       .SCCS_GET
              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.

       When  source  files  are  named  in a dependency list, make 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, make shall assume that that file is up-to-date. If, however,  an
       SCCS  file  named SCCS/s. source_file is found for a target source_file, make compares the
       timestamp of the target file with that of the SCCS/s.source_file to ensure the  target  is
       up-to-date.  If  the  target  is  missing,  or  if  the  SCCS  file  is  newer, make shall
       automatically issue the commands specified for the .SCCS_GET special  target  to  retrieve
       the  most  recent  version.  However,  if the target is writable by anyone, make shall not
       retrieve a new version.

       .SILENT
              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 .SILENT shall add to the  list  of  targets
              with  silent  commands.  If no prerequisites are specified, make shall behave as if
              the -s option had been specified and no commands or touch messages associated  with
              any target shall be written to standard output.

       .SUFFIXES
              Prerequisites  of .SUFFIXES shall be appended to the list of known suffixes and are
              used in conjunction with the inference rules (see Inference Rules ).  If  .SUFFIXES
              does not have any prerequisites, the list of known suffixes shall be cleared.

       The  special targets .IGNORE, .POSIX, .PRECIOUS, .SILENT, and .SUFFIXES shall be specified
       without commands.

       Targets with names consisting of a  leading  period  followed  by  the  uppercase  letters
       "POSIX"  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.

   Macros
       Macro definitions are in the form:

              string1 = [string2]

       The  macro  named  string1  is  defined  as  having the value of string2, where string2 is
       defined as all characters, if any, after the equal sign, up to a comment character ( '#' )
       or  an  unescaped <newline>. Any <blank>s immediately before or after the equal sign shall
       be ignored.

       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.

       Macros can appear anywhere in the makefile. Macro expansions using the forms  $(  string1)
       or ${ string1} shall be replaced by string2, as follows:

        * Macros in target lines shall be evaluated when the target line is read.

        * Macros in makefile command lines shall be evaluated when the command is executed.

        * Macros  in  the  string before the equals sign in a macro definition shall be evaluated
          when the macro assignment is made.

        * 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.

       The parentheses or braces are optional if string1 is a  single  character.  The  macro  $$
       shall be replaced by the single character '$' . If string1 in a macro expansion contains a
       macro expansion, the results are unspecified.

       Macro expansions using the forms $( string1 [: subst1 =[  subst2  ]])  or  ${  string1  [:
       subst1 =[ subst2 ]]} can be used to replace all occurrences of subst1 with subst2 when the
       macro substitution is performed. The subst1 to be replaced shall be recognized when it  is
       a  suffix at the end of a word in string1 (where a word, in this context, is defined to be
       a string delimited by the beginning of the line, a <blank>, or a <newline>). If string1 in
       a macro expansion contains a macro expansion, the results are unspecified.

       Macro  expansions in string1 of macro definition lines shall be evaluated when read. Macro
       expansions in string2 of  macro  definition  lines  shall  be  performed  when  the  macro
       identified by string1 is expanded in a rule or command.

       Macro  definitions  shall  be  taken  from the following sources, in the following logical
       order, before the makefile(s) are read.

        1. Macros specified on the make 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.

        2. Macros defined by the MAKEFLAGS 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.

        3. The contents of the environment, excluding  the  MAKEFLAGS  and  SHELL  variables  and
           including the variables with null values.

        4. Macros defined in the inference rules built into make.

       Macro  definitions  from  these sources shall not override macro definitions from a lower-
       numbered source. Macro definitions from a single source (for  example,  the  make  utility
       command  line,  the  MAKEFLAGS  environment  variable, or the other environment variables)
       shall override previous macro definitions from the same source.

       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 -e 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.

       Before  the  makefile(s) are read, all of the make utility command line options (except -f
       and -p) and make utility command line macro definitions  (except  any  for  the  MAKEFLAGS
       macro),  not  already  included  in  the  MAKEFLAGS macro, shall be added to the MAKEFLAGS
       macro, quoted in an implementation-defined manner such that  when  MAKEFLAGS  is  read  by
       another  instance  of  the  make  command,  the original macro's value is recovered. Other
       implementation-defined options and macros may also be added to  the  MAKEFLAGS  macro.  If
       this  modifies the value of the MAKEFLAGS macro, or, if the MAKEFLAGS macro is modified at
       any subsequent time, the MAKEFLAGS environment variable shall be modified to match the new
       value  of  the  MAKEFLAGS  macro.  The  result  of  setting  MAKEFLAGS  in the Makefile is
       unspecified.

       Before the makefile(s) are read, all of the make utility command  line  macro  definitions
       (except the MAKEFLAGS macro or the SHELL macro) shall be added to the environment of make.
       Other implementation-defined variables may also be added to the environment of make.

       The SHELL macro shall be treated specially. It shall be provided by make and  set  to  the
       pathname  of  the  shell  command  language  interpreter  (see sh ). The SHELL environment
       variable shall not affect the value of the  SHELL  macro.  If  SHELL  is  defined  in  the
       makefile  or  is specified on the command line, it shall replace the original value of the
       SHELL macro, but shall not  affect  the  SHELL  environment  variable.  Other  effects  of
       defining SHELL in the makefile or on the command line are implementation-defined.

   Inference Rules
       Inference rules are formatted as follows:

              target:
              <tab>command
              [<tab>command]...

              line that does not begin with <tab> or #

       The  application  shall  ensure that the target portion is a valid target name (see Target
       Rules ) of the form .s2 or .s1.s2 (where .s1 and .s2 are suffixes that have been given  as
       prerequisites  of the .SUFFIXES special target and s1 and s2 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.

       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 empty rule, described below. Prerequisites are inferred, as
       described below.

       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:

              rule: ;

       where zero or more <blank>s separate the colon and semicolon.

       The  make  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, make contains a built-in set of inference rules.  Additional rules
       can be specified in the makefile.

       The special target .SUFFIXES 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 .SUFFIXES special target in the makefile. A
       .SUFFIXES target with no  prerequisites  shall  clear  the  list  of  suffixes.  An  empty
       .SUFFIXES  target  followed by a new .SUFFIXES list is required to change the order of the
       suffixes.

       Normally, the user would provide an inference rule for each suffix.  The inference rule to
       update  a target with a suffix .s1 from a prerequisite with a suffix .s2 is specified as a
       target .s2.s1. The internal macros provide the means to specify  general  inference  rules
       (see Internal Macros ).

       When no target rule is found to update a target, the inference rules shall be checked. The
       suffix of the target ( .s1) to be built is compared to the list of suffixes  specified  by
       the  .SUFFIXES  special  targets.  If  the .s1 suffix is found in .SUFFIXES, the inference
       rules shall be searched in the order defined for the first .s2.s1 rule whose  prerequisite
       file  ( $*.s2) exists. If the target is out-of-date with respect to this prerequisite, the
       commands for that inference rule shall be executed.

       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 .s2 is the definition of
       how to build target from target.s2. The other suffix ( .s1) is treated as null.

       A tilde ( '~' ) in the above rules refers to an SCCS file in the current directory.  Thus,
       the  rule  .c~.o would transform an SCCS C-language source file into an object file ( .o).
       Because the s. of the SCCS files is a prefix, it is incompatible with make's suffix  point
       of  view.   Hence,  the  '~'  is  a  way  of changing any file reference into an SCCS file
       reference.

   Libraries
       If a target or prerequisite contains parentheses, it shall be treated as a  member  of  an
       archive  library. For the lib( member .o) expression lib refers to the name of the archive
       library and member .o to the member name. The application shall ensure that the member  is
       an  object  file  with  the  .o  suffix.  The  modification  time of the expression is the
       modification time for the member as kept in the archive library; see ar .  The  .a  suffix
       shall  refer to an archive library. The .s2.a rule shall be used to update a member in the
       library from a file with a suffix .s2.

   Internal Macros
       The make 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 target  rule,  inference  rule,  target,  and  prerequisite  is
       necessary.

       Target  rules  are  specified by the user in a makefile for a particular target. Inference
       rules are user-specified or make-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.

       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.

       In the definitions that follow, the word target refers to one of:

        * A target specified in the makefile

        * An explicit prerequisite specified in the makefile that becomes the  target  when  make
          processes it during recursion

        * An implicit prerequisite that becomes a target when make processes it during recursion

       In the definitions that follow, the word prerequisite refers to one of the following:

        * An explicit prerequisite specified in the makefile for a particular target

        * An  implicit  prerequisite  generated  as a result of locating an appropriate inference
          rule and corresponding file that matches the suffix of the target

       The five internal macros are:

       $@     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.

       For example, in the .c.a inference rule, $@ represents  the  out-of-date  .a  file  to  be
       built.  Similarly, in a makefile target rule to build lib.a from file.c, $@ represents the
       out-of-date lib.a.

       $%     The $% macro shall be evaluated only when the current target is an archive  library
              member  of  the  form  libname(  member  .o).  In these cases, $@ shall evaluate to
              libname and $% shall evaluate to member .o. The $% macro  shall  be  evaluated  for
              both target and inference rules.

       For  example,  in a makefile target rule to build lib.a( file.o), $% represents file.o, as
       opposed to $@, which represents lib.a.

       $?     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.

       For  example,  in a makefile target rule to build prog from file1.o, file2.o, and file3.o,
       and where prog is not out-of-date with respect to file1.o, but is out-of-date with respect
       to file2.o and file3.o, $? represents file2.o and file3.o.

       $<     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 .DEFAULT  rule,  the
              $<  macro  shall  evaluate  to the current target name. The meaning of the $< macro
              shall be otherwise unspecified.

       For example, in the .c.a inference rule, $< represents the prerequisite .c file.

       $*     The $* macro shall evaluate to the current target name with its suffix deleted.  It
              shall be evaluated at least for inference rules.

       For  example,  in  the  .c.a  inference rule, $*.o represents the out-of-date .o file that
       corresponds to the prerequisite .c file.

       Each of the internal macros has an alternative form. When  an  uppercase  'D'  or  'F'  is
       appended  to any of the macros, the meaning shall be changed to the directory part for 'D'
       and filename part for 'F' . The directory part is the path prefix of the  file  without  a
       trailing  slash;  for the current directory, the directory part is '.' . 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.

       For the target lib( member .o) and the s2.a rule, the internal macros shall be defined as:

       $<     member .s2

       $*     member

       $@     lib

       $?     member .s2

       $%     member .o

   Default Rules
       The  default  rules  for  make 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 CC, CFLAGS, YACC, YFLAGS, LEX, LFLAGS, LDFLAGS, and the .c, .y, and .l inference
       rules. Implementations that do not support  FORTRAN  may  omit  FC,  FFLAGS,  and  the  .f
       inference rules. Implementations may provide additional macros and rules.

              SPECIAL TARGETS

              .SCCS_GET: sccs $(SCCSFLAGS) get $(SCCSGETFLAGS) $@

              .SUFFIXES: .o .c .y .l .a .sh .f .c~ .y~ .l~ .sh~ .f~

              MACROS

              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

              SINGLE SUFFIX RULES

              .c:
                  $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $<

              .f:
                  $(FC) $(FFLAGS) $(LDFLAGS) -o $@ $<

              .sh:
                  cp $< $@
                  chmod a+x $@

              .c~:
                  $(GET) $(GFLAGS) -p $< > $*.c
                  $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $*.c

              .f~:
                  $(GET) $(GFLAGS) -p $< > $*.f
                  $(FC) $(FFLAGS) $(LDFLAGS) -o $@ $*.f

              .sh~:
                  $(GET) $(GFLAGS) -p $< > $*.sh
                  cp $*.sh $@
                  chmod a+x $@

              DOUBLE SUFFIX RULES

              .c.o:
                  $(CC) $(CFLAGS) -c $<

              .f.o:
                  $(FC) $(FFLAGS) -c $<

              .y.o:
                  $(YACC) $(YFLAGS) $<
                  $(CC) $(CFLAGS) -c y.tab.c
                  rm -f y.tab.c
                  mv y.tab.o $@

              .l.o:
                  $(LEX) $(LFLAGS) $<
                  $(CC) $(CFLAGS) -c lex.yy.c
                  rm -f lex.yy.c
                  mv lex.yy.o $@

              .y.c:
                  $(YACC) $(YFLAGS) $<
                  mv y.tab.c $@

              .l.c:
                  $(LEX) $(LFLAGS) $<
                  mv lex.yy.c $@

              .c~.o:
                  $(GET) $(GFLAGS) -p $< > $*.c
                  $(CC) $(CFLAGS) -c $*.c

              .f~.o:
                  $(GET) $(GFLAGS) -p $< > $*.f
                  $(FC) $(FFLAGS) -c $*.f

              .y~.o:
                  $(GET) $(GFLAGS) -p $< > $*.y
                  $(YACC) $(YFLAGS) $*.y
                  $(CC) $(CFLAGS) -c y.tab.c
                  rm -f y.tab.c
                  mv y.tab.o $@

              .l~.o:
                  $(GET) $(GFLAGS) -p $< > $*.l
                  $(LEX) $(LFLAGS) $*.l
                  $(CC) $(CFLAGS) -c lex.yy.c
                  rm -f lex.yy.c
                  mv lex.yy.o $@

              .y~.c:
                  $(GET) $(GFLAGS) -p $< > $*.y
                  $(YACC) $(YFLAGS) $*.y
                  mv y.tab.c $@

              .l~.c:
                  $(GET) $(GFLAGS) -p $< > $*.l
                  $(LEX) $(LFLAGS) $*.l
                  mv lex.yy.c $@

              .c.a:
                  $(CC) -c $(CFLAGS) $<
                  $(AR) $(ARFLAGS) $@ $*.o
                  rm -f $*.o

              .f.a:
                  $(FC) -c $(FFLAGS) $<
                  $(AR) $(ARFLAGS) $@ $*.o
                  rm -f $*.o

EXIT STATUS

       When  the  -q  option  is specified, the make utility shall exit with one of the following
       values:

        0     Successful completion.

        1     The target was not up-to-date.

       >1     An error occurred.

       When the -q option is not specified, the make utility shall exit with one of the following
       values:

        0     Successful completion.

       >0     An error occurred.

CONSEQUENCES OF ERRORS

       Default.

       The following sections are informative.

APPLICATION USAGE

       If  there is a source file (such as ./source.c) and there are two SCCS files corresponding
       to it ( ./s.source.c and ./SCCS/s.source.c), on XSI-conformant systems make uses the  SCCS
       file  in  the  current  directory.  However,  users are advised to use the underlying SCCS
       utilities ( admin, delta, get, and so on) or the sccs 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.

       It is incumbent upon portable makefiles to specify the .POSIX special target in  order  to
       guarantee that they are not affected by local extensions.

       The  -k and -S options are both present so that the relationship between the command line,
       the MAKEFLAGS variable, and the makefile can be controlled precisely. If  the  k  flag  is
       passed in MAKEFLAGS and a command is of the form:

              $(MAKE) -S foo

       then the default behavior is restored for the child make.

       When the -n option is specified, it is always added to MAKEFLAGS . This allows a recursive
       make -n target to be used to see all of the action that would be taken to update target.

       Because of widespread historical  practice,  interpreting  a  '#'  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:

              CFLAGS = "-D COMMENT_CHAR='#'"

       Many historical make utilities stop chaining together inference rules when an intermediate
       target is nonexistent. For example, it might be possible for a make to determine that both
       .y.c and .c.o could be used to convert a .y to a .o. Instead, in this case, make  requires
       the use of a .y.o rule.

       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.

       Macros  used within other macros are evaluated when the new macro is used rather than when
       the new macro is defined.  Therefore:

              MACRO = value1NEW   = $(MACRO)
              MACRO = value2

              target:
                  echo $(NEW)

       would produce value2 and not value1 since NEW was not expanded until it was needed in  the
       echo command line.

       Some  historical  applications  have  been  known  to  intermix target_name and macro=name
       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.

       The following characters in filenames may give trouble: '=' , ':' , '`' , '" , and  '@'  .
       For  inference rules, the description of $< and $? seem similar. However, an example shows
       the minor difference.  In a makefile containing:

              foo.o: foo.h

       if foo.h is newer than foo.o, yet foo.c is older than foo.o, the  built-in  rule  to  make
       foo.o  from  foo.c is used, with $< equal to foo.c and $? equal to foo.h. If foo.c is also
       newer than foo.o, $< is equal to foo.c and $? is equal to foo.h foo.c.

EXAMPLES

        1. The following command:

           make

       makes the first target found in the makefile.

        2. The following command:

           make junk

       makes the target junk.

        3. The following makefile says that pgm depends on two files, a.o and b.o, and that  they
           in  turn  depend on their corresponding source files ( a.c and b.c), and a common file
           incl.h:

           pgm: 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

        4. An example for making optimized .o files from .c files is:

           .c.o:
               c99 -c -O $*.c

       or:

              .c.o:
                  c99 -c -O $<

        5. The most common use of the archive interface follows. Here, it  is  assumed  that  the
           source files are all C-language source:

           lib: lib(file1.o) lib(file2.o) lib(file3.o)
               @echo lib is now up-to-date

       The .c.a rule is used to make file1.o, file2.o, and file3.o and insert them into lib.

       The  treatment  of  escaped <newline>s throughout the makefile is historical practice. For
       example, the inference rule:

              .c.o\
              :

       works, and the macro:

              f=  bar baz\
                  biz
              a:
                  echo ==$f==

       echoes "==bar baz biz==" .

       If $? were:

              /usr/include/stdio.h /usr/include/unistd.h foo.h

       then $(?D) would be:

              /usr/include /usr/include .

       and $(?F) would be:

              stdio.h unistd.h foo.h

        6. The contents of the built-in rules can be viewed by running:

           make -p -f /dev/null 2>/dev/null

RATIONALE

       The make 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 makes.

       Historically,  the  make  utility  has  been  an  especially fertile ground for vendor and
       research organization-specific syntax modifications and extensions. Examples include:

        * Syntax supporting parallel execution (such as  from  various  multi-processor  vendors,
          GNU, and others)

        * Additional  "operators"  separating targets and their prerequisites (System V, BSD, and
          others)

        * Specifying that command lines  containing  the  strings  "${MAKE}"  and  "$(MAKE)"  are
          executed when the -n option is specified (GNU and System V)

        * Modifications  of  the  meaning  of internal macros when referencing libraries (BSD and
          others)

        * Using a single instance of the shell for all of the command lines of  the  target  (BSD
          and others)

        * Allowing spaces as well as tabs to delimit command lines (BSD)

        * Adding  C  preprocessor-style "include" and "ifdef" constructs (System V, GNU, BSD, and
          others)

        * Remote execution of command lines (Sprite and others)

        * Specifying additional special targets (BSD, System V, and most others)

       Additionally, many vendors and research organizations have rethought the basic concepts of
       make,  creating  vastly  extended,  as  well  as  completely  new, syntaxes. Each of these
       versions of make 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.

       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 ( cksum, echo, and  pax)  and/or
       command  line  options  have  been provided to select the desired behavior ( grep, od, and
       pax).

       Because the syntax specified for the make utility is,  by  and  large,  a  subset  of  the
       syntaxes accepted by almost all versions of make, 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
       make -P, to achieve the portable behavior. Therefore, the special target .POSIX was  added
       to  the  makefile, allowing users to specify "standard" behavior. This special target does
       not preclude extensions in the make 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 .POSIX special target in order to  guarantee  that  they
       are not affected by local extensions.

       The  portable  version  of make 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.

       When the -n option is specified, it is always added to MAKEFLAGS . This allows a recursive
       make -n target to be used to see all of the action that would be taken to update target.

       The definition of MAKEFLAGS 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.

       Early proposals stated that an "unquoted" number sign  was  treated  as  the  start  of  a
       comment.  The  make  utility  does not pay any attention to quotes. A number sign starts a
       comment regardless of its surroundings.

       The text about "other implementation-defined pathnames may also be tried" in  addition  to
       ./makefile  and  ./Makefile  is  to  allow  such  extensions  as SCCS/s.Makefile 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  /etc/Makefile.  XSI-conformant  systems  also  try  ./s.makefile,   SCCS/s.makefile,
       ./s.Makefile, and SCCS/s.Makefile.

       Early  proposals contained the macro NPROC as a means of specifying that make should use n
       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 PARALLEL 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
       NPROC and/or PARALLEL as extensions to make.

       The default rules are based on System V. The default  CC=  value  is  c99  instead  of  cc
       because  this  volume  of  IEEE Std 1003.1-2001 does not standardize the utility named cc.
       Thus, every conforming application would be required to define CC= c99 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 c99 options, no advantage is conferred in terms of what the script can
       do. It is a quality-of-implementation issue as to whether c99 is as valuable as cc.

       The -d option to make is frequently used to produce  debugging  information,  but  is  too
       implementation-defined to add to this volume of IEEE Std 1003.1-2001.

       The  -p option is not passed in MAKEFLAGS on most historical implementations and to change
       this would cause many implementations to break without sufficiently increased portability.

       Commands that begin with a plus sign ( '+' )  are  executed  even  if  the  -n  option  is
       present. Based on the GNU version of make, the behavior of -n when the plus-sign prefix is
       encountered has been extended to apply to -q  and  -t  as  well.  However,  the  System  V
       convention of forcing command execution with -n when the command line of a target contains
       either of the strings "$(MAKE)" or "${MAKE}" 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:

              subdir:
                  cd subdir; rm all_the_files; $(MAKE)

       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.

       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.

       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.

       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.

       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 make  command
       and have the command build from a command.c file.

       The  historical MAKESHELL feature was omitted. In some implementations it is used to let a
       user override the shell to be used to  run  make  commands.  This  was  confusing;  for  a
       portable  make, the shell should be chosen by the makefile writer or specified on the make
       command line and not by a user running make.

       The make 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 yacc programs; for example:

              foo: y.tab.o lex.o main.o
                  $(CC) $(CFLAGS) -o $@ t.tab.o lex.o main.o

       In this example, if make chose any arbitrary order, the lex.o might not be made  with  the
       correct  y.tab.h.   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 make or the makefile format to accomplish it, as
       described previously.

       The algorithm for determining a new entry for target rules is partially unspecified.  Some
       historical  makes  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.

       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 make 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 core files upon receipt of SIGQUIT,  the  core  from  make
       would  conflict  with  a  core  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 make
       is rerun.

       The .PRECIOUS special target was extended to affect all targets globally (by specifying no
       prerequisites).  The  .IGNORE  and  .SILENT  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 make in
       System V were made to match historical practice from the BSD make.

       Macros are not exported to the environment of commands to be run.  This was never the case
       in any historical make and would have serious consequences. The environment is the same as
       the  environment to make except that MAKEFLAGS and macros defined on the make command line
       are added.

       Some implementations do not use system()  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 execve().  There is no requirement that system() be
       used  specifically,  but  merely  that  the  same  results be achieved. The metacharacters
       typically used to bypass the direct execve() execution have been any of:

              =  |  ^  (  )  ;  &  <  >  *  ?  [  ]  :  $  `  '  "  \  \n

       The default in some advanced versions of make 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 .ONESHELL be used  as  an  implementation  extension  to
       achieve the single-shell grouping for a target or group of targets.

       Novice users of make 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 make 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.

       The  System  V  INCLUDE  feature was considered, but not included. This would treat a line
       that began in the first column and contained INCLUDE <filename> as an indication  to  read
       <filename>  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.

       The System V dynamic dependency feature was not included. It would support:

              cat: $$@.c

       that would expand to;

              cat: cat.c

       This  feature exists only in the new version of System V make 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.

       Consideration  was  given to adding metarules to the POSIX make.  This would make %.o: %.c
       the same as .c.o:. This is quite useful and available from  some  vendors,  but  it  would
       cause too many changes to this make to support. It would have introduced rule chaining and
       new substitution rules. However, the rules for target names have been set to  reserve  the
       '%'  and '' 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.

       A  request  was  made  to  extend  the  suffix  delimiter  character  from a period to any
       character. The metarules feature in newer makes solves this problem in a more general way.
       This  volume  of  IEEE Std 1003.1-2001  is  staying  with the more conservative historical
       definition.

       The standard output format for the -p 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 -p  format
       has  been  variable across historical implementations. Therefore, the definition of -p was
       only  to  provide  a  consistently  named  option  for  obtaining  make  script  debugging
       information.

       Some historical implementations have not cleared the suffix list with -r.

       Implementations  should  be  aware  that  some  historical  applications  have  intermixed
       target_name and macro= value 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.

       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 make.

FUTURE DIRECTIONS

       None.

SEE ALSO

       Shell Command Language , ar , c99 , get , lex , sccs , sh , yacc , the  System  Interfaces
       volume of IEEE Std 1003.1-2001, exec, system()

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 .