COHERENT manpages

This page displays the COHERENT manpage for make [Program-building discipline].

List of available manpages
Index


make -- Command

Program-building discipline
make [option ...] [argument ...] [target ...]

make helps  you build things that  consist of more than  one file of source
code.  A ``thing'' can be a program, a report, a document, or anything else
that is constructed out of something else.

Complex programs often consist of  several object modules, each of which is
the product of  compiling a source file. A source  file may refer to one or
more  include files,  which  can also  be  changed.  Some  programs may  be
generated from  specifications given to  program generators, such  as yacc.
Recompiling  and  relinking  complicated  programs  can  be  difficult  and
tedious.

make regenerates programs automatically.  It follows a specification of the
structure of the  program that you write into a  file called makefile. make
also checks  the date and time  that COHERENT has recorded  for each source
file   and  its   corresponding   object  module;   to  avoid   unnecessary
recompilation,  make will  recompile  a source  file  only if  it has  been
altered since its object module was last compiled.

Options

The following lists  the options that can be passed  to make on its command
line.

-d   (Debug) Give  verbose printout of all  decisions and information going
     into decisions.

-e   Force  macro  definitions  in environment  to  override  those in  the
     makefile.

-f file
     file contains the make specification.  If this option does not appear,
     make uses the file makefile,  which is sought first in the directories
     named  in the  PATH environmental  variable, and  then in  the current
     directory.   If  file is  `-',  make uses  the  standard input;  note,
     however, that the standard input can be used only if it is piped.

-i   Ignore all  errors from commands, and  continue processing.  To invoke
     this behavior  for an individual action within  a makefile, prefix the
     action with the `-' flag.  By default, make exits if a command returns
     an error.

-k   Continue to  update other targets that do not  depend upon the current
     target if  a non-ignored error occurs while  executing the commands to
     bring a target up to date.

-n   Test only; suppress  execution of commands.  To override this behavior
     for an individual action within a makefile, prefix the action with the
     `+' flag.

-p   Print all macro definitions and target descriptions.

-q   Return  a zero  exit status  if the  targets are up  to date.   Do not
     execute any commands.

-r   Do not use the built-in rules that describe dependencies.

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

-s   Do not print command  lines when executing them.  Commands preceded by
     `@' are not printed, except under the -n option.

-t   (Touch option) Force the dates of  targets to be the current time, and
     bypass actual  regeneration.  However,  if the target  is out-of-date,
     make  will  still  execute an  individual  action  if  that action  is
     prefixed with the `+' flag.

The Makefile

A  makefile consists  of three  types  of instructions:  macro definitions,
dependency definitions, and commands.

A macro definition simply defines  a macro for use throughout the makefile;
for example, the macro definition

    FILES=file1.o file2.o file3.o

Note the use of the equal sign `='.

A dependency  definition names the object modules used  to build the target
program, and source  files used to build each object  module .  It consists
of the  target name, or  name of the  program to be created,  followed by a
colon `:' and the names of  the object modules that build it.  For example,
the statement

    example:  $(FILES)

uses the macro  FILES to name the object modules  used to build the program
example.  Likewise, the dependency definition

    file1.o:  file1.c macros.h

defines the object module file1.o  as consisting of the source file file1.c
and the header file macros.h.

Finally, a command  line details an action that make  must perform to build
the  target program.   Each command  line must  begin with  a space  or tab
character.  For example, the command line

        cc -o example $(FILES)

gives the cc  command needed to build the program  example.  The cc command
lists the object modules to be used, not the source files.

Note  that if  you prefix  an action  with a hyphen  `-', make  will ignore
errors in the  action.  If the action is prefixed  by `@', it tells make to
be  silent about the  action --  that is,  do not echo  the command  to the
standard output.  The `+' flag is described below.

Finally, you  can embed comments  within a makefile.  make  ignores a pound
sign `#'  and all text that follows it.   COHERENT's implementation of make
recognizes the presence of quotation marks, and and does not treat a `#' as
a comment if it appears between apostrophes or quotation marks, or prefixed
by a backslash.  Many other versions  of make do not permit this, including
the one specified by POSIX.2: caveat utilitor.

