diff options
| author | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2026-04-25 21:07:28 -0400 |
|---|---|---|
| committer | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2026-04-25 21:07:28 -0400 |
| commit | 711594636704defae873be1a355a292505585afd (patch) | |
| tree | 59ee13f863830d8beba6cfd02bbe813dd486c26f /static/v10/man1/usgmake.1 | |
| parent | 3258a063c1f189d7b019e40e525b46bef9b9a7b1 (diff) | |
docs: Added UNIX V10 Manuals
Diffstat (limited to 'static/v10/man1/usgmake.1')
| -rw-r--r-- | static/v10/man1/usgmake.1 | 700 |
1 files changed, 700 insertions, 0 deletions
diff --git a/static/v10/man1/usgmake.1 b/static/v10/man1/usgmake.1 new file mode 100644 index 00000000..245a3cbb --- /dev/null +++ b/static/v10/man1/usgmake.1 @@ -0,0 +1,700 @@ +.TH USGMAKE 1 +.SH NAME +usgmake \- maintain, update, and regenerate groups of programs +.SH SYNOPSIS +.B usgmake +.RB +[ +.I \-f " makefile +] +.I " +.RB +[ +.I \-p +] +.RB +[ +.I \-i +] +.RB +[ +.I \-k +] +.RB +[ +.I \-s +] +.RB +[ +.I \-r +] +.RB +[ +.I \-n +] +.RB +[ +.I \-b +] +.RB +[ +.I \-e +] +.RB +[ +.I \-m +] +.RB +[ +.I \-t +] +.RB +[ +.I \-d +] +.RB +[ +.I \-q +] +[ +.I \|names\| +] +.SH DESCRIPTION +The following is a brief description of all options and some special +names: +.TP "\w'\f3\-f\fP makefile\ \ 'u" +.BI \-f " makefile\^" +Description file name. +.I Makefile\^ +is assumed to +be the name of a description file. +A file name of +.B \- +denotes the standard input. +The contents of +.I makefile\^ +override the built-in rules if they +are present. +.TP +.B \-p +Print out the complete set of macro definitions and target descriptions. +.TP +.B \-i +Ignore error codes returned by invoked commands. +This +mode is entered if the fake target name +.B \&.\s-1IGNORE\s+1 +appears in the description file. +.TP +.B \-k +Abandon work on the current +entry, but continue on other branches +that do not depend on that entry. +.TP +.B \-s +Silent mode. +Do not print command lines before executing. +This mode is also entered if the fake target name +.B \&.\s-1SILENT\s+1 +appears in the description file. +.TP +.B \-r +Do not use the built-in rules. +.TP +.B \-n +No execute mode. +Print commands, but do not execute +them. +Even lines beginning with an +.B @ +are printed. +.TP +.B \-b +Compatibility mode for old makefiles. +.TP +.B \-e +Environment variables override assignments within makefiles. +.TP +.B \-m +Print a memory map showing text, data, and stack. +This option +is a no-operation on systems without the \f2getu\^\fP system call. +.TP +.B \-t +Touch the target files (causing them to be up-to-date) +rather than issue the usual commands. +.TP +.B \-d +Debug mode. +Print out detailed information on files +and times examined. +.TP +.B \-q +Question. +The \f2make\^\fP command returns a zero or non-zero +status code depending on whether the target file is or +is not up-to-date. +.TP +.B \&.\s-1DEFAULT\s+1 +If a file must be made but there are no explicit commands +or relevant built-in rules, the commands associated +with the name +.B \&.\s-1DEFAULT\s+1 +are used if it exists. +.TP +.B \&.\s-1PRECIOUS\s+1 +Dependents of this target will not be removed when +quit or interrupt are hit. +.TP +.B \&.\s-1SILENT\s+1 +Same effect as the \f3\-s\fP option. +.TP +.B \&.\s-1IGNORE\s+1 +Same effect as the \f3\-i\fP option. +.PP +.I Make\^ +executes commands in +.I makefile\^ +to update +one or more target +.IR names . +.I Name\^ +is typically a program. +If no +.B \-f +option is present, \f3makefile\fP, \f3Makefile\fP, \f3s.makefile\fP, +and \f3s.Makefile\fP are +tried in order. +If +.I makefile\^ +is +.BR \- , +the standard input is taken. +More than one +.BI \- " makefile" +argument pair may appear. +.PP +.I Make\^ +updates a target only if it depends on files that are +newer than the target. +All prerequisite files of a target are added recursively to +the list of targets. +Missing files are deemed to be out of date. +.PP +.I Makefile\^ +contains a sequence of entries that specify dependencies. +The first line of an entry is a +blank-separated, non-null list of targets, then a +.BR : , +then a (possibly null) list of prerequisite files or dependencies. +Text following a +.B ; +and all following lines +that begin with a tab are shell commands +to be executed to update the target. +The first line that does not begin with a tab or +.B # +begins +a new dependency or macro definition. +Shell commands may +be continued across lines with the <backslash><new-line> sequence. +Everything printed by make (except the initial tab) is passed +directly to the shell as is. +Thus, +.PP +.ss 18 +.RS +.PD 0 +echo a\\ +.br +b +.RE +.ss 12 +.PD +.PP +will produce +.PP +.ss 18 +.RS +.PD 0 +ab +.RE +.ss 12 +.PD +.PP +exactly the same as the shell would. +.PP +Sharp +.RB ( # ) +and new-line surround comments. +.PP +The following +.I makefile\^ +says that +.B pgm +depends on two +files +.B a.o +and +.BR b.o , +and that they in turn depend on +their corresponding source files +.RB ( a.c +and +.BR b.c ) +and a common file +.BR incl.h : +.PP +.ss 18 +.RS +.PD 0 +.TP +pgm: a.o b.o +cc a.o b.o \-o pgm +.TP +a.o: incl.h a.c +cc \-c a.c +.TP +b.o: incl.h b.c +cc \-c b.c +.PD +.RE +.ss 12 +.PP +Command lines are executed one at a time, each by its +own shell. +The first one or two characters in a command can be +the following: \f3-\fP, \f3@\fP, \f3-@\fP, or \f3@-\fP. +If \f3@\fP is present, printing of the command is suppressed. +If \f3-\fP is present, \f2make\^\fP ignores an error. +A line is printed when it is executed unless the +.B \-s +option is present, or the entry +.B \&.\s-1SILENT\s+1: +is in +.IR makefile , +or unless the initial character sequence contains a \f3@\fP. +The +.B \-n +option specifies printing without execution; however, if the +command line has the string +.B $(\s-1MAKE\s+1) +in it, +the line is +always executed (see discussion of the +.SM +.B MAKEFLAGS +macro under +.IR Environment ). +The +.B \-t +(touch) option updates the modified date of a +file without executing any commands. +.PP +Commands returning non-zero status normally terminate +.IR make . +If the +.B \-i +option is present, or the entry \f3.\s-1IGNORE\s+1:\fP appears in +.IR makefile , +or the initial character sequence of the command contains +\f3-\fP. +the error is ignored. +If the +.B \-k +option is present, +work is abandoned on the current +entry, but continues on other branches +that do not depend on that entry. +.PP +The +.B \-b +option allows old makefiles (those written for the old version +of \f2make\^\fP) to run without errors. +The difference between the old version +of \f2make\^\fP and this version is that this version requires all dependency +lines to have a (possibly null or implicit) command associated with them. +The previous version of +.I make\^ +assumed if no command was specified explicitly +that the command was null. +.PP +Interrupt and quit cause the target to be deleted +unless the target is a dependency of the special name \f3.\s-1PRECIOUS\s+1\fP. +.SS Environment +The environment is read by \f2make\^\fP. +All variables are assumed to be macro +definitions and processed as such. +The environment variables are processed +before any makefile and after the internal rules; +thus, macro assignments +in a makefile override environment variables. +The +.B \-e +option causes +the environment to override the macro assignments in a makefile. +.PP +The \f3\s-1MAKEFLAGS\s+1\fP environment variable +is processed by \f2make\^\fP as containing +any legal input option (except \f3\-f\fP, \f3\-p\fP, and \f3\-d\fP) defined +for the command line. +Further, +upon invocation, \f2make\^\fP ``invents'' the variable if it is not in the +environment, puts the current options into it, and passes it on to +invocations of commands. +Thus, \f3\s-1MAKEFLAGS\s+1\fP always contains the +current input options. +This proves very useful for ``super-makes''. +In fact, as noted above, +when the \f3\-n\fP option is used, the command +.B $(\s-1MAKE\s+1) +is executed +anyway; hence, one can perform a \f3make \-n\fP recursively on a whole software +system to see what would have been executed. +This is because the \f3\-n\fP +is put in \f3\s-1MAKEFLAGS\s+1\fP and passed to further invocations of +.BR $(\s-1MAKE\s+1) . +This is one way of debugging +all of the makefiles for a software project without actually doing anything. +.PP +.SS Macros +Entries of the form +.IB string1 " = " string2\^ +are macro definitions. +.I String2 +is defined as all characters up to a comment character or +an unescaped newline. +Subsequent appearances of +.RI $( string1 [: subst1 =[ subst2\^\fP]]) +are replaced by +.IR string2 . +The parentheses are optional if a single character macro name is used and +there is no substitute sequence. +The optional +.RI : subst1 = subst2\^ +is a substitute sequence. +If it is specified, all non-overlapping occurrences of \f2subst1\^\fP in the +named macro are replaced by \f2subst2\^\fP. +Strings (for the purposes of this +type of substitution) are delimited by +blanks, tabs, new-line characters, and beginnings of lines. +An example of the use of the substitute sequence is shown under +.IR Libraries . +.SS Internal Macros +There are five internally maintained macros which are useful +for writing rules for building targets. +.TP 5 +\f3$\(**\fP +The macro \f3$\(**\fP stands for +the file name part of the current dependent with the suffix deleted. +It is +evaluated only for inference rules. +.TP +\f3$@\fP +The \f3$@\fP macro stands for +the full target name of the current target. +It is evaluated +only for explicitly named dependencies. +.TP +\f3$<\fP +The \f3$<\fP macro is only evaluated for inference rules or +the \f3.\s-1DEFAULT\s+1\fP rule. +It is +the module which is out of date with respect to the target (i.e., +the ``manufactured'' dependent file name). +Thus, in the \f3.c.o\fP rule, the \f3$<\fP macro would evaluate to +the \f3.c\fP file. +An example for making +optimized \f3.o\fP files from \f3.c\fP files is: +.PP +.PD 0 +.ss 18 +.RS +.RS +.TP +\&.c.o: +.br +cc \-c \-O $\(**.c +.RE +.RE +.PD +.TP 5 +\& +or: +.PP +.PD 0 +.RS +.RS +.TP +\&.c.o: +.br +cc \-c \-O $< +.RE +.RE +.ss 12 +.PD +.TP 5 +\f3$?\fP +The \f3$?\fP macro is evaluated when explicit rules from the makefile +are evaluated. +It is +the list of prerequisites that are out of date with respect to +the target; +essentially, those modules which must be rebuilt. +.TP +\f3$%\fP +The \f3$%\fP macro is only evaluated when the target is an +archive library member of the form \f3lib(file.o)\fP. +In this case, +\f3$@\fP evaluates to \f3lib\fP and \f3$%\fP evaluates to the +library member, \f3file.o\fP. +.PP +Four of the five macros can have alternative forms. +When an upper case \f3D\fP or \f3F\fP is appended to any of the four +macros the meaning is changed to ``directory part'' for \f3D\fP +and ``file part'' for \f3F\fP. +Thus, \f3$(@D)\fP refers to the directory +part of the string \f3$@\fP. +If there is no directory part, +\f3./\fP is generated. +The only macro excluded from this +alternative form is \f3$?\fP. +The reasons for this are debatable. +.SS Suffixes +Certain names (for instance, those ending with \f3.o\fP) +have inferable prerequisites such as \f3.c\fP, \f3.s\fP, etc. +If no update commands for such a file appear in +.IR makefile , +and if an inferable prerequisite +exists, that prerequisite is compiled to make the target. +In this case, +.I make\^ +has +inference rules +which allow building files from other files +by examining the suffixes and determining an +appropriate +inference rule +to use. +The current default inference rules +are: +.PP +.RS +\&.c \|.c~ \|.sh \|.sh~ \|.c.o \|.c~.o \|.c~.c \|.s.o \|.s~.o \|.y.o \|.y~.o \|.l.o \|.l~.o +.br +\&.y.c \|.y~.c \|.l.c \|.c.a \|.c~.a \|.s~.a \|.h~.h +.RE +.PP +The internal rules for \f2make\^\fP are contained in the source +file \f3rules.c\fP for the \f2make\^\fP program. +These rules can be +locally modified. +To print out the rules compiled into +the \f2make\^\fP on any machine in a form suitable for recompilation, +the following command is used: +.PP +.RS +make \|\-fp \|\- \|2>/dev/null \|</dev/null +.RE +.PP +The only peculiarity in this output is the +.B (null) +string which +.IR printf (3S) +prints when handed a null string. +.PP +A tilde in the above rules refers to an \s-1SCCS\s+1 file +(see +.IR sccsfile (5)). +Thus, the +rule \f3.c~.o\fP would transform an \s-1SCCS\s+1 C source file into an +object file (\f3.o\fP). +Because the \f3s.\fP of the \s-1SCCS\s+1 files is a prefix +it is incompatible with \f2make\^\fP's suffix point-of-view. +Hence, +the tilde is a way of changing any file reference into an \s-1SCCS\s+1 +file reference. +.PP +A rule with only one suffix (i.e. \f3.c:\fP) is the definition +of how to build \f2x\^\fP from \f2x\^\fP\f3.c\fP. +In effect, the other suffix is null. +This is useful for building targets +from only one source file (e.g., shell procedures, simple C programs). +.PP +Additional suffixes are given as the +dependency list for \f3.\s-1SUFFIXES\s+1\fP. +Order is significant; the first possible name for which both +a file and a rule exist is inferred as a prerequisite. +The default list is: +.PP +.RS +\&\f3.\s-1SUFFIXES\s+1\fP: \|.o \|.c \|.y \|.l \|.s +.RE +.PP +Here again, the above command for printing the internal rules will +display the list of suffixes implemented on the current machine. +Multiple suffix lists accumulate; \f3.\s-1SUFFIXES\s+1:\fP with no dependencies +clears the list of suffixes. +.SS Inference Rules +The first example can be done more briefly: +.PP +.ss 18 +.RS +.PD 0 +.TP +pgm: a.o b.o +.br +cc a.o b.o \-o pgm +.TP +a.o b.o: incl.h +.RE +.ss 12 +.PD +.PP +This is because \f2make\^\fP has a set of internal rules for building +files. +The user may add rules to this list by simply putting +them in the \f2makefile\^\fP. +.PP +Certain macros are used by the default inference rules +to permit the inclusion of optional matter in +any resulting commands. +For example, +.SM +.BR CFLAGS\*S , +.SM +.BR LFLAGS\*S , +and +.SM +.B YFLAGS +are used for compiler options to +.IR cc (1), +.IR lex (1), +and +.IR yacc (1) +respectively. +Again, the previous method for examining +the current rules is recommended. +.PP +The inference of prerequisites can be controlled. +The rule to create a file with suffix +.B \&.o +from a file with suffix +.B \&.c +is specified as an entry with \f3.c.o:\fP as the target and no dependents. +Shell commands associated with the target define the +rule for making a \f3.o\fP file from a \f3.c\fP file. +Any target that has no slashes in it and starts with a dot +is identified as a rule and not a true target. +.SS Libraries +If a target or dependency name contains parenthesis, it is +assumed to be an archive library, the string within parenthesis +referring to a member within the library. +Thus \f3lib(file.o)\fP and \f3$(\s-1LIB\s+1)(file.o)\fP both refer to +an archive library which contains \f3file.o\fP. (This assumes +the +.SM +.B LIB +macro has been previously defined.)\ +The expression \f3$(\s-1LIB\s+1)(file1.o file2.o)\fP is not legal. +Rules pertaining to archive libraries have the form +.BI \&. \s-1XX\s+1 .a +where the +.SM +.I XX\^ +is the suffix from which the archive member +is to be made. +An unfortunate byproduct of the current implementation +requires the +.SM +.I XX\^ +to be different from the suffix of the archive +member. +Thus, one cannot have \f3lib(file.o)\fP depend upon \f3file.o\fP explicitly. +The most common use of the archive interface follows. +Here, we assume the source files are all C type source: +.PP +.ss 18 +.RS +.PD 0 +.TP +lib: +lib(file1.o) lib(file2.o) lib(file3.o) +.br +@echo lib is now up to date +.TP +\&.c.a: +.br +$(\s-1CC\s+1) \-c $(\s-1CFLAGS\s+1) $< +.br +ar rv $@ $*.o +.br +rm \-f $*.o +.RE +.ss 12 +.PD +.PP +In fact, the \f3.c.a\fP rule listed above is built into \f2make\^\fP and +is unnecessary in this example. +A more interesting, but more limited example of an archive library +maintenance construction follows: +.PP +.ss 18 +.RS +.PD 0 +.TP +lib: +lib(file1.o) lib(file2.o) lib(file3.o) +.br +$(\s-1CC\s+1) \-c $(\s-1CFLAGS\s+1) $(?:.o=.c) +.br +ar rv lib $? +.br +rm $? +@echo lib is now up to date +.TP +\&.c.a:; +.RE +.ss 12 +.PD +.PP +Here the substitution mode of the macro expansions is used. +The \f3$?\fP +list is defined to be the set of object file names (inside \f3lib\fP) whose C +source files are out of date. +The substitution mode +translates the \f3.o\fP to \f3.c\fP. +(Unfortunately, one cannot as yet transform +to \f3.c~\fP; however, this may become possible in the future.)\ +Note also, the disabling of the +\&\f3.c.a:\fP rule, which would have created each object file, one by one. +This particular construct speeds up archive library maintenance considerably. +This type of construct becomes very cumbersome if the archive library +contains a mix of assembly programs and C programs. +.SH FILES +[Mm]akefile and s\f3.\fP[Mm]akefile +.SH SEE ALSO +.IR sh (1), +.IR mk (8). +.br +.I "Make\-A Program for Maintaining Computer Programs\^" +by +S. I. Feldman. +.br +.I "An Augmented Version of Make\^" +by +E. G. Bradford. +.SH BUGS +Some commands return non-zero status inappropriately; +use +.B \-i +to overcome the difficulty. +Commands that are directly executed by the shell, +notably +.IR cd (1), +are ineffectual across new-lines in +.IR make . +The syntax \f3(lib(file1.o file2.o file3.o)\fP is illegal. +You cannot build \f3lib(file.o)\fP from \f3file.o\fP. +The macro \f3$(a:.o=.c~)\fP doesn't work. +.br |
