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