Blame


1 058b0118 2005-01-03 devnull .TH MK 1
2 058b0118 2005-01-03 devnull .de EX
3 058b0118 2005-01-03 devnull .nf
4 058b0118 2005-01-03 devnull .ft B
5 058b0118 2005-01-03 devnull ..
6 058b0118 2005-01-03 devnull .de EE
7 058b0118 2005-01-03 devnull .fi
8 058b0118 2005-01-03 devnull .ft R
9 058b0118 2005-01-03 devnull ..
10 058b0118 2005-01-03 devnull .de LR
11 058b0118 2005-01-03 devnull .if t .BR \\$1 \\$2
12 058b0118 2005-01-03 devnull .if n .RB ` \\$1 '\\$2
13 058b0118 2005-01-03 devnull ..
14 058b0118 2005-01-03 devnull .de L
15 058b0118 2005-01-03 devnull .nh
16 058b0118 2005-01-03 devnull .if t .B \\$1
17 058b0118 2005-01-03 devnull .if n .RB ` \\$1 '
18 058b0118 2005-01-03 devnull ..
19 058b0118 2005-01-03 devnull .SH NAME
20 058b0118 2005-01-03 devnull mk, membername \- maintain (make) related files
21 058b0118 2005-01-03 devnull .SH SYNOPSIS
22 058b0118 2005-01-03 devnull .B mk
23 058b0118 2005-01-03 devnull [
24 058b0118 2005-01-03 devnull .B -f
25 058b0118 2005-01-03 devnull .I mkfile
26 058b0118 2005-01-03 devnull ] ...
27 058b0118 2005-01-03 devnull [
28 058b0118 2005-01-03 devnull .I option ...
29 058b0118 2005-01-03 devnull ]
30 058b0118 2005-01-03 devnull [
31 058b0118 2005-01-03 devnull .I target ...
32 058b0118 2005-01-03 devnull ]
33 058b0118 2005-01-03 devnull .PP
34 058b0118 2005-01-03 devnull .B membername
35 058b0118 2005-01-03 devnull .IR lib ( object )
36 058b0118 2005-01-03 devnull \&...
37 058b0118 2005-01-03 devnull .SH DESCRIPTION
38 058b0118 2005-01-03 devnull .I Mk
39 058b0118 2005-01-03 devnull uses the dependency rules specified in
40 058b0118 2005-01-03 devnull .I mkfile
41 058b0118 2005-01-03 devnull to control the update (usually by compilation) of
42 058b0118 2005-01-03 devnull .I targets
43 058b0118 2005-01-03 devnull (usually files)
44 058b0118 2005-01-03 devnull from the source files upon which they depend.
45 058b0118 2005-01-03 devnull The
46 058b0118 2005-01-03 devnull .I mkfile
47 058b0118 2005-01-03 devnull (default
48 058b0118 2005-01-03 devnull .LR mkfile )
49 058b0118 2005-01-03 devnull contains a
50 058b0118 2005-01-03 devnull .I rule
51 058b0118 2005-01-03 devnull for each target that identifies the files and other
52 058b0118 2005-01-03 devnull targets upon which it depends and an
53 058b0118 2005-01-03 devnull .IR sh (1)
54 058b0118 2005-01-03 devnull script, a
55 058b0118 2005-01-03 devnull .IR recipe ,
56 058b0118 2005-01-03 devnull to update the target.
57 058b0118 2005-01-03 devnull The script is run if the target does not exist
58 058b0118 2005-01-03 devnull or if it is older than any of the files it depends on.
59 058b0118 2005-01-03 devnull .I Mkfile
60 058b0118 2005-01-03 devnull may also contain
61 058b0118 2005-01-03 devnull .I meta-rules
62 058b0118 2005-01-03 devnull that define actions for updating implicit targets.
63 058b0118 2005-01-03 devnull If no
64 058b0118 2005-01-03 devnull .I target
65 058b0118 2005-01-03 devnull is specified, the target of the first rule (not meta-rule) in
66 058b0118 2005-01-03 devnull .I mkfile
67 058b0118 2005-01-03 devnull is updated.
68 058b0118 2005-01-03 devnull .PP
69 058b0118 2005-01-03 devnull The environment variable
70 058b0118 2005-01-03 devnull .B $NPROC
71 058b0118 2005-01-03 devnull determines how many targets may be updated simultaneously;
72 058b0118 2005-01-03 devnull Some operating systems, e.g., Plan 9, set
73 058b0118 2005-01-03 devnull .B $NPROC
74 058b0118 2005-01-03 devnull automatically to the number of CPUs on the current machine.
75 058b0118 2005-01-03 devnull .PP
76 058b0118 2005-01-03 devnull Options are:
77 058b0118 2005-01-03 devnull .TP \w'\fL-d[egp]\ 'u
78 058b0118 2005-01-03 devnull .B -a
79 058b0118 2005-01-03 devnull Assume all targets to be out of date.
80 058b0118 2005-01-03 devnull Thus, everything is updated.
81 058b0118 2005-01-03 devnull .PD 0
82 058b0118 2005-01-03 devnull .TP
83 058b0118 2005-01-03 devnull .BR -d [ egp ]
84 058b0118 2005-01-03 devnull Produce debugging output
85 058b0118 2005-01-03 devnull .RB ( p
86 058b0118 2005-01-03 devnull is for parsing,
87 058b0118 2005-01-03 devnull .B g
88 058b0118 2005-01-03 devnull for graph building,
89 058b0118 2005-01-03 devnull .B e
90 058b0118 2005-01-03 devnull for execution).
91 058b0118 2005-01-03 devnull .TP
92 058b0118 2005-01-03 devnull .B -e
93 058b0118 2005-01-03 devnull Explain why each target is made.
94 058b0118 2005-01-03 devnull .TP
95 058b0118 2005-01-03 devnull .B -i
96 058b0118 2005-01-03 devnull Force any missing intermediate targets to be made.
97 058b0118 2005-01-03 devnull .TP
98 058b0118 2005-01-03 devnull .B -k
99 058b0118 2005-01-03 devnull Do as much work as possible in the face of errors.
100 058b0118 2005-01-03 devnull .TP
101 058b0118 2005-01-03 devnull .B -n
102 058b0118 2005-01-03 devnull Print, but do not execute, the commands
103 058b0118 2005-01-03 devnull needed to update the targets.
104 058b0118 2005-01-03 devnull .TP
105 058b0118 2005-01-03 devnull .B -s
106 058b0118 2005-01-03 devnull Make the command line arguments sequentially rather than in parallel.
107 058b0118 2005-01-03 devnull .TP
108 058b0118 2005-01-03 devnull .B -t
109 058b0118 2005-01-03 devnull Touch (update the modified date of) file targets, without
110 058b0118 2005-01-03 devnull executing any recipes.
111 058b0118 2005-01-03 devnull .TP
112 058b0118 2005-01-03 devnull .BI -w target1 , target2,...
113 058b0118 2005-01-03 devnull Pretend the modify time for each
114 058b0118 2005-01-03 devnull .I target
115 058b0118 2005-01-03 devnull is the current time; useful in conjunction with
116 058b0118 2005-01-03 devnull .B -n
117 058b0118 2005-01-03 devnull to learn what updates would be triggered by
118 058b0118 2005-01-03 devnull modifying the
119 058b0118 2005-01-03 devnull .IR targets .
120 058b0118 2005-01-03 devnull .PD
121 058b0118 2005-01-03 devnull .SS The \fLmkfile\fP
122 058b0118 2005-01-03 devnull A
123 058b0118 2005-01-03 devnull .I mkfile
124 058b0118 2005-01-03 devnull consists of
125 058b0118 2005-01-03 devnull .I assignments
126 058b0118 2005-01-03 devnull (described under `Environment') and
127 058b0118 2005-01-03 devnull .IR rules .
128 058b0118 2005-01-03 devnull A rule contains
129 058b0118 2005-01-03 devnull .I targets
130 058b0118 2005-01-03 devnull and a
131 058b0118 2005-01-03 devnull .IR tail .
132 058b0118 2005-01-03 devnull A target is a literal string
133 058b0118 2005-01-03 devnull and is normally a file name.
134 058b0118 2005-01-03 devnull The tail contains zero or more
135 058b0118 2005-01-03 devnull .I prerequisites
136 058b0118 2005-01-03 devnull and an optional
137 058b0118 2005-01-03 devnull .IR recipe ,
138 058b0118 2005-01-03 devnull which is an
139 058b0118 2005-01-03 devnull .B shell
140 058b0118 2005-01-03 devnull script.
141 058b0118 2005-01-03 devnull Each line of the recipe must begin with white space.
142 058b0118 2005-01-03 devnull A rule takes the form
143 058b0118 2005-01-03 devnull .IP
144 058b0118 2005-01-03 devnull .EX
145 058b0118 2005-01-03 devnull target: prereq1 prereq2
146 058b0118 2005-01-03 devnull \f2recipe using\fP prereq1, prereq2 \f2to build\fP target
147 058b0118 2005-01-03 devnull .EE
148 058b0118 2005-01-03 devnull .PP
149 058b0118 2005-01-03 devnull When the recipe is executed,
150 058b0118 2005-01-03 devnull the first character on every line is elided.
151 058b0118 2005-01-03 devnull .PP
152 058b0118 2005-01-03 devnull After the colon on the target line, a rule may specify
153 058b0118 2005-01-03 devnull .IR attributes ,
154 058b0118 2005-01-03 devnull described below.
155 058b0118 2005-01-03 devnull .PP
156 058b0118 2005-01-03 devnull A
157 058b0118 2005-01-03 devnull .I meta-rule
158 058b0118 2005-01-03 devnull has a target of the form
159 058b0118 2005-01-03 devnull .IB A % B
160 058b0118 2005-01-03 devnull where
161 058b0118 2005-01-03 devnull .I A
162 058b0118 2005-01-03 devnull and
163 058b0118 2005-01-03 devnull .I B
164 058b0118 2005-01-03 devnull are (possibly empty) strings.
165 058b0118 2005-01-03 devnull A meta-rule acts as a rule for any potential target whose
166 058b0118 2005-01-03 devnull name matches
167 058b0118 2005-01-03 devnull .IB A % B
168 058b0118 2005-01-03 devnull with
169 058b0118 2005-01-03 devnull .B %
170 058b0118 2005-01-03 devnull replaced by an arbitrary string, called the
171 058b0118 2005-01-03 devnull .IR stem .
172 058b0118 2005-01-03 devnull In interpreting a meta-rule,
173 058b0118 2005-01-03 devnull the stem is substituted for all occurrences of
174 058b0118 2005-01-03 devnull .B %
175 058b0118 2005-01-03 devnull in the prerequisite names.
176 058b0118 2005-01-03 devnull In the recipe of a meta-rule, the environment variable
177 058b0118 2005-01-03 devnull .B $stem
178 058b0118 2005-01-03 devnull contains the string matched by the
179 058b0118 2005-01-03 devnull .BR % .
180 058b0118 2005-01-03 devnull For example, a meta-rule to compile a C program using
181 058b0118 2005-01-03 devnull .IR 9c (1)
182 058b0118 2005-01-03 devnull might be:
183 058b0118 2005-01-03 devnull .IP
184 058b0118 2005-01-03 devnull .EX
185 058b0118 2005-01-03 devnull %: %.c
186 058b0118 2005-01-03 devnull 9c -c $stem.c
187 058b0118 2005-01-03 devnull 9l -o $stem $stem.o
188 058b0118 2005-01-03 devnull .EE
189 058b0118 2005-01-03 devnull .PP
190 058b0118 2005-01-03 devnull Meta-rules may contain an ampersand
191 058b0118 2005-01-03 devnull .B &
192 058b0118 2005-01-03 devnull rather than a percent sign
193 058b0118 2005-01-03 devnull .BR % .
194 058b0118 2005-01-03 devnull A
195 058b0118 2005-01-03 devnull .B %
196 058b0118 2005-01-03 devnull matches a maximal length string of any characters;
197 058b0118 2005-01-03 devnull an
198 058b0118 2005-01-03 devnull .B &
199 058b0118 2005-01-03 devnull matches a maximal length string of any characters except period
200 058b0118 2005-01-03 devnull or slash.
201 058b0118 2005-01-03 devnull .PP
202 058b0118 2005-01-03 devnull The text of the
203 058b0118 2005-01-03 devnull .I mkfile
204 058b0118 2005-01-03 devnull is processed as follows.
205 058b0118 2005-01-03 devnull Lines beginning with
206 058b0118 2005-01-03 devnull .B <
207 058b0118 2005-01-03 devnull followed by a file name are replaced by the contents of the named
208 058b0118 2005-01-03 devnull file.
209 058b0118 2005-01-03 devnull Lines beginning with
210 058b0118 2005-01-03 devnull .B "<|"
211 058b0118 2005-01-03 devnull followed by a file name are replaced by the output
212 058b0118 2005-01-03 devnull of the execution of the named
213 058b0118 2005-01-03 devnull file.
214 058b0118 2005-01-03 devnull Blank lines and comments, which run from unquoted
215 058b0118 2005-01-03 devnull .B #
216 058b0118 2005-01-03 devnull characters to the following newline, are deleted.
217 058b0118 2005-01-03 devnull The character sequence backslash-newline is deleted,
218 058b0118 2005-01-03 devnull so long lines in
219 058b0118 2005-01-03 devnull .I mkfile
220 058b0118 2005-01-03 devnull may be folded.
221 058b0118 2005-01-03 devnull Non-recipe lines are processed by substituting for
222 058b0118 2005-01-03 devnull .BI `{ command }
223 058b0118 2005-01-03 devnull the output of the
224 058b0118 2005-01-03 devnull .I command
225 058b0118 2005-01-03 devnull when run by
226 058b0118 2005-01-03 devnull .IR sh .
227 058b0118 2005-01-03 devnull References to variables are replaced by the variables' values.
228 058b0118 2005-01-03 devnull Special characters may be quoted using single quotes
229 058b0118 2005-01-03 devnull .BR \&''
230 058b0118 2005-01-03 devnull as in
231 058b0118 2005-01-03 devnull .IR sh (1).
232 058b0118 2005-01-03 devnull .PP
233 058b0118 2005-01-03 devnull Assignments and rules are distinguished by
234 058b0118 2005-01-03 devnull the first unquoted occurrence of
235 058b0118 2005-01-03 devnull .B :
236 058b0118 2005-01-03 devnull (rule)
237 058b0118 2005-01-03 devnull or
238 058b0118 2005-01-03 devnull .B =
239 058b0118 2005-01-03 devnull (assignment).
240 058b0118 2005-01-03 devnull .PP
241 058b0118 2005-01-03 devnull A later rule may modify or override an existing rule under the
242 058b0118 2005-01-03 devnull following conditions:
243 058b0118 2005-01-03 devnull .TP
244 058b0118 2005-01-03 devnull \-
245 058b0118 2005-01-03 devnull If the targets of the rules exactly match and one rule
246 058b0118 2005-01-03 devnull contains only a prerequisite clause and no recipe, the
247 058b0118 2005-01-03 devnull clause is added to the prerequisites of the other rule.
248 058b0118 2005-01-03 devnull If either or both targets are virtual, the recipe is
249 058b0118 2005-01-03 devnull always executed.
250 058b0118 2005-01-03 devnull .TP
251 058b0118 2005-01-03 devnull \-
252 058b0118 2005-01-03 devnull If the targets of the rules match exactly and the
253 058b0118 2005-01-03 devnull prerequisites do not match and both rules
254 058b0118 2005-01-03 devnull contain recipes,
255 058b0118 2005-01-03 devnull .I mk
256 058b0118 2005-01-03 devnull reports an ``ambiguous recipe'' error.
257 058b0118 2005-01-03 devnull .TP
258 058b0118 2005-01-03 devnull \-
259 058b0118 2005-01-03 devnull If the target and prerequisites of both rules match exactly,
260 058b0118 2005-01-03 devnull the second rule overrides the first.
261 058b0118 2005-01-03 devnull .SS Environment
262 058b0118 2005-01-03 devnull Rules may make use of
263 058b0118 2005-01-03 devnull shell
264 058b0118 2005-01-03 devnull environment variables.
265 058b0118 2005-01-03 devnull A legal reference of the form
266 058b0118 2005-01-03 devnull .B $OBJ
267 058b0118 2005-01-03 devnull or
268 058b0118 2005-01-03 devnull .B ${name}
269 058b0118 2005-01-03 devnull is expanded as in
270 058b0118 2005-01-03 devnull .IR sh (1).
271 058b0118 2005-01-03 devnull A reference of the form
272 058b0118 2005-01-03 devnull .BI ${name: A % B = C\fL%\fID\fL}\fR,
273 058b0118 2005-01-03 devnull where
274 058b0118 2005-01-03 devnull .I A, B, C, D
275 058b0118 2005-01-03 devnull are (possibly empty) strings,
276 058b0118 2005-01-03 devnull has the value formed by expanding
277 058b0118 2005-01-03 devnull .B $name
278 058b0118 2005-01-03 devnull and substituting
279 058b0118 2005-01-03 devnull .I C
280 058b0118 2005-01-03 devnull for
281 058b0118 2005-01-03 devnull .I A
282 058b0118 2005-01-03 devnull and
283 058b0118 2005-01-03 devnull .I D
284 058b0118 2005-01-03 devnull for
285 058b0118 2005-01-03 devnull .I B
286 058b0118 2005-01-03 devnull in each word in
287 058b0118 2005-01-03 devnull .B $name
288 058b0118 2005-01-03 devnull that matches pattern
289 058b0118 2005-01-03 devnull .IB A % B\f1.
290 058b0118 2005-01-03 devnull .PP
291 058b0118 2005-01-03 devnull Variables can be set by
292 058b0118 2005-01-03 devnull assignments of the form
293 058b0118 2005-01-03 devnull .I
294 058b0118 2005-01-03 devnull var\fL=\fR[\fIattr\fL=\fR]\fIvalue\fR
295 058b0118 2005-01-03 devnull .br
296 058b0118 2005-01-03 devnull Blanks in the
297 058b0118 2005-01-03 devnull .I value
298 058b0118 2005-01-03 devnull break it into words.
299 058b0118 2005-01-03 devnull Such variables are exported
300 058b0118 2005-01-03 devnull to the environment of
301 058b0118 2005-01-03 devnull recipes as they are executed, unless
302 058b0118 2005-01-03 devnull .BR U ,
303 058b0118 2005-01-03 devnull the only legal attribute
304 058b0118 2005-01-03 devnull .IR attr ,
305 058b0118 2005-01-03 devnull is present.
306 058b0118 2005-01-03 devnull The initial value of a variable is
307 058b0118 2005-01-03 devnull taken from (in increasing order of precedence)
308 058b0118 2005-01-03 devnull the default values below,
309 058b0118 2005-01-03 devnull .I mk's
310 058b0118 2005-01-03 devnull environment, the
311 058b0118 2005-01-03 devnull .IR mkfiles ,
312 058b0118 2005-01-03 devnull and any command line assignment as an argument to
313 058b0118 2005-01-03 devnull .IR mk .
314 058b0118 2005-01-03 devnull A variable assignment argument overrides the first (but not any subsequent)
315 058b0118 2005-01-03 devnull assignment to that variable.
316 058b0118 2005-01-03 devnull The variable
317 058b0118 2005-01-03 devnull .B MKFLAGS
318 058b0118 2005-01-03 devnull contains all the option arguments (arguments starting with
319 058b0118 2005-01-03 devnull .L -
320 058b0118 2005-01-03 devnull or containing
321 058b0118 2005-01-03 devnull .LR = )
322 058b0118 2005-01-03 devnull and
323 058b0118 2005-01-03 devnull .B MKARGS
324 058b0118 2005-01-03 devnull contains all the targets in the call to
325 058b0118 2005-01-03 devnull .IR mk .
326 058b0118 2005-01-03 devnull .PP
327 058b0118 2005-01-03 devnull Dynamic information may be included in the mkfile by using a line of the form
328 058b0118 2005-01-03 devnull .IP
329 058b0118 2005-01-03 devnull \fR<|\fIcommand\fR \fIargs\fR
330 058b0118 2005-01-03 devnull .LP
331 058b0118 2005-01-03 devnull This runs the command
332 058b0118 2005-01-03 devnull .I command
333 058b0118 2005-01-03 devnull with the given arguments
334 058b0118 2005-01-03 devnull .I args
335 058b0118 2005-01-03 devnull and pipes its standard output to
336 058b0118 2005-01-03 devnull .I mk
337 058b0118 2005-01-03 devnull to be included as part of the mkfile. For instance, the Inferno kernels
338 058b0118 2005-01-03 devnull use this technique
339 058b0118 2005-01-03 devnull to run a shell command with an awk script and a configuration
340 058b0118 2005-01-03 devnull file as arguments in order for
341 058b0118 2005-01-03 devnull the
342 058b0118 2005-01-03 devnull .I awk
343 058b0118 2005-01-03 devnull script to process the file and output a set of variables and their values.
344 058b0118 2005-01-03 devnull .SS Execution
345 058b0118 2005-01-03 devnull .PP
346 058b0118 2005-01-03 devnull During execution,
347 058b0118 2005-01-03 devnull .I mk
348 058b0118 2005-01-03 devnull determines which targets must be updated, and in what order,
349 058b0118 2005-01-03 devnull to build the
350 058b0118 2005-01-03 devnull .I names
351 058b0118 2005-01-03 devnull specified on the command line.
352 058b0118 2005-01-03 devnull It then runs the associated recipes.
353 058b0118 2005-01-03 devnull .PP
354 058b0118 2005-01-03 devnull A target is considered up to date if it has no prerequisites or
355 058b0118 2005-01-03 devnull if all its prerequisites are up to date and it is newer
356 058b0118 2005-01-03 devnull than all its prerequisites.
357 058b0118 2005-01-03 devnull Once the recipe for a target has executed, the target is
358 058b0118 2005-01-03 devnull considered up to date.
359 058b0118 2005-01-03 devnull .PP
360 058b0118 2005-01-03 devnull The date stamp
361 058b0118 2005-01-03 devnull used to determine if a target is up to date is computed
362 058b0118 2005-01-03 devnull differently for different types of targets.
363 058b0118 2005-01-03 devnull If a target is
364 058b0118 2005-01-03 devnull .I virtual
365 058b0118 2005-01-03 devnull (the target of a rule with the
366 058b0118 2005-01-03 devnull .B V
367 058b0118 2005-01-03 devnull attribute),
368 058b0118 2005-01-03 devnull its date stamp is initially zero; when the target is
369 058b0118 2005-01-03 devnull updated the date stamp is set to
370 058b0118 2005-01-03 devnull the most recent date stamp of its prerequisites.
371 058b0118 2005-01-03 devnull Otherwise, if a target does not exist as a file,
372 058b0118 2005-01-03 devnull its date stamp is set to the most recent date stamp of its prerequisites,
373 058b0118 2005-01-03 devnull or zero if it has no prerequisites.
374 058b0118 2005-01-03 devnull Otherwise, the target is the name of a file and
375 058b0118 2005-01-03 devnull the target's date stamp is always that file's modification date.
376 058b0118 2005-01-03 devnull The date stamp is computed when the target is needed in
377 058b0118 2005-01-03 devnull the execution of a rule; it is not a static value.
378 058b0118 2005-01-03 devnull .PP
379 058b0118 2005-01-03 devnull Nonexistent targets that have prerequisites
380 058b0118 2005-01-03 devnull and are themselves prerequisites are treated specially.
381 058b0118 2005-01-03 devnull Such a target
382 058b0118 2005-01-03 devnull .I t
383 058b0118 2005-01-03 devnull is given the date stamp of its most recent prerequisite
384 058b0118 2005-01-03 devnull and if this causes all the targets which have
385 058b0118 2005-01-03 devnull .I t
386 058b0118 2005-01-03 devnull as a prerequisite to be up to date,
387 058b0118 2005-01-03 devnull .I t
388 058b0118 2005-01-03 devnull is considered up to date.
389 058b0118 2005-01-03 devnull Otherwise,
390 058b0118 2005-01-03 devnull .I t
391 058b0118 2005-01-03 devnull is made in the normal fashion.
392 058b0118 2005-01-03 devnull The
393 058b0118 2005-01-03 devnull .B -i
394 058b0118 2005-01-03 devnull flag overrides this special treatment.
395 058b0118 2005-01-03 devnull .PP
396 058b0118 2005-01-03 devnull Files may be made in any order that respects
397 058b0118 2005-01-03 devnull the preceding restrictions.
398 058b0118 2005-01-03 devnull .PP
399 058b0118 2005-01-03 devnull A recipe is executed by supplying the recipe as standard input to
400 058b0118 2005-01-03 devnull the command
401 058b0118 2005-01-03 devnull .BR /bin/sh .
402 058b0118 2005-01-03 devnull (Note that unlike
403 058b0118 2005-01-03 devnull .IR make ,
404 058b0118 2005-01-03 devnull .I mk
405 058b0118 2005-01-03 devnull feeds the entire recipe to the shell rather than running each line
406 058b0118 2005-01-03 devnull of the recipe separately.)
407 058b0118 2005-01-03 devnull The environment is augmented by the following variables:
408 058b0118 2005-01-03 devnull .TP 14
409 058b0118 2005-01-03 devnull .B $alltarget
410 058b0118 2005-01-03 devnull all the targets of this rule.
411 058b0118 2005-01-03 devnull .TP
412 058b0118 2005-01-03 devnull .B $newprereq
413 058b0118 2005-01-03 devnull the prerequisites that caused this rule to execute.
414 058b0118 2005-01-03 devnull .TP
415 058b0118 2005-01-03 devnull .B $newmember
416 058b0118 2005-01-03 devnull the prerequisites that are members of an aggregate
417 058b0118 2005-01-03 devnull that caused this rule to execute.
418 058b0118 2005-01-03 devnull When the prerequisites of a rule are members of an
419 058b0118 2005-01-03 devnull aggregate,
420 058b0118 2005-01-03 devnull .B $newprereq
421 058b0118 2005-01-03 devnull contains the name of the aggregate and out of date
422 058b0118 2005-01-03 devnull members, while
423 058b0118 2005-01-03 devnull .B $newmember
424 058b0118 2005-01-03 devnull contains only the name of the members.
425 058b0118 2005-01-03 devnull .TP
426 058b0118 2005-01-03 devnull .B $nproc
427 058b0118 2005-01-03 devnull the process slot for this recipe.
428 058b0118 2005-01-03 devnull It satisfies
429 058b0118 2005-01-03 devnull .RB 0≤ $nproc < $NPROC .
430 058b0118 2005-01-03 devnull .TP
431 058b0118 2005-01-03 devnull .B $pid
432 058b0118 2005-01-03 devnull the process id for the
433 058b0118 2005-01-03 devnull .I mk
434 058b0118 2005-01-03 devnull executing the recipe.
435 058b0118 2005-01-03 devnull .TP
436 058b0118 2005-01-03 devnull .B $prereq
437 058b0118 2005-01-03 devnull all the prerequisites for this rule.
438 058b0118 2005-01-03 devnull .TP
439 058b0118 2005-01-03 devnull .B $stem
440 058b0118 2005-01-03 devnull if this is a meta-rule,
441 058b0118 2005-01-03 devnull .B $stem
442 058b0118 2005-01-03 devnull is the string that matched
443 058b0118 2005-01-03 devnull .B %
444 058b0118 2005-01-03 devnull or
445 058b0118 2005-01-03 devnull .BR & .
446 058b0118 2005-01-03 devnull Otherwise, it is empty.
447 058b0118 2005-01-03 devnull For regular expression meta-rules (see below), the variables
448 058b0118 2005-01-03 devnull .LR stem0 ", ...,"
449 058b0118 2005-01-03 devnull .L stem9
450 058b0118 2005-01-03 devnull are set to the corresponding subexpressions.
451 058b0118 2005-01-03 devnull .TP
452 058b0118 2005-01-03 devnull .B $target
453 058b0118 2005-01-03 devnull the targets for this rule that need to be remade.
454 058b0118 2005-01-03 devnull .PP
455 058b0118 2005-01-03 devnull These variables are available only during the execution of a recipe,
456 058b0118 2005-01-03 devnull not while evaluating the
457 058b0118 2005-01-03 devnull .IR mkfile .
458 058b0118 2005-01-03 devnull .PP
459 058b0118 2005-01-03 devnull Unless the rule has the
460 058b0118 2005-01-03 devnull .B Q
461 058b0118 2005-01-03 devnull attribute,
462 058b0118 2005-01-03 devnull the recipe is printed prior to execution
463 058b0118 2005-01-03 devnull with recognizable environment variables expanded.
464 058b0118 2005-01-03 devnull Commands returning error status
465 058b0118 2005-01-03 devnull cause
466 058b0118 2005-01-03 devnull .I mk
467 058b0118 2005-01-03 devnull to terminate.
468 058b0118 2005-01-03 devnull .PP
469 058b0118 2005-01-03 devnull Recipes and backquoted
470 058b0118 2005-01-03 devnull .B rc
471 058b0118 2005-01-03 devnull commands in places such as assignments
472 058b0118 2005-01-03 devnull execute in a copy of
473 058b0118 2005-01-03 devnull .I mk's
474 058b0118 2005-01-03 devnull environment; changes they make to
475 058b0118 2005-01-03 devnull environment variables are not visible from
476 058b0118 2005-01-03 devnull .IR mk .
477 058b0118 2005-01-03 devnull .PP
478 058b0118 2005-01-03 devnull Variable substitution in a rule is done when
479 058b0118 2005-01-03 devnull the rule is read; variable substitution in the recipe is done
480 058b0118 2005-01-03 devnull when the recipe is executed. For example:
481 058b0118 2005-01-03 devnull .IP
482 058b0118 2005-01-03 devnull .EX
483 058b0118 2005-01-03 devnull bar=a.c
484 058b0118 2005-01-03 devnull foo: $bar
485 058b0118 2005-01-03 devnull $CC -o foo $bar
486 058b0118 2005-01-03 devnull bar=b.c
487 058b0118 2005-01-03 devnull .EE
488 058b0118 2005-01-03 devnull .PP
489 058b0118 2005-01-03 devnull will compile
490 058b0118 2005-01-03 devnull .B b.c
491 058b0118 2005-01-03 devnull into
492 058b0118 2005-01-03 devnull .BR foo ,
493 058b0118 2005-01-03 devnull if
494 058b0118 2005-01-03 devnull .B a.c
495 058b0118 2005-01-03 devnull is newer than
496 058b0118 2005-01-03 devnull .BR foo .
497 058b0118 2005-01-03 devnull .SS Aggregates
498 058b0118 2005-01-03 devnull Names of the form
499 058b0118 2005-01-03 devnull .IR a ( b )
500 058b0118 2005-01-03 devnull refer to member
501 058b0118 2005-01-03 devnull .I b
502 058b0118 2005-01-03 devnull of the aggregate
503 058b0118 2005-01-03 devnull .IR a .
504 058b0118 2005-01-03 devnull Currently, the only aggregates supported are
505 058b0118 2005-01-03 devnull .I 9ar
506 058b0118 2005-01-03 devnull (see
507 058b0118 2005-01-03 devnull .IR 9c (1))
508 058b0118 2005-01-03 devnull archives.
509 058b0118 2005-01-03 devnull .PP
510 058b0118 2005-01-03 devnull .I Membername
511 058b0118 2005-01-03 devnull echoes just the member names of a list of aggregate names.
512 058b0118 2005-01-03 devnull It is useful in recipes like:
513 058b0118 2005-01-03 devnull .EX
514 058b0118 2005-01-03 devnull OFILES=a.o b.o
515 058b0118 2005-01-03 devnull libc.a(%):N: %
516 058b0118 2005-01-03 devnull libc.a: ${OFILES:%=libc.a(%)}
517 058b0118 2005-01-03 devnull 9ar rvc libc.a `membername $newprereq`
518 058b0118 2005-01-03 devnull .EE
519 058b0118 2005-01-03 devnull which re-archives only the new object files.
520 058b0118 2005-01-03 devnull .SS Attributes
521 058b0118 2005-01-03 devnull The colon separating the target from the prerequisites
522 058b0118 2005-01-03 devnull may be
523 058b0118 2005-01-03 devnull immediately followed by
524 058b0118 2005-01-03 devnull .I attributes
525 058b0118 2005-01-03 devnull and another colon.
526 058b0118 2005-01-03 devnull The attributes are:
527 058b0118 2005-01-03 devnull .TP
528 058b0118 2005-01-03 devnull .B D
529 058b0118 2005-01-03 devnull If the recipe exits with a non-null status, the target is deleted.
530 058b0118 2005-01-03 devnull .TP
531 058b0118 2005-01-03 devnull .B E
532 058b0118 2005-01-03 devnull Continue execution if the recipe draws errors.
533 058b0118 2005-01-03 devnull .TP
534 058b0118 2005-01-03 devnull .B N
535 058b0118 2005-01-03 devnull If there is no recipe, the target has its time updated.
536 058b0118 2005-01-03 devnull .TP
537 058b0118 2005-01-03 devnull .B n
538 058b0118 2005-01-03 devnull The rule is a meta-rule that cannot be a target of a virtual rule.
539 058b0118 2005-01-03 devnull Only files match the pattern in the target.
540 058b0118 2005-01-03 devnull .TP
541 058b0118 2005-01-03 devnull .B P
542 058b0118 2005-01-03 devnull The characters after the
543 058b0118 2005-01-03 devnull .B P
544 058b0118 2005-01-03 devnull until the terminating
545 058b0118 2005-01-03 devnull .B :
546 058b0118 2005-01-03 devnull are taken as a program name.
547 058b0118 2005-01-03 devnull It will be invoked as
548 058b0118 2005-01-03 devnull .B "sh -c prog 'arg1' 'arg2'"
549 058b0118 2005-01-03 devnull and should return a zero exit status
550 058b0118 2005-01-03 devnull if and only if arg1 is up to date with respect to arg2.
551 058b0118 2005-01-03 devnull Date stamps are still propagated in the normal way.
552 058b0118 2005-01-03 devnull .TP
553 058b0118 2005-01-03 devnull .B Q
554 058b0118 2005-01-03 devnull The recipe is not printed prior to execution.
555 058b0118 2005-01-03 devnull .TP
556 058b0118 2005-01-03 devnull .B R
557 058b0118 2005-01-03 devnull The rule is a meta-rule using regular expressions.
558 058b0118 2005-01-03 devnull In the rule,
559 058b0118 2005-01-03 devnull .B %
560 058b0118 2005-01-03 devnull has no special meaning.
561 058b0118 2005-01-03 devnull The target is interpreted as a regular expression as defined in
562 058b0118 2005-01-03 devnull .IR regexp (7).
563 058b0118 2005-01-03 devnull The prerequisites may contain references
564 058b0118 2005-01-03 devnull to subexpressions in form
565 058b0118 2005-01-03 devnull .BI \e n\f1,
566 058b0118 2005-01-03 devnull as in the substitute command of
567 058b0118 2005-01-03 devnull .IR sed (1).
568 058b0118 2005-01-03 devnull .TP
569 058b0118 2005-01-03 devnull .B U
570 058b0118 2005-01-03 devnull The targets are considered to have been updated
571 058b0118 2005-01-03 devnull even if the recipe did not do so.
572 058b0118 2005-01-03 devnull .TP
573 058b0118 2005-01-03 devnull .B V
574 058b0118 2005-01-03 devnull The targets of this rule are marked as virtual.
575 058b0118 2005-01-03 devnull They are distinct from files of the same name.
576 058b0118 2005-01-03 devnull .PD
577 058b0118 2005-01-03 devnull .SH EXAMPLES
578 058b0118 2005-01-03 devnull A simple mkfile to compile a program:
579 058b0118 2005-01-03 devnull .IP
580 058b0118 2005-01-03 devnull .EX
581 058b0118 2005-01-03 devnull .ta 8n +8n +8n +8n +8n +8n +8n
582 058b0118 2005-01-03 devnull </$objtype/mkfile
583 058b0118 2005-01-03 devnull
584 058b0118 2005-01-03 devnull prog: a.$O b.$O c.$O
585 058b0118 2005-01-03 devnull $LD $LDFLAGS -o $target $prereq
586 058b0118 2005-01-03 devnull
587 058b0118 2005-01-03 devnull %.$O: %.c
588 058b0118 2005-01-03 devnull $CC $CFLAGS $stem.c
589 058b0118 2005-01-03 devnull .EE
590 058b0118 2005-01-03 devnull .PP
591 058b0118 2005-01-03 devnull Override flag settings in the mkfile:
592 058b0118 2005-01-03 devnull .IP
593 058b0118 2005-01-03 devnull .EX
594 058b0118 2005-01-03 devnull % mk target 'CFLAGS=-S -w'
595 058b0118 2005-01-03 devnull .EE
596 058b0118 2005-01-03 devnull .PP
597 058b0118 2005-01-03 devnull Maintain a library:
598 058b0118 2005-01-03 devnull .IP
599 058b0118 2005-01-03 devnull .EX
600 058b0118 2005-01-03 devnull libc.a(%.$O):N: %.$O
601 058b0118 2005-01-03 devnull libc.a: libc.a(abs.$O) libc.a(access.$O) libc.a(alarm.$O) ...
602 058b0118 2005-01-03 devnull ar r libc.a $newmember
603 058b0118 2005-01-03 devnull .EE
604 058b0118 2005-01-03 devnull .PP
605 058b0118 2005-01-03 devnull String expression variables to derive names from a master list:
606 058b0118 2005-01-03 devnull .IP
607 058b0118 2005-01-03 devnull .EX
608 058b0118 2005-01-03 devnull NAMES=alloc arc bquote builtins expand main match mk var word
609 058b0118 2005-01-03 devnull OBJ=${NAMES:%=%.$O}
610 058b0118 2005-01-03 devnull .EE
611 058b0118 2005-01-03 devnull .PP
612 058b0118 2005-01-03 devnull Regular expression meta-rules:
613 058b0118 2005-01-03 devnull .IP
614 058b0118 2005-01-03 devnull .EX
615 058b0118 2005-01-03 devnull ([^/]*)/(.*)\e.$O:R: \e1/\e2.c
616 058b0118 2005-01-03 devnull cd $stem1; $CC $CFLAGS $stem2.c
617 058b0118 2005-01-03 devnull .EE
618 058b0118 2005-01-03 devnull .PP
619 058b0118 2005-01-03 devnull A correct way to deal with
620 058b0118 2005-01-03 devnull .IR yacc (1)
621 058b0118 2005-01-03 devnull grammars.
622 058b0118 2005-01-03 devnull The file
623 058b0118 2005-01-03 devnull .B lex.c
624 058b0118 2005-01-03 devnull includes the file
625 058b0118 2005-01-03 devnull .B x.tab.h
626 058b0118 2005-01-03 devnull rather than
627 058b0118 2005-01-03 devnull .B y.tab.h
628 058b0118 2005-01-03 devnull in order to reflect changes in content, not just modification time.
629 058b0118 2005-01-03 devnull .IP
630 058b0118 2005-01-03 devnull .EX
631 058b0118 2005-01-03 devnull lex.$O: x.tab.h
632 058b0118 2005-01-03 devnull x.tab.h: y.tab.h
633 058b0118 2005-01-03 devnull cmp -s x.tab.h y.tab.h || cp y.tab.h x.tab.h
634 058b0118 2005-01-03 devnull y.tab.c y.tab.h: gram.y
635 058b0118 2005-01-03 devnull $YACC -d gram.y
636 058b0118 2005-01-03 devnull .EE
637 058b0118 2005-01-03 devnull .PP
638 058b0118 2005-01-03 devnull The above example could also use the
639 058b0118 2005-01-03 devnull .B P
640 058b0118 2005-01-03 devnull attribute for the
641 058b0118 2005-01-03 devnull .B x.tab.h
642 058b0118 2005-01-03 devnull rule:
643 058b0118 2005-01-03 devnull .IP
644 058b0118 2005-01-03 devnull .EX
645 058b0118 2005-01-03 devnull x.tab.h:Pcmp -s: y.tab.h
646 058b0118 2005-01-03 devnull cp y.tab.h x.tab.h
647 058b0118 2005-01-03 devnull .EE
648 058b0118 2005-01-03 devnull .SH SEE ALSO
649 058b0118 2005-01-03 devnull .IR sh (1),
650 058b0118 2005-01-03 devnull .IR regexp9 (7)
651 058b0118 2005-01-03 devnull .PP
652 058b0118 2005-01-03 devnull A. Hume,
653 058b0118 2005-01-03 devnull ``Mk: a Successor to Make''
654 058b0118 2005-01-03 devnull (Tenth Edition Research Unix Manuals).
655 058b0118 2005-01-03 devnull .PP
656 058b0118 2005-01-03 devnull Andrew G. Hume and Bob Flandrena,
657 058b0118 2005-01-03 devnull ``Maintaining Files on Plan 9 with Mk''.
658 058b0118 2005-01-03 devnull DOCPREFIX/doc/mk.pdf
659 058b0118 2005-01-03 devnull .SH HISTORY
660 058b0118 2005-01-03 devnull Andrew Hume wrote
661 058b0118 2005-01-03 devnull .I mk
662 058b0118 2005-01-03 devnull for Tenth Edition Research Unix.
663 058b0118 2005-01-03 devnull It was later ported to Plan 9.
664 058b0118 2005-01-03 devnull This software is a port of the Plan 9 version back to Unix.
665 058b0118 2005-01-03 devnull .SH BUGS
666 058b0118 2005-01-03 devnull Identical recipes for regular expression meta-rules only have one target.
667 058b0118 2005-01-03 devnull .br
668 058b0118 2005-01-03 devnull Seemingly appropriate input like
669 058b0118 2005-01-03 devnull .B CFLAGS=-DHZ=60
670 058b0118 2005-01-03 devnull is parsed as an erroneous attribute; correct it by inserting
671 058b0118 2005-01-03 devnull a space after the first
672 058b0118 2005-01-03 devnull .LR = .
673 058b0118 2005-01-03 devnull .br
674 058b0118 2005-01-03 devnull The recipes printed by
675 058b0118 2005-01-03 devnull .I mk
676 058b0118 2005-01-03 devnull before being passed to
677 058b0118 2005-01-03 devnull .I sh
678 058b0118 2005-01-03 devnull for execution are sometimes erroneously expanded
679 058b0118 2005-01-03 devnull for printing. Don't trust what's printed; rely
680 058b0118 2005-01-03 devnull on what
681 058b0118 2005-01-03 devnull .I sh
682 058b0118 2005-01-03 devnull does.