Annotation of researchv10no/cmd/mk/export/mk.1, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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