|
|
1.1 root 1: .TH MK 1
2: .CT 1 prog_c writing_troff prog_other
3: .SH NAME
4: mk, mkconv, membername \- maintain (make) related files
5: .SH SYNOPSIS
6: .B mk
7: [
8: .B -f
9: .I mkfile
10: ] ...
11: [
12: .I option ...
13: ]
14: [
15: .I name ...
16: ]
17: .PP
18: .B mkconv
19: .I makefile
20: .PP
21: .B membername
22: .I aggregate ...
23: .SH DESCRIPTION
24: .I Mk
25: is most often used to keep object files current with the
26: source they depend on.
27: .PP
28: .I Mk
29: reads
30: .I mkfile
31: and builds and executes dependency dags (directed acyclic graphs) for the target
32: .IR names .
33: If no target is specified, the targets of the first non-metarule in
34: the first
35: .I mkfile
36: are used.
37: If no
38: .B -f
39: option is present,
40: .L mkfile
41: is tried.
42: Other options are:
43: .TP \w'\fL-d[egp]\ 'u
44: .B -a
45: Assume all targets to be out of date.
46: Thus, everything gets made.
47: .PD 0
48: .TP
49: .BR -d [ egp ]
50: Produce debugging output
51: .RB ( p
52: is for parsing,
53: .B g
54: for graph building,
55: .B e
56: for execution).
57: .TP
58: .B -e
59: Explain why each target is made.
60: .TP
61: .B -i
62: Force any missing intermediate targets to be made.
63: .TP
64: .B -k
65: Do as much work as possible in the face of errors.
66: .TP
67: .B -n
68: Print, but do not execute, the commands
69: needed to update the targets.
70: .TP
71: .B -t
72: Touch (update the modified date of) non-virtual targets, without
73: executing any recipes.
74: .TP
75: .B -u
76: Produce a table of clock seconds spent with
77: .I n
78: recipes running.
79: .TP
80: .BI -w name1,name2,...
81: Set the initial date stamp for each name
82: to the current time.
83: The names may also be separated by blanks or newlines.
84: (Use with
85: .B -n
86: to find what else would need to change if the named files
87: were modified.)
88: .PD
89: .PP
90: .I Mkconv
91: attempts to convert a
92: .IR make (1)
93: .I makefile
94: to a
95: .IR mkfile
96: on standard output.
97: The conversion is not likely to be faithful.
98: .PP
99: The shell script
100: .I membername
101: extracts member names
102: (see `Aggregates' below)
103: from its arguments.
104: .SS Definitions
105: A
106: .I mkfile
107: consists of
108: .I assignments
109: (described under `Environment') and
110: .IR rules .
111: A rule contains
112: .I targets
113: and a
114: .I tail.
115: A target is a literal string, or
116: .I label,
117: and is normally a file name.
118: The tail contains zero or more
119: .I prerequisites
120: and an optional
121: .I recipe,
122: which is a shell script.
123: .PP
124: A
125: .I metarule
126: has a target of the form
127: .IB A % B
128: where
129: .I A
130: and
131: .I B
132: are (possibly empty) strings.
133: A metarule applies to any label that matches the target with
134: .B %
135: replaced by an arbitrary string, called the
136: .IR stem .
137: In interpreting a metarule,
138: the stem is substituted for all occurrences of
139: .B %
140: in the prerequisite names.
141: A metarule may be marked as using regular expressions (described under `Syntax').
142: In this case,
143: .B %
144: has no special meaning;
145: the target is interpreted according to
146: .IR regexp (3).
147: The dependencies may refer to subexpressions in the normal way, using
148: .BI \e n.
149: The
150: .I dependency dag
151: for a target consists of
152: .I nodes
153: connected by directed
154: .IR arcs .
155: A node consists of a label
156: and a set of arcs leading to prerequisite nodes.
157: The root
158: node is labeled with an original target
159: .I name.
160: .SS Building the Dependency Dag
161: .PP
162: Read the
163: .I mkfiles
164: in command line order and distribute rule tails over targets
165: to get single-target rules.
166: .PP
167: For a node
168: .IR n ,
169: for every rule
170: .I r
171: that matches
172: .IR n 's
173: label generate an arc to a prerequisite node.
174: The node
175: .I n
176: is then marked as done.
177: The process is then repeated for each of the prerequisite nodes.
178: The process stops if
179: .I n
180: is already done,
181: or if
182: .I n
183: has no prerequisites,
184: or if any rule would be used more than
185: .B $NREP
186: times on the current path in the dag.
187: A probable node is one where the label exists as a file
188: or is a target of a non-metarule.
189: .PP
190: After the graph is built, it is checked for cycles,
191: and subdags containing no probable nodes are deleted.
192: Also, for any node with arcs generated by a non-metarule with a recipe,
193: arcs generated by a metarule with a recipe
194: are deleted.
195: Disconnected subdags are deleted.
196: .SS Execution
197: Labels have an associated date stamp.
198: A label is
199: .I ready
200: if it has no prerequisites, or
201: all its prerequisites are made.
202: A ready label is
203: .I trivially uptodate
204: if it is not a target and has a nonzero date stamp, or
205: it has a nonzero date stamp,
206: and all its prerequisites are made and predate the ready label.
207: A ready label is marked
208: .I made
209: (and given a date stamp)
210: if it is trivially uptodate or by executing the recipe
211: associated with the arcs leading from the node associated with the ready label.
212: The
213: .B P
214: attribute can be used to generalize
215: .IR mk 's
216: notion of determining if prerequisites predate a label.
217: Rather than comparing date stamps, it executes a specified program
218: and uses the exit status.
219: .PP
220: Date stamps are calculated differently for virtual labels,
221: for labels that correspond to extant files,
222: and for other labels.
223: If a label is
224: .I virtual
225: (target of a rule with the
226: .B V
227: attribute),
228: its date stamp is initially zero and upon being made is set to
229: the most recent date stamp of its prerequisites.
230: Otherwise, if a label is nonexistent
231: (does not exist as a file),
232: its date stamp is set to the most recent date stamp of its prerequisites,
233: or zero if it has no prerequisites.
234: Otherwise, the label is the name of a file and
235: the label's date stamp is always that file's modification date.
236: .PP
237: Nonexistent labels which have prerequisites
238: and are prerequisite to other label(s) are treated specially unless the
239: .B -i
240: flag is used.
241: Such a label
242: .I l
243: is given the date stamp of its most recent prerequisite
244: and if this causes all the labels which have
245: .I l
246: as a prerequisite to be trivially uptodate,
247: .I l
248: is considered to be trivially uptodate.
249: Otherwise,
250: .I l
251: is made in the normal fashion.
252: .PP
253: Two recipes are called identical if they arose by distribution
254: from a single rule as described above.
255: Identical recipes may be executed only when all
256: their prerequisite nodes are ready, and then just one instance of
257: the identical recipes is executed to make all their target nodes.
258: .PP
259: Files may be made in any order that respects
260: the preceding restrictions.
261: .PP
262: A recipe is executed by supplying the recipe as standard input to
263: the command
264: .B
265: /bin/sh -e
266: .br
267: The environment is augmented by the following variables:
268: .TP 14
269: .B $alltarget
270: all the targets of this rule.
271: .TP
272: .B $newprereq
273: the prerequisites that caused this rule to execute.
274: .TP
275: .B $nproc
276: the process slot for this recipe.
277: It satisfies
278: .RB 0\(<= $nproc < $NPROC ,
279: where
280: .B $NPROC
281: is the maximum number of recipes that may be executing
282: simultaneously.
283: .TP
284: .B $pid
285: the process id for the
286: .I mk
287: forking the recipe.
288: .TP
289: .B $prereq
290: all the prerequisites for this rule.
291: .TP
292: .B $stem
293: if this is a metarule,
294: .B $stem
295: is the string that matched
296: .BR % .
297: Otherwise, it is empty.
298: For regular expression metarules, the variables
299: .LR stem0 ", ...,"
300: .L stem9
301: are set to the corresponding subexpressions.
302: .TP
303: .B $target
304: the targets for this rule that need to be remade.
305: .PP
306: Unless the rule has the
307: .B Q
308: attribute,
309: the recipe is printed prior to execution
310: with recognizable shell variables expanded.
311: To see the commands print as they execute,
312: include a
313: .L set -x
314: in your rule.
315: Commands returning nonzero status (see
316: .IR intro (1))
317: cause
318: .I mk
319: to terminate.
320: .SS Aggregates
321: Names of the form
322: .IR a ( b )
323: refer to member
324: .I b
325: of the aggregate
326: .IR a .
327: Currently, the only aggregates supported are
328: .IR ar (1)
329: archives.
330: .SS Environment
331: Rules may make use of shell (or environment) variables.
332: A legal shell variable reference of the form
333: .B $OBJ
334: or
335: .B ${name}
336: is expanded as in
337: .IR sh (1).
338: A reference of the form
339: .BI ${name: A % B = C\fB%\fID\fB}\fR,
340: where
341: .I A, B, C, D
342: are (possibly empty) strings,
343: has the value formed by expanding
344: .B $name
345: and substituting
346: .I C
347: for
348: .I A
349: and
350: .I D
351: for
352: .I B
353: in each word in
354: .B $name
355: that matches pattern
356: .IB A % B .
357: .PP
358: Variables can be set by
359: assignments of the form
360: .I
361: var\fB=\fR[\fIattr\fB=\fR]\fItokens\fR
362: .br
363: where
364: .I tokens
365: and the optional attributes
366: are defined under `Syntax' below.
367: The environment is exported to recipe executions.
368: Variable values are taken from (in increasing order of precedence)
369: the default values below, the environment, the mkfiles,
370: and any command line assignment.
371: A variable assignment argument overrides the first (but not any subsequent)
372: assignment to that variable.
373: .br
374: .ne 1i
375: .EX
376: .ta \n(.lu/3u +\n(.lu/3u
377: .nf
378: AS=as FFLAGS= NPROC=1
379: CC=cc LEX=lex NREP=1
380: CFLAGS= LFLAGS= YACC=yacc
381: FC=f77 LDFLAGS= YFLAGS=
382: BUILTINS='
383: .ta 8n
384: %.o: %.c
385: $CC $CFLAGS -c $stem.c
386: %.o: %.s
387: $AS -o $stem.o $stem.s
388: %.o: %.f
389: $FC $FFLAGS -c $stem.f
390: %.o: %.y
391: $YACC $YFLAGS $stem.y &&
392: $CC $CFLAGS -c y.tab.c && mv y.tab.o $stem.o; rm y.tab.c
393: %.o: %.l
394: $LEX $LFLAGS -t $stem.l > $stem.c &&
395: $CC $CFLAGS -c $stem.c && rm $stem.c'
396: ENVIRON=
397: .EE
398: .PP
399: The builtin rules are obtained from the variable
400: .B BUILTINS
401: after all input has been processed.
402: The
403: .B ENVIRON
404: variable is split into parts at control-A characters,
405: the control-A characters are deleted, and the parts are
406: placed in the environment.
407: The variable
408: .B MKFLAGS
409: contains all the option arguments (arguments starting with
410: .L -
411: or containing
412: .LR = )
413: and
414: .B MKARGS
415: contains all the targets in the call to
416: .IR mk .
417: .SS Syntax
418: Leading white space (blank or tab) is ignored.
419: Input after an unquoted
420: .B #
421: (a comment) is ignored as are blank lines.
422: Lines can be spread over several physical lines by
423: placing a
424: .B \e
425: before newlines to be elided.
426: Non-recipe lines are processed by substituting for
427: .BI ` cmd `
428: and then substituting for variable references.
429: Finally, the filename metacharacters
430: .B []*?
431: are expanded.
432: .tr #"
433: Quoting by
434: .BR \&'' ,
435: .BR ## ,
436: and
437: .B \e
438: is supported.
439: The semantics for substitution and quoting are given in
440: .IR sh (1).
441: .PP
442: The contents of files may be included by lines beginning with
443: .B <
444: followed by a filename.
445: .PP
446: .tr ##
447: Assignments and rule header lines are distinguished by
448: the first unquoted occurrence of
449: .B :
450: (rule header)
451: or
452: .B =
453: (assignment).
454: .PP
455: A rule definition consists of a header line followed by a recipe.
456: The recipe consists of all lines following the header line
457: that start with white space.
458: The recipe may be empty.
459: The first character on every line of the recipe is elided.
460: The header line consists of at least one target followed by the rule separator
461: and a possibly empty list of prerequisites.
462: The rule separator is either a single
463: .LR :
464: or is a
465: .L :
466: immediately followed by attributes and another
467: .LR : .
468: If any prerequisite is more recent than any of the targets,
469: the recipe is executed.
470: This meaning is modified by the following attributes
471: .TP
472: .B <
473: The standard output of the recipe is read by
474: .I mk
475: as an additional mkfile.
476: Assignments take effect immediately.
477: Rule definitions are used when a new dependency dag is constructed.
478: .PD 0
479: .TP
480: .B D
481: If the recipe exits with an error status, the target is deleted.
482: .TP
483: .B N
484: If there is no recipe, the target has its time updated.
485: .TP
486: .B P
487: The characters after the
488: .B P
489: until the terminating
490: .B :
491: are taken as a program name.
492: It will be invoked as
493: .B "sh -c prog 'arg1' 'arg2'"
494: and should return 0 exit status
495: if and only if arg1 is not out of date with respect to arg2.
496: Date stamps are still propagated in the normal way.
497: .TP
498: .B Q
499: The recipe is not printed prior to execution.
500: .TP
501: .B R
502: The rule is a metarule using regular expressions.
503: .TP
504: .B U
505: The targets are considered to have been updated
506: even if the recipe did not do so.
507: .TP
508: .B V
509: The targets of this rule are marked as virtual.
510: They are distinct from files of the same name.
511: .PD
512: .PP
513: Similarly, assignments may have attributes terminated by
514: .BR = .
515: The only assignment attribute is
516: .TP 3
517: .B U
518: Do not export this variable to recipe executions.
519: .SH EXAMPLES
520: A simple mkfile to compile a program.
521: .IP
522: .EX
523: prog: a.o b.o c.o
524: $CC $CFLAGS -o $target $prereq
525: .EE
526: .PP
527: Override flag settings in the mkfile.
528: .IP
529: .EX
530: $ mk target CFLAGS='-O -s'
531: .EE
532: .PP
533: To get the prerequisites for an aggregate.
534: .IP
535: .EX
536: $ membername 'libc.a(read.o)' 'libc.a(write.o)'
537: read.o write.o
538: .EE
539: .PP
540: Maintain a library.
541: .IP
542: .EX
543: libc.a(%.o):N: %.o
544: libc.a: libc.a(abs.o) libc.a(access.o) libc.a(alarm.o) ...
545: names=`membername $newprereq`
546: ar r libc.a $names && rm $names
547: .EE
548: .PP
549: Backquotes used to derive a list from a master list.
550: .IP
551: .EX
552: NAMES=alloc arc bquote builtins expand main match mk var word
553: OBJ=`echo $NAMES|sed -e 's/[^ ][^ ]*/&.o/g'`
554: .EE
555: .PP
556: Regular expression metarules.
557: The single quotes are needed to protect the
558: .BR \e s.
559: .IP
560: .EX
561: \&'([^/]*)/(.*)\e.o':R: '\e1/\e2.c'
562: cd $stem1; $CC $CFLAGS -c $stem2.c
563: .EE
564: .PP
565: A correct way to deal with
566: .IR yacc (1)
567: grammars.
568: The file
569: .B lex.c
570: includes the file
571: .B x.tab.h
572: rather than
573: .B y.tab.h
574: in order to reflect changes in content, not just modification time.
575: .IP
576: .EX
577: YFLAGS=-d
578: lex.o: x.tab.h
579: x.tab.h: y.tab.h
580: cmp -s x.tab.h y.tab.h || cp y.tab.h x.tab.h
581: y.tab.c y.tab.h: gram.y
582: $YACC $YFLAGS gram.y
583: .EE
584: .PP
585: The above example could also use the
586: .B P
587: attribute for the
588: .B x.tab.h
589: rule:
590: .IP
591: .EX
592: x.tab.h:Pcmp -s: y.tab.h
593: cp y.tab.h x.tab.h
594: .EE
595: .SH SEE ALSO
596: .IR make (1),
597: .IR chdate (1),
598: .IR sh (1),
599: .IR regexp (3)
600: .br
601: A. Hume,
602: .RI ` Mk :
603: a Successor to
604: .IR Make ',
605: this manual, Volume 2
606: .SH BUGS
607: Identical recipes for regular expression metarules only have one target.
608: .br
609: Seemingly appropriate input like
610: .B CFLAGS=-DHZ=60
611: is parsed as an erroneous attribute; correct it by inserting
612: a space after the first
613: .LR = .
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.