Annotation of lucent/sys/man/1/mk, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.