make searches for makefile  first in directories named in the environmental
variable PATH, and then in the current directory.

make Without a Makefile

Beginning with release  4.2 of COHERENT, you can also  invoke make to build
an  object for  which no  makefile  exists.  In  this case,  make uses  its
default suffix rules to identify the objects it should construct and how it
should construct them.  If, for example, you type

    make foo

make will search the local directory for any file named foo that has any of
the  suffices that  make  recognizes by  default.  If  the local  directory
contains a file  named foo.c, make invokes cc to  compile it; whereas if it
contains a file named foo.o, it invokes the linker ld to link it.

Note  that if  no makefile  exists, make by  default creates  an executable
named after the C source file, just as the command cc does.

Dependencies

The  makefile specifies  which files  depend upon other  files, and  how to
recreate the dependent files.  For example, if the target file test depends
upon the object module test.o, the dependency is as follows:

    test:   test.o
        cc -o test test.o

make knows  about common dependencies,  e.g., that .o files  depend upon .c
files with the same base  name.  The target .SUFFIXES contains the suffixes
that make  recognizes.  (Note  that you can  use the command  makedepend to
build such a list dynamically.  For details, see its entry in the Lexicon.)

make also has  a set of rules to regenerate  dependent files.  For example,
for a source  file with suffix .c and a  dependent file with the suffix .o,
the target .c.o gives the regeneration rule:

    .c.o:
        cc -c $<

The -c option to the cc commands tells cc not to link or erase the compiled
object module.  $< is a macro  that make defines; it stands for the name
of the file that causes the current action.  The default suffixes and rules
are kept in the files /usr/lib/makemacros and /usr/lib/makeactions.

Macros

To  simplify the  writing of  complex dependencies,  make provides  a macro
facility.  To define a macro, write

    NAME = string

string  is  terminated by  the  end-of-line character,  so  it can  contain
blanks.   To  refer to  the  value of  the  macro, use  a  dollar sign  `$'
followed by the macro name enclosed in parentheses or braces, e.g.:

    $(NAME)
    ${NAME}

If the  macro name is  one character, parentheses are  not necessary.  make
uses macros in the definition of default rules:

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

where the macros are defined as

    CC=cc
    CFLAGS=-V

The built-in macros are as follows:

$*   The target's name, minus a `.'-delimited suffix.

$@   For regular  targets, the  target's full  name.  For targets  that are
     library dependencies of the form library(object),  this macro  expands
     to the library part of the target.

$%   For targets that are library dependencies of the form library(object),
     this macro expands to the object part of the target.

$?   This expands to prerequisite files that are newer than the target.

$<
     For suffix-rules,  this macro expands to the  name of the prerequisite
     file that  make chose as the implicit prerequisite  of the target.  Do
     not use this macro outside a suffix rule.

You can  specify macro definitions in the makefile,  in the environment, or
as a  command-line argument.   A macro  defined as a  command-line argument
always overrides a definition of the  same macro name in the environment or
in  the  makefile.  Normally,  a  definition  in  a  makefile  overrides  a
definition of the same macro name  in the environment; however, with the -e
option,  a definition  in  the environment  overrides a  definition in  the
makefile.

Each command line argument should be a macro definition of the form

    OBJECT=a.o b.o

Arguments  that  include  spaces must  be  surrounded  by quotation  marks,
because blanks are significant to the shell sh.

Source File Path

make first looks for the file with the name given, which may be relative to
the current directory when make was invoked.  If it does not find the file,
and if the name of the  file is not an absolute path name, make removes any
leading  path information  from the  name  and looks  for the  file in  the
current directory.  If the file is not found in the current directory, make
then searches  for the  file in  the list of  directories specified  by the
macro  $(SRCPATH).  This allows  you  to  compile a  program  in an  object
directory separate from the source directory.  For example

    export SRCPATH=/usr/src/local/me
    make

