aboutsummaryrefslogtreecommitdiff
path: root/man/man1/mk.html
blob: 3dde6143f286ebda6264602546654972deb84cf2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
<head>
<title>mk(1) - Plan 9 from User Space</title>
<meta content="text/html; charset=utf-8" http-equiv=Content-Type>
</head>
<body bgcolor=#ffffff>
<table border=0 cellpadding=0 cellspacing=0 width=100%>
<tr height=10><td>
<tr><td width=20><td>
<tr><td width=20><td><b>MK(1)</b><td align=right><b>MK(1)</b>
<tr><td width=20><td colspan=2>
    <br>
<p><font size=+1><b>NAME     </b></font><br>

<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

    mk &ndash; maintain (make) related files<br>
    
</table>
<p><font size=+1><b>SYNOPSIS     </b></font><br>

<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

    <tt><font size=+1>mk</font></tt> [ <tt><font size=+1>&#8722;f</font></tt> <i>mkfile</i> ] ... [ <i>option ...</i> ] [ <i>target ...</i> ]<br>
    
</table>
<p><font size=+1><b>DESCRIPTION     </b></font><br>

<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

    <i>Mk</i> uses the dependency rules specified in <i>mkfile</i> to control the
    update (usually by compilation) of <i>targets</i> (usually files) from
    the source files upon which they depend. The <i>mkfile</i> (default <tt><font size=+1>mkfile</font></tt>)
    contains a <i>rule</i> for each target that identifies the files and
    other targets upon which it depends and an <a href="../man1/sh.html"><i>sh</i>(1)</a> script, a
    <i>recipe</i>, to update the target. The script is run if the target
    does not exist or if it is older than any of the files it depends
    on. <i>Mkfile</i> may also contain <i>meta-rules</i> that define actions for
    updating implicit targets. If no <i>target</i> is specified, the target
    of the first rule (not meta-rule) in <i>mkfile</i> is updated. 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    The environment variable <tt><font size=+1>$NPROC</font></tt> determines how many targets may
    be updated simultaneously; Some operating systems, e.g., Plan
    9, set <tt><font size=+1>$NPROC</font></tt> automatically to the number of CPUs on the current
    machine. 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    Options are:<br>
    <tt><font size=+1>&#8722;a</font></tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Assume all targets to be out of date. Thus, everything is updated.<br>
    <tt><font size=+1>&#8722;d</font></tt>[<tt><font size=+1>egp</font></tt>]&nbsp;&nbsp;&nbsp;Produce debugging output (<tt><font size=+1>p</font></tt> is for parsing, <tt><font size=+1>g</font></tt> for graph
    building, <tt><font size=+1>e</font></tt> for execution).<br>
    <tt><font size=+1>&#8722;e</font></tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Explain why each target is made.<br>
    <tt><font size=+1>&#8722;i</font></tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Force any missing intermediate targets to be made.<br>
    <tt><font size=+1>&#8722;k</font></tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do as much work as possible in the face of errors.<br>
    <tt><font size=+1>&#8722;n</font></tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Print, but do not execute, the commands needed to update the
    targets.<br>
    <tt><font size=+1>&#8722;s</font></tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Make the command line arguments sequentially rather than in
    parallel.<br>
    <tt><font size=+1>&#8722;t</font></tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Touch (update the modified date of) file targets, without executing
    any recipes.<br>
    <tt><font size=+1>&#8722;w</font></tt><i>target1</i><tt><font size=+1>,</font></tt><i>target2,...<br>
    </i>
    <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

        
        <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

            Pretend the modify time for each <i>target</i> is the current time; useful
            in conjunction with <tt><font size=+1>&#8722;n</font></tt> to learn what updates would be triggered
            by modifying the <i>targets</i>.<br>
            
        </table>
        
    </table>
    <p><font size=+1><b>The <tt><font size=+1>mkfile    </font></tt></b></font><br>
    A <i>mkfile</i> consists of <i>assignments</i> (described under &#8216;Environment&#8217;)
    and <i>rules</i>. A rule contains <i>targets</i> and a <i>tail</i>. A target is a literal
    string and is normally a file name. The tail contains zero or
    more <i>prerequisites</i> and an optional <i>recipe</i>, which is an <tt><font size=+1>shell</font></tt> script.
    Each line of the recipe must begin with white space. A rule
    takes the form<br>
    
    <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

        <tt><font size=+1>target: prereq1 prereq2<br>
        </font></tt> 
        <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

            <i>recipe using</i> <tt><font size=+1>prereq1, prereq2</font></tt> <i>to build</i> <tt><font size=+1>target<br>
            
            <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
            </font></tt>
            
        </table>
        
    </table>
    When the recipe is executed, the first character on every line
    is elided. 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    After the colon on the target line, a rule may specify <i>attributes</i>,
    described below. 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    A <i>meta-rule</i> has a target of the form <i>A</i><tt><font size=+1>%</font></tt><i>B</i> where <i>A</i> and <i>B</i> are (possibly
    empty) strings. A meta-rule acts as a rule for any potential target
    whose name matches <i>A</i><tt><font size=+1>%</font></tt><i>B</i> with <tt><font size=+1>%</font></tt> replaced by an arbitrary string,
    called the <i>stem</i>. In interpreting a meta-rule, the stem is substituted
    for all occurrences of <tt><font size=+1>%</font></tt> in the prerequisite
    names. In the recipe of a meta-rule, the environment variable
    <tt><font size=+1>$stem</font></tt> contains the string matched by the <tt><font size=+1>%</font></tt>. For example, a meta-rule
    to compile a C program using <a href="../man1/9c.html"><i>9c</i>(1)</a> might be:<br>
    
    <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

        <tt><font size=+1>%: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%.c<br>
         
        <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

            9c &#8722;c $stem.c<br>
             9l &#8722;o $stem $stem.o<br>
            
            <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
            
        </table>
        </font></tt>
        <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

            
            
        </table>
        
    </table>
    Meta-rules may contain an ampersand <tt><font size=+1>&amp;</font></tt> rather than a percent sign
    <tt><font size=+1>%</font></tt>. A <tt><font size=+1>%</font></tt> matches a maximal length string of any characters; an <tt><font size=+1>&amp;</font></tt>
    matches a maximal length string of any characters except period
    or slash. 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    The text of the <i>mkfile</i> is processed as follows. Lines beginning
    with <tt><font size=+1>&lt;</font></tt> followed by a file name are replaced by the contents of
    the named file. Lines beginning with <tt><font size=+1>&lt;|</font></tt> followed by a file name
    are replaced by the output of the execution of the named file.
    Blank lines and comments, which run from unquoted <tt><font size=+1>#</font></tt> characters
    to the following newline, are deleted. The character sequence
    backslash-newline is deleted, so long lines in <i>mkfile</i> may be folded.
    Non-recipe lines are processed by substituting for <tt><font size=+1>`{</font></tt><i>command</i><tt><font size=+1>}</font></tt>
    the output of the <i>command</i> when run by <i>sh</i>. References to variables
    are replaced by the variables&#8217; values. Special
    characters may be quoted using single quotes <tt><font size=+1>''</font></tt> as in <a href="../man1/sh.html"><i>sh</i>(1)</a>. 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    Assignments and rules are distinguished by the first unquoted
    occurrence of <tt><font size=+1>:</font></tt> (rule) or <tt><font size=+1>=</font></tt> (assignment). 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    A later rule may modify or override an existing rule under the
    following conditions:<br>
    &ndash;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If the targets of the rules exactly match and one rule contains
    only a prerequisite clause and no recipe, the clause is added
    to the prerequisites of the other rule. If either or both targets
    are virtual, the recipe is always executed.<br>
    &ndash;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If the targets of the rules match exactly and the prerequisites
    do not match and both rules contain recipes, <i>mk</i> reports an &#8220;ambiguous
    recipe&#8221; error.<br>
    &ndash;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If the target and prerequisites of both rules match exactly, the
    second rule overrides the first.<br>
    <p><font size=+1><b>Environment     </b></font><br>
    Rules may make use of shell environment variables. A legal reference
    of the form <tt><font size=+1>$OBJ</font></tt> or <tt><font size=+1>${name}</font></tt> is expanded as in <a href="../man1/sh.html"><i>sh</i>(1)</a>. A reference
    of the form <tt><font size=+1>${name:</font></tt><i>A</i><tt><font size=+1>%</font></tt><i>B</i><tt><font size=+1>=</font></tt><i>C</i><tt><font size=+1>%</font></tt><i>D</i><tt><font size=+1>}</font></tt>, where <i>A, B, C, D</i> are (possibly empty)
    strings, has the value formed by expanding <tt><font size=+1>$name</font></tt> and substituting
    <i>C</i> for <i>A</i> and <i>D</i> for <i>B</i> in each word in
    <tt><font size=+1>$name</font></tt> that matches pattern <i>A</i><tt><font size=+1>%</font></tt><i>B</i>. 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    Variables can be set by assignments of the form<br>
    
    <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

        <i>var</i><tt><font size=+1>=</font></tt>[<i>attr</i><tt><font size=+1>=</font></tt>]<i>value<br>
        </i>
    </table>
    Blanks in the <i>value</i> break it into words. Such variables are exported
    to the environment of recipes as they are executed, unless <tt><font size=+1>U</font></tt>,
    the only legal attribute <i>attr</i>, is present. The initial value of
    a variable is taken from (in increasing order of precedence) the
    default values below, <i>mk&#8217;s</i> environment, the <i>mkfiles</i>, and any
    command line assignment as an argument to <i>mk</i>. A variable assignment
    argument overrides the first (but not any subsequent) assignment
    to that variable. 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    The variable <tt><font size=+1>MKFLAGS</font></tt> contains all the option arguments (arguments
    starting with <tt><font size=+1>&#8722;</font></tt> or containing <tt><font size=+1>=</font></tt>) and <tt><font size=+1>MKARGS</font></tt> contains all the targets
    in the call to <i>mk</i>. 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    The variable <tt><font size=+1>MKSHELL</font></tt> contains the shell command line <i>mk</i> uses to
    run recipes. If the first word of the command ends in <tt><font size=+1>rc</font></tt> or <tt><font size=+1>rcsh</font></tt>,
    <i>mk</i> uses <a href="../man1/rc.html"><i>rc</i>(1)</a>&#8217;s quoting rules; otherwise it uses <a href="../man1/sh.html"><i>sh</i>(1)</a>&#8217;s. The
    <tt><font size=+1>MKSHELL</font></tt> variable is consulted when the mkfile is read, not when
    it is executed, so that different shells can be used within
    a single mkfile:<br>
    
    <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

        <tt><font size=+1>MKSHELL=$PLAN9/bin/rc<br>
        use&#8722;rc:V:<br>
        
        <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

            for(i in a b c) echo $i<br>
            
        </table>
        MKSHELL=sh<br>
        use&#8722;sh:V:<br>
        
        <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

            for i in a b c; do echo $i; done<br>
            
            <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
            
        </table>
        </font></tt>
        <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

            
            
        </table>
        
    </table>
    Mkfiles included via <tt><font size=+1>&lt;</font></tt> or <tt><font size=+1>&lt;|</font></tt> (<i>q.v.</i>) see their own private copy of
    <tt><font size=+1>MKSHELL</font></tt>, which always starts set to <tt><font size=+1>sh . 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    </font></tt>
    Dynamic information may be included in the mkfile by using a line
    of the form<br>
    
    <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

        &lt;|<i>command args 
        <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
        </i>
        
    </table>
    This runs the command <i>command</i> with the given arguments <i>args</i> and
    pipes its standard output to <i>mk</i> to be included as part of the
    mkfile. For instance, the Inferno kernels use this technique to
    run a shell command with an awk script and a configuration file
    as arguments in order for the <i>awk</i> script to process the file
    and output a set of variables and their values.<br>
    <p><font size=+1><b>Execution     </b></font><br>
    
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    During execution, <i>mk</i> determines which targets must be updated,
    and in what order, to build the <i>names</i> specified on the command
    line. It then runs the associated recipes. 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    A target is considered up to date if it has no prerequisites or
    if all its prerequisites are up to date and it is newer than all
    its prerequisites. Once the recipe for a target has executed,
    the target is considered up to date. 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    The date stamp used to determine if a target is up to date is
    computed differently for different types of targets. If a target
    is <i>virtual</i> (the target of a rule with the <tt><font size=+1>V</font></tt> attribute), its date
    stamp is initially zero; when the target is updated the date stamp
    is set to the most recent date stamp of its prerequisites. Otherwise,
    if a
    target does not exist as a file, its date stamp is set to the
    most recent date stamp of its prerequisites, or zero if it has
    no prerequisites. Otherwise, the target is the name of a file
    and the target&#8217;s date stamp is always that file&#8217;s modification
    date. The date stamp is computed when the target is needed in
    the execution of
    a rule; it is not a static value. 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    Nonexistent targets that have prerequisites and are themselves
    prerequisites are treated specially. Such a target <i>t</i> is given
    the date stamp of its most recent prerequisite and if this causes
    all the targets which have <i>t</i> as a prerequisite to be up to date,
    <i>t</i> is considered up to date. Otherwise, <i>t</i> is made in the normal
    fashion.
    The <tt><font size=+1>&#8722;i</font></tt> flag overrides this special treatment. 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    Files may be made in any order that respects the preceding restrictions.
    
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    A recipe is executed by supplying the recipe as standard input
    to the command <tt><font size=+1>/bin/sh</font></tt>. (Note that unlike <i>make</i>, <i>mk</i> feeds the entire
    recipe to the shell rather than running each line of the recipe
    separately.) The environment is augmented by the following variables:<br>
    <tt><font size=+1>$alltarget<br>
    </font></tt>
    <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

        
        <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

            all the targets of this rule.<br>
            
        </table>
        
    </table>
    <tt><font size=+1>$newprereq<br>
    </font></tt>
    <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

        
        <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

            the prerequisites that caused this rule to execute.<br>
            
        </table>
        
    </table>
    <tt><font size=+1>$newmember<br>
    </font></tt>
    <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

        
        <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

            the prerequisites that are members of an aggregate that caused
            this rule to execute. When the prerequisites of a rule are members
            of an aggregate, <tt><font size=+1>$newprereq</font></tt> contains the name of the aggregate
            and out of date members, while <tt><font size=+1>$newmember</font></tt> contains only the name
            of the members.
            
        </table>
        
    </table>
    <tt><font size=+1>$nproc</font></tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the process slot for this recipe. It satisfies 0&le;<tt><font size=+1>$nproc</font></tt>&lt;<tt><font size=+1>$NPROC</font></tt>.<br>
    <tt><font size=+1>$pid</font></tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the process id for the <i>mk</i> executing the recipe.<br>
    <tt><font size=+1>$prereq</font></tt>&nbsp;&nbsp;&nbsp;&nbsp;all the prerequisites for this rule.<br>
    <tt><font size=+1>$stem</font></tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if this is a meta-rule, <tt><font size=+1>$stem</font></tt> is the string that matched
    <tt><font size=+1>%</font></tt> or <tt><font size=+1>&amp;</font></tt>. Otherwise, it is empty. For regular expression meta-rules
    (see below), the variables <tt><font size=+1>stem0</font></tt>, ..., <tt><font size=+1>stem9</font></tt> are set to the corresponding
    subexpressions.<br>
    <tt><font size=+1>$target</font></tt>&nbsp;&nbsp;&nbsp;&nbsp;the targets for this rule that need to be remade. 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    These variables are available only during the execution of a recipe,
    not while evaluating the <i>mkfile</i>. 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    Unless the rule has the <tt><font size=+1>Q</font></tt> attribute, the recipe is printed prior
    to execution with recognizable environment variables expanded.
    Commands returning error status cause <i>mk</i> to terminate. 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    Recipes and backquoted <tt><font size=+1>rc</font></tt> commands in places such as assignments
    execute in a copy of <i>mk&#8217;s</i> environment; changes they make to environment
    variables are not visible from <i>mk</i>. 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    Variable substitution in a rule is done when the rule is read;
    variable substitution in the recipe is done when the recipe is
    executed. For example:<br>
    
    <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

        <tt><font size=+1>bar=a.c<br>
        foo: $bar<br>
         
        <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

            $CC &#8722;o foo $bar<br>
            
        </table>
        bar=b.c<br>
        
        <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
        </font></tt>
        
    </table>
    will compile <tt><font size=+1>b.c</font></tt> into <tt><font size=+1>foo</font></tt>, if <tt><font size=+1>a.c</font></tt> is newer than <tt><font size=+1>foo</font></tt>.<br>
    <p><font size=+1><b>Aggregates     </b></font><br>
    Names of the form <i>a</i>(<i>b</i>) refer to member <i>b</i> of the aggregate <i>a</i>. Currently,
    the only aggregates supported are <i>9ar</i> (see <a href="../man1/9c.html"><i>9c</i>(1)</a>) archives.<br>
    <p><font size=+1><b>Attributes     </b></font><br>
    The colon separating the target from the prerequisites may be
    immediately followed by <i>attributes</i> and another colon. The attributes
    are:<br>
    <tt><font size=+1>D</font></tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If the recipe exits with a non-null status, the target is deleted.<br>
    <tt><font size=+1>E</font></tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Continue execution if the recipe draws errors.<br>
    <tt><font size=+1>N</font></tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If there is no recipe, the target has its time updated.<br>
    <tt><font size=+1>n</font></tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The rule is a meta-rule that cannot be a target of a virtual
    rule. Only files match the pattern in the target.<br>
    <tt><font size=+1>P</font></tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The characters after the <tt><font size=+1>P</font></tt> until the terminating <tt><font size=+1>:</font></tt> are taken
    as a program name. It will be invoked as <tt><font size=+1>sh &#8722;c prog 'arg1' 'arg2'</font></tt>
    and should return a zero exit status if and only if arg1 is up
    to date with respect to arg2. Date stamps are still propagated
    in the normal way.<br>
    <tt><font size=+1>Q</font></tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The recipe is not printed prior to execution.<br>
    <tt><font size=+1>R</font></tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The rule is a meta-rule using regular expressions. In the rule,
    <tt><font size=+1>%</font></tt> has no special meaning. The target is interpreted as a regular
    expression as defined in <a href="../man7/regexp.html"><i>regexp</i>(7)</a>. The prerequisites may contain
    references to subexpressions in form <tt><font size=+1>\</font></tt><i>n</i>, as in the substitute
    command of <a href="../man1/sed.html"><i>sed</i>(1)</a>.<br>
    <tt><font size=+1>U</font></tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The targets are considered to have been updated even if the recipe
    did not do so.<br>
    <tt><font size=+1>V</font></tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The targets of this rule are marked as virtual. They are distinct
    from files of the same name.<br>
    
</table>
<p><font size=+1><b>EXAMPLES     </b></font><br>

<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

    A simple mkfile to compile a program:<br>
    
    <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

        <tt><font size=+1>&lt;/$objtype/mkfile<br>
        prog: a.$O b.$O c.$O<br>
        
        <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

            $LD $LDFLAGS &#8722;o $target $prereq<br>
            
        </table>
        %.$O: %.c<br>
        
        <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

            $CC $CFLAGS $stem.c<br>
            
            <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
            
        </table>
        </font></tt>
        <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

            
            
        </table>
        
    </table>
    Override flag settings in the mkfile:<br>
    
    <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

        <tt><font size=+1>% mk target 'CFLAGS=&#8722;S &#8722;w'<br>
        
        <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
        </font></tt>
        
    </table>
    Maintain a library:<br>
    
    <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

        <tt><font size=+1>libc.a(%.$O):N: &nbsp;&nbsp;&nbsp;%.$O<br>
        libc.a: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libc.a(abs.$O) libc.a(access.$O) libc.a(alarm.$O) ...<br>
        
        <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

            ar r libc.a $newmember<br>
            
            <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
            
        </table>
        </font></tt>
        <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

            
            
        </table>
        
    </table>
    String expression variables to derive names from a master list:<br>
    
    <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

        <tt><font size=+1>NAMES=alloc arc bquote builtins expand main match mk var word<br>
        OBJ=${NAMES:%=%.$O}<br>
        
        <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
        </font></tt>
        
    </table>
    Regular expression meta-rules:<br>
    
    <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

        <tt><font size=+1>([^/]*)/(.*)\.$O:R: &nbsp;&nbsp;&nbsp;\1/\2.c<br>
        
        <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

            cd $stem1; $CC $CFLAGS $stem2.c<br>
            
            <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
            
        </table>
        </font></tt>
        <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

            
            
        </table>
        
    </table>
    A correct way to deal with <a href="../man1/yacc.html"><i>yacc</i>(1)</a> grammars. The file <tt><font size=+1>lex.c</font></tt> includes
    the file <tt><font size=+1>x.tab.h</font></tt> rather than <tt><font size=+1>y.tab.h</font></tt> in order to reflect changes
    in content, not just modification time.<br>
    
    <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

        <tt><font size=+1>lex.$O: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x.tab.h<br>
        x.tab.h: &nbsp;&nbsp;&nbsp;&nbsp;y.tab.h<br>
        
        <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

            cmp &#8722;s x.tab.h y.tab.h || cp y.tab.h x.tab.h<br>
            
        </table>
        y.tab.c y.tab.h: gram.y<br>
        
        <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

            $YACC &#8722;d gram.y<br>
            
            <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
            
        </table>
        </font></tt>
        <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

            
            
        </table>
        
    </table>
    The above example could also use the <tt><font size=+1>P</font></tt> attribute for the <tt><font size=+1>x.tab.h</font></tt>
    rule:<br>
    
    <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

        <tt><font size=+1>x.tab.h:Pcmp &#8722;s: y.tab.h<br>
        
        <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

            cp y.tab.h x.tab.h<br>
            
        </table>
        </font></tt>
    </table>
    
</table>
<p><font size=+1><b>SOURCE     </b></font><br>

<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

    <tt><font size=+1>/usr/local/plan9/src/cmd/mk<br>
    </font></tt>
</table>
<p><font size=+1><b>SEE ALSO    </b></font><br>

<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

    <a href="../man1/sh.html"><i>sh</i>(1)</a>, <a href="../man7/regexp.html"><i>regexp</i>(7)</a> 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    A. Hume, &#8220;Mk: a Successor to Make&#8221; (Tenth Edition Research Unix
    Manuals). 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    Andrew G. Hume and Bob Flandrena, &#8220;Maintaining Files on Plan 9
    with Mk&#8221;. DOCPREFIX/doc/mk.pdf<br>
    
</table>
<p><font size=+1><b>HISTORY     </b></font><br>

<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

    Andrew Hume wrote <i>mk</i> for Tenth Edition Research Unix. It was later
    ported to Plan 9. This software is a port of the Plan 9 version
    back to Unix.<br>
    
</table>
<p><font size=+1><b>BUGS     </b></font><br>

<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

    Identical recipes for regular expression meta-rules only have
    one target. 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    Seemingly appropriate input like <tt><font size=+1>CFLAGS=&#8722;DHZ=60</font></tt> is parsed as an
    erroneous attribute; correct it by inserting a space after the
    first <tt><font size=+1>=</font></tt>. 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    The recipes printed by <i>mk</i> before being passed to the shell for
    execution are sometimes erroneously expanded for printing. Don&#8217;t
    trust what&#8217;s printed; rely on what the shell does.<br>
    
</table>

<td width=20>
<tr height=20><td>
</table>
<!-- TRAILER -->
<table border=0 cellpadding=0 cellspacing=0 width=100%>
<tr height=15><td width=10><td><td width=10>
<tr><td><td>
<center>
<a href="../../"><img src="../../dist/spaceglenda100.png" alt="Space Glenda" border=1></a>
</center>
</table>
<!-- TRAILER -->
</body></html>