Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ make(1) — SunOS 1.1

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

sh(1)

touch(1)

f77(1)

pc(1)

MAKE(1)  —  USER COMMANDS

NAME

make − maintain program groups

SYNOPSIS

make [ −f makefile ] [ −i ] [ −k ] [ −n ] [ −t ] [ −r ] [ −s ] [ −d ] [ −p ] [ −S ] [ −q ] file ...

DESCRIPTION

Make executes commands in makefile to update one or more target files. File is typically a program.  If no −f option is present, ‘makefile’ and ‘Makefile’ are tried in order.  ‘Makefile’ with a capital M is the preferred choice since it appears towards the front of any list of files and thus tends to stand out.  If makefile is ‘−’, make reads the standard input.  More than one −f option may appear. 

Make updates a target if it depends on prerequisite files that have been modified since the target was last modified, or if the target does not exist. 

Makefile contains a sequence of entries that specify dependencies.  The first line of an entry is a blank-separated list of targets, then a colon, then a list of prerequisite files.  Text following a semicolon, and all following lines that begin with a tab, are shell commands to be executed to update the target.  If a name appears on the left of more than one ‘colon’ line, then it depends on all of the names on the right of the colon on those lines, but only one command sequence may be specified for it.  If a name appears on a line with a double colon :: then the command sequence following that line is performed only if the name is out of date with respect to the names to the right of the double colon, and is not affected by other double colon lines on which that name may appear. 

Two special forms of a name are recognized.  A name like library(file) means the file named file stored in the archive named library.  A name like library((entry)) means the file stored in archive library containing the entry point entry. 

Sharp and newline surround comments. 

The following makefile says that program depends on the two files a.o and b.o and that they in turn depend on .c files and a common file called incl:

program: a.o b.o
cc a.o b.o −lm −o program

a.o: incl a.c
cc −c a.c

b.o: incl b.c
cc −c b.c

Makefile entries of the form

string1 = string2

are macro definitions.  Subsequent appearances of $(string1) or ${string1} are replaced by string2. If string1 is a single character, the parentheses or braces are optional. 

Make infers prerequisites for files for which makefile gives no construction commands.  For example, a .c file may be inferred as prerequisite for a .o file and be compiled to produce the .o file.  Thus the preceding example can be done more briefly:

program: a.o b.o
cc a.o b.o −lm −o program

a.o b.o: incl

Prerequisites are inferred according to selected suffixes listed as the ‘prerequisites’ for the special name .SUFFIXES; multiple lists accumulate; an empty list clears what came before.  Order is significant; the first possible name for which both a file and a rule as described in the next paragraph exist is inferred.  The default list is

.SUFFIXES: .out .o .c .e .r .f .y .l .s .p

The rule to create a file with suffix s2 that depends on a similarly named file with suffix s1 is specified as an entry for the ‘target’ s1s2. Before issuing any command, make sets certain special macros:

$@is set to the name of the file to be ‘made’. 

$?is set to the names of files that are younger than the target. 

$<is set to the name of the related file that caused the action, only if the command was generated by an implicit rule. 

$∗is set to the prefix shared by the current and dependent filenames, only if the command was generated by an implicit rule. 

For example, a rule for making optimized .o files from .c files is

.c.o: ; cc −c −O −o $@ $∗.c

Certain macros are used by the default inference rules to communicate optional arguments to any resulting compilations.  In particular, ‘CFLAGS’ is used for cc(1) options, ‘FFLAGS’ for f77(1) options, ‘PFLAGS’ for pc(1) options, and ‘LFLAGS’ and ‘YFLAGS’ for lex and yacc(1) options.  In addition, the macro ‘MFLAGS’ is filled in with the initial command line options supplied to make. This simplifies maintaining a hierarchy of makefiles as one may then invoke make on makefiles in subdirectories and pass along useful options such as −k. 

Command lines are executed one at a time, each by its own shell.  A line is printed when it is executed unless the special target .SILENT is in makefile, or the first character of the command is ‘@’. 

Commands returning nonzero status (see intro(1)) cause make to terminate unless the special target .IGNORE is in makefile or the command begins with <tab><hyphen>. 

Interrupt and quit cause the target to be deleted unless the target is a directory or depends on the special name .PRECIOUS. 

OPTIONS

−f myfile
myfile is the name of the file to use for make commands instead of the default ‘makefile’ or ‘Makefile’. 

−i Equivalent to the special entry .IGNORE:. 

−k When a command returns nonzero status, abandon work on the current entry, but continue on branches that do not depend on the current entry. 

−n Trace and print, but do not execute the commands needed to update the targets. 

−t Touch, that is, update the modified date of targets, without executing any commands. 

−r Equivalent to an initial special entry .SUFFIXES: with no list. 

−s Equivalent to the special entry .SILENT:. 

−d debug; print internal state after each command

−p print internal state after reading Makefile

−q determines if the target is up to date — returns a zero exit status if it is, and a non-zero exit status otherwise. 

−S undoes the effect of the −k option. 

FILES

makefile, Makefile

SEE ALSO

sh(1), touch(1), f77(1), pc(1)
Make − A Program for Maintaining Computer Programs, in Programming Tools for the Sun System.

BUGS

Some commands return nonzero status inappropriately.  Use −i to overcome the difficulty. 
Commands that are directly executed by the shell, notably cd(1), are ineffectual across newlines in make. 

Make should recognize names of libraries in the dependency entries, for example:

grab:-lm  grab.o
cc  -o  grab  grab.o  -lm

Sun Release 1.1  —  Last change: 23 October 1983

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026