or alteratively

    make SRCPATH=/usr/src/local/me

builds objects  in the current  directory as specified by  the makefile and
sources  in /usr/src/local/me.  To  test changes  to a  program built  from
several source files, copy only the files you wish to change to the current
directory; make  will use the local  sources and find the  other sources on
the $(SRCPATH).

Note that $(SRCPATH) can be a single directory, as in the above example, or
a `:'-separated list of directories,  as described in the Lexicon entry for
the function path().

Macros and Environmental Variables

The  environmental variable  MAKEFLAGS  provides an  alternative method  of
passing parameters to make. If this variable is defined, make processes the
switches that  it contains as if  they were specified on  the command line.
make  processes  MAKEFLAGS  before  it  processes any  actual  command-line
parameters.

Either of the following two formats can be used for MAKEFLAGS:

      MAKEFLAGS="-n -d"
      MAKEFLAGS=nd

Either of the above passes to make the options n and d.

After  it processes  the switches  named in  MAKEFLAGS, make  processes all
options set on its command line.  make then re-defines MAKEFLAGS to contain
the full  set of  switches passed  to it, and  marks the macro  for export.
This means  that recursive invocations  of make are passed  the same switch
settings as the highest-level invocation of make. (See also the description
of the `+' flag, below.)

make takes  all other environment-variable  settings passed to  it and uses
them to set the values of corresponding macros internally.

When  make  executes  a  command,  it  exports  to  that  command  all  the
environmental  variables make  imported from  the initial  environment, the
MAKEFLAGS  environmental  variable,  and the  macros  defined  on the  make
command line.

Always Actions

If  an action  for  rebuilding a  target  begins with  the  `+' flag,  make
executes the action even if the  command line specifies the option -n. This
is useful when dealing with  recursive makefiles: when you pass the options
-p, -d, or  -n to the top-level invocation of  make, the top-level makefile
can still  invoke the sub-makefiles, and  pass them the same  flags via the
environmental variable MAKEFLAGS,  as described above.  This simplifies the
debugging  of makefiles  for complex  projects.   This flag  mainly affects
make's usage with the options -q, -n, and -t.

Library Dependencies

make interprets targets of the form library(object) as referring to members
of an archive created with the  archiver ar. make can examine the archive's
contents to determine whether the named  member is present and what date it
possesses.

When  building such  a  target, make  looks  for suffix  rules  for use  in
building object,  but with  a target  suffix of .a  rather than  the actual
suffix of object.

For example, with the default make rules in effect, the target

    libc.a(clock.o)

would be  rebuilt from a source  file clock.c by the  suffix-rule .c.a. The
default suffix  rule (as supplied in  file /usr/lib/makeactions) deals with
building the  object file and then  uses the macros AR  and ARFLAGS to move
the resulting object file into the target archive.

Actions for library targets use macro definitions that differ slightly from
those for normal  actions.  When it builds a library  target, make sets the
macro  $@ to  the name  of the  library part  of the  target, and  sets the
special macro $% (defined only for use with library targets) to the name of
the object part of the target.

Single-Suffix Rules

make can use an inference rule of the form:

    suffix:
            actions

to infer an action from a target that does not have a suffix.  When you use
a target that  has no explicit rule and no  known suffix, make appends onto
the target every  known suffix in turn, and for  each suffix searches for a
file  or rule  for building  the  target.  If  make discovers  a file  that
matches one of file names that it has built, it then tries to use a single-
suffix  rule to  generate the  target from  targetsuffix, with  the actions
given in the single-suffix rule.

For example, the default rules for make contain a single-suffix rule:

      .c:
              $(CC) $(CFLAGS) $@ $<

Given the  above rule and  a file in  the current directory  or source path
named clock.c, the target

      clock:

results in  the executable file  clock being built by  compiling the single
source file clock.c and linking it.

Suffix-Rewriting Macro Expansion

You can use a special form of macro expansion

    $(macro:suffix[=value])

to simplify the use of macros that involve long lists of files names.  When
you request  the above  form of expansion,  make searches the  expansion of
macro;  for every  word that  ends in  suffix it  replaces suffix  with the
optional value.

For example, consider the following:

      SOURCES = parse.c interpret.c builtin.c
      OBJS = $(SOURCES:.c=.o)

This expansion of the macro OBJS is:

    parse.o interpret.o builtin.o

When a  makefile uses  long lists  of files, this  facility not  only saves
typing, but eases  maintenance because you need to change  only one list of
files.

Path-Oriented Macro Expansions

The following special-macro  expansion forms perform path processing on the
macro's contents:

     $(special)     Normal expansion
     $(specialF)    Expand only file-name part
     $(specialD)    Expand only directory part without trailing slash

where special is one of the following: @, ?, <, *, or %. These expansion
forms allow  rules (especially inference  rules) to deal  easily with path-
oriented  operations,   without  resorting  to   complex  shell  operations
involving  backquoting  and  the  command  basename.  In  particular,  when
expanding a  macro with a file  list such as ${?D},  make processes all the
entries in  the file list as specified; otherwise,  this would be extremely
cumbersome.

Files

makefile
Makefile -- List of dependencies and commands
/usr/lib/makeactions -- Default actions
/usr/lib/makemacros -- Default macros

See Also

as,
cc,
commands,
ld,
makedepend,
srcpath,
touch
The make Programming Discipline, tutorial

Diagnostics

make returns the following error messages:

; after target or macroname (error)
     A semicolon appeared after a target name or a macro name.

Bad macro name (error)
     A macro includes an illegal character, e.g., a control character.

= in or after dependency (error)
     An  equal sign  `=' appeared  within or followed  the definition  of a
     macro  name or  target  file.  For  example, OBJ=atod.o=factor.o  will
     produce this error.

