|
|
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 = .
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.