Incomplete line at end of file (error)
     An incomplete line appeared at the end of the makefile.

Macro definition too long (error)
     The   macro  definition   exceeds  the   limited  designed   into  the
     preprocessor.

Multiple actions for name (error)
     A target is defined with more than one single-colon target line.

Multiple detailed actions for name (error)
     A target is defined with more than one single-colon target line.

Must use ``::'' for name (error)
     A double-colon target line was followed by a single-colon target line.

Newline after target or macroname (error)
     A newline character appears after a target name or a macro name.

`::' not allowed for name (error)
     A  double-colon target  line was  used  illegally; for  example, after
     single-colon target line.

::: or : in or after dependency list (error)
     A triple colon is  meaningless to make, and therefore illegal wherever
     it appears.  A  single colon may be used only  in a target line (which
     is also called the dependency list), and nowhere else.

Out of core (adddep) (error)
     This results  from a  system problem.  Try  reducing the size  of your
     makefile.

Out of range number input. (warning)
     You attempted to use a numeric value that is out of range.

Out of space (error)
     System problem.  Try reducing the size of your makefile.


Out of space (lookup) (error)
     System problem.  Try reducing the size of your makefile.

Syntax error (error)
     The syntax of a line is faulty.

Too many macro definitions (error)
     The number  of macros  you have created  exceeds the capacity  of your
     computer to process them.

= without macro name or in token list (error)
     An  equal sign  `=' can  be  used only  to define  a macro,  using the
     following   syntax:    ``MACRO=definition''.    An  incomplete   macro
     definition, or the appearance of  an equal sign outside the context of
     a macro definition, will trigger this error message.

: without preceding target (error)
     A colon appeared without a target file name, e.g., :string.

Notes

Prior to release 4.2,  COHERENT's implementation of make permitted users to
use the macro $< outside of suffix rules.  This non-standard behavior is
no longer supported.

The order of  items in makemacros/.SUFFIXES is significant.  The consequent
of a default rule (e.g., .o)  must precede the antecedent (e.g., .c) in the
entry .SUFFIXES. Otherwise, make will not work properly.