1426d2b71SDavid du Colombier.HTML "Plan 9 Mkfiles 23e12c5d1SDavid du Colombier.TL 33e12c5d1SDavid du ColombierPlan 9 Mkfiles 43e12c5d1SDavid du Colombier.AU 5219b2ee8SDavid du ColombierBob Flandrena 67dd7cddfSDavid du Colombierbobf@plan9.bell-labs.com 73e12c5d1SDavid du Colombier.SH 83e12c5d1SDavid du ColombierIntroduction 93e12c5d1SDavid du Colombier.LP 103e12c5d1SDavid du ColombierEvery Plan 9 source directory contains a file, called 113e12c5d1SDavid du Colombier.CW mkfile , 123e12c5d1SDavid du Colombierspecifying the rules for building the executable or 133e12c5d1SDavid du Colombierlibrary that is the product of the directory. 143e12c5d1SDavid du Colombier.I Mk (1) 153e12c5d1SDavid du Colombierinterprets the rules in the file, calculates 16219b2ee8SDavid du Colombierthe dependencies, and executes an 173e12c5d1SDavid du Colombier.I rc (1) 183e12c5d1SDavid du Colombierscript to construct the product. 19219b2ee8SDavid du ColombierIf necessary components are supplied by 20219b2ee8SDavid du Colombierneighboring directories or sub-directories, the mkfiles in those 213e12c5d1SDavid du Colombierdirectories are first executed to build the components 223e12c5d1SDavid du Colombierbefore the local construction proceeds. 233e12c5d1SDavid du Colombier.LP 243e12c5d1SDavid du ColombierMost application source directories produce one of 253e12c5d1SDavid du Colombierfour types of product: 263e12c5d1SDavid du Colombiera single executable, several 273e12c5d1SDavid du Colombierexecutables, a local library, or 283e12c5d1SDavid du Colombiera system library. 293e12c5d1SDavid du ColombierFour generic 303e12c5d1SDavid du Colombiermkfiles 313e12c5d1SDavid du Colombierdefine the normal rules 323e12c5d1SDavid du Colombierfor building each type of product. The simplest 333e12c5d1SDavid du Colombiermkfiles need only 343e12c5d1SDavid du Colombierlist the components 353e12c5d1SDavid du Colombierand include the appropriate 363e12c5d1SDavid du Colombiergeneric 373e12c5d1SDavid du Colombiermkfile 383e12c5d1SDavid du Colombierto do the work. 393e12c5d1SDavid du ColombierMore complex 403e12c5d1SDavid du Colombiermkfiles 413e12c5d1SDavid du Colombiermay supply additional rules 42219b2ee8SDavid du Colombierto augment, modify, or override the generic rules. 433e12c5d1SDavid du Colombier.SH 443e12c5d1SDavid du ColombierUsing a Mkfile 453e12c5d1SDavid du Colombier.LP 463e12c5d1SDavid du ColombierTo build a product, change to the directory containing 473e12c5d1SDavid du Colombierits source and invoke 483e12c5d1SDavid du Colombier.I mk 493e12c5d1SDavid du Colombierwith the appropriate target as an argument. 503e12c5d1SDavid du ColombierAll mkfiles provide the following standard targets: 513e12c5d1SDavid du Colombier.TS 523e12c5d1SDavid du Colombierlw(1i) lw(4.5i). 533e12c5d1SDavid du Colombier\f(CWall\fP T{ 543e12c5d1SDavid du ColombierBuild a local version of the product or products for the 553e12c5d1SDavid du Colombiercurrent architecture. If the product is a single program, 563e12c5d1SDavid du Colombierthe result is stored in file 573e12c5d1SDavid du Colombier.CW $O.out . 583e12c5d1SDavid du ColombierIf the directory produces multiple executables, they are 593e12c5d1SDavid du Colombierstored in the files named 60219b2ee8SDavid du Colombier.CW $O.\fIprogname,\fP 613e12c5d1SDavid du Colombierwhere 623e12c5d1SDavid du Colombier.I progname 633e12c5d1SDavid du Colombieris the name of each executable. 643e12c5d1SDavid du ColombierA product may be built for a different architecture by 653e12c5d1SDavid du Colombierprefacing the 663e12c5d1SDavid du Colombier.CW mk 673e12c5d1SDavid du Colombiercommand with 683e12c5d1SDavid du Colombier\f(CWobjtype=\fP\fIarchitecture\fP, 693e12c5d1SDavid du Colombierwhere 703e12c5d1SDavid du Colombier.I architecture 713e12c5d1SDavid du Colombieris the name of the target architecture. 723e12c5d1SDavid du ColombierDirectories producing system 733e12c5d1SDavid du Colombierlibraries always operate directly on the installed version of the 743e12c5d1SDavid du Colombierlibrary; in this case the target 753e12c5d1SDavid du Colombier.CW all 763e12c5d1SDavid du Colombieris equivalent to the target 773e12c5d1SDavid du Colombier.CW install . 783e12c5d1SDavid du ColombierT} 793e12c5d1SDavid du Colombier\f(CWinstall\fP T{ 803e12c5d1SDavid du ColombierBuild and install the product or products for the current 813e12c5d1SDavid du Colombierarchitecture. 823e12c5d1SDavid du ColombierT} 833e12c5d1SDavid du Colombier\f(CWinstallall\fP T{ 843e12c5d1SDavid du ColombierBuild and install the product or products for all architectures. 853e12c5d1SDavid du ColombierT} 863e12c5d1SDavid du Colombier\f(CWclean\fP T{ 873e12c5d1SDavid du ColombierRid the directory and its subdirectories of the by-products of 883e12c5d1SDavid du Colombierthe build process. Intermediate files that are easily reproduced 893e12c5d1SDavid du Colombier(e.g., object files, 903e12c5d1SDavid du Colombier.CW yacc 913e12c5d1SDavid du Colombierintermediates, target executables) are always 923e12c5d1SDavid du Colombierremoved. Complicated intermediates, such as local libraries, are 933e12c5d1SDavid du Colombierusually preserved. 943e12c5d1SDavid du ColombierT} 953e12c5d1SDavid du Colombier\f(CWnuke\fP T{ 963e12c5d1SDavid du ColombierRemove all intermediates from the directory and any subdirectories. 97219b2ee8SDavid du ColombierThis target guarantees that a subsequent build for the 98219b2ee8SDavid du Colombierarchitecture is performed 993e12c5d1SDavid du Colombierfrom scratch. 1003e12c5d1SDavid du ColombierT} 1013e12c5d1SDavid du Colombier.TE 1023e12c5d1SDavid du Colombier.LP 1033e12c5d1SDavid du ColombierIf no target is specified on the 1043e12c5d1SDavid du Colombier.CW mk 1053e12c5d1SDavid du Colombiercommand line, the 1063e12c5d1SDavid du Colombier.CW all 1073e12c5d1SDavid du Colombiertarget is built by default. In a directory 1083e12c5d1SDavid du Colombierproducing multiple executables, there is 1093e12c5d1SDavid du Colombierno default target. 1103e12c5d1SDavid du Colombier.LP 1113e12c5d1SDavid du ColombierIn addition to the five standard targets, 1123e12c5d1SDavid du Colombieradditional targets may be supplied by each 1133e12c5d1SDavid du Colombiergeneric mkfile or by the directory's mkfile. 114219b2ee8SDavid du Colombier.LP 115219b2ee8SDavid du ColombierThe environment variable 116219b2ee8SDavid du Colombier.CW NPROC 117219b2ee8SDavid du Colombieris set by the system to the number of 118219b2ee8SDavid du Colombieravailable processors. 119219b2ee8SDavid du ColombierSetting 120219b2ee8SDavid du Colombierthis variable, either in the environment or in 121219b2ee8SDavid du Colombiera mkfile, controls the amount of parallelism in 122219b2ee8SDavid du Colombierthe build. For example, the command 123219b2ee8SDavid du Colombier.P1 124219b2ee8SDavid du Colombier NPROC=1 mk 125219b2ee8SDavid du Colombier.P2 126219b2ee8SDavid du Colombierrestricts a build to a single thread of execution. 1273e12c5d1SDavid du Colombier.SH 1283e12c5d1SDavid du ColombierCreating a Mkfile 1293e12c5d1SDavid du Colombier.LP 1303e12c5d1SDavid du ColombierThe easiest way to build a new mkfile is to copy and modify 1313e12c5d1SDavid du Colombieran existing mkfile of the same type. 1323e12c5d1SDavid du ColombierFailing that, it is usually possible to create a new 1333e12c5d1SDavid du Colombiermkfile with minimal effort, since the appropriate 1343e12c5d1SDavid du Colombiergeneric mkfile predefines the rules that do all the work. 1353e12c5d1SDavid du ColombierIn the simplest and most common cases, the new mkfile 1367dd7cddfSDavid du Colombierneed only define a couple of variables and include the appropriate 1373e12c5d1SDavid du Colombierarchitecture-specific 1383e12c5d1SDavid du Colombierand generic mkfiles. 1393e12c5d1SDavid du Colombier.SH The Generic Mkfiles 1403e12c5d1SDavid du Colombier.LP 1413e12c5d1SDavid du ColombierThere are four generic mkfiles containing commonly 1423e12c5d1SDavid du Colombierused rules for building a product: 1433e12c5d1SDavid du Colombier.CW mkone , 1443e12c5d1SDavid du Colombier.CW mkmany , 1453e12c5d1SDavid du Colombier.CW mklib , 1463e12c5d1SDavid du Colombierand 1473e12c5d1SDavid du Colombier.CW mksyslib . 1483e12c5d1SDavid du ColombierThese rules 1493e12c5d1SDavid du Colombierperform such actions as compiling C source files, 1503e12c5d1SDavid du Colombierloading object files, archiving libraries, and 1513e12c5d1SDavid du Colombierinstalling executables in the 1523e12c5d1SDavid du Colombier.CW bin 1533e12c5d1SDavid du Colombierdirectory of the appropriate architecture. 1543e12c5d1SDavid du ColombierThe generic mkfiles are stored in directory 1553e12c5d1SDavid du Colombier.CW /sys/src/cmd . 1563e12c5d1SDavid du ColombierMkfile 1573e12c5d1SDavid du Colombier.CW mkone 1583e12c5d1SDavid du Colombierbuilds a single executable, 1593e12c5d1SDavid du Colombier.CW mkmany 1603e12c5d1SDavid du Colombierbuilds several executables from the source in a single 1613e12c5d1SDavid du Colombierdirectory, and 1623e12c5d1SDavid du Colombier.CW mklib 1633e12c5d1SDavid du Colombierand 1643e12c5d1SDavid du Colombier\f(CWmksyslib\fP, 1653e12c5d1SDavid du Colombiermaintain local and system libraries, respectively. 1663e12c5d1SDavid du ColombierThe rules in the generic mkfiles are driven by 1673e12c5d1SDavid du Colombierthe values of variables, some of which must be 1683e12c5d1SDavid du Colombierset by the product mkfile and some of which are 1693e12c5d1SDavid du Colombiersupplied by the generic mkfile. Variables in the 1703e12c5d1SDavid du Colombierlatter class include: 1713e12c5d1SDavid du Colombier.TS 1723e12c5d1SDavid du Colombiercenter; 1733e12c5d1SDavid du Colombierri ci li 1743e12c5d1SDavid du Colombierrw(1i) cw(0.5i) lw(2i). 1753e12c5d1SDavid du ColombierVariable Default Meaning 1763e12c5d1SDavid du Colombier.sp .5 1777dd7cddfSDavid du Colombier\f(CWCFLAGS\fP \f(CW-FVw\fP C compiler flags 1783e12c5d1SDavid du Colombier\f(CWLDFLAGS\fP Loader flags 1793e12c5d1SDavid du Colombier\f(CWYFLAGS\fP \f(CW-d\fP Yacc flags 1803e12c5d1SDavid du Colombier\f(CWAFLAGS\fP Assembler flags 1813e12c5d1SDavid du Colombier.TE 1823e12c5d1SDavid du Colombier.LP 1833e12c5d1SDavid du ColombierThe following variables are set by the product mkfile 1843e12c5d1SDavid du Colombierand used by the generic mkfile. 1853e12c5d1SDavid du ColombierAny may be empty depending on the specific product being 1863e12c5d1SDavid du Colombiermade. 1873e12c5d1SDavid du Colombier.TS 1883e12c5d1SDavid du Colombiercenter; 1893e12c5d1SDavid du Colombierlw(1i) lw(2.5i). 1903e12c5d1SDavid du Colombier\f(CWTARG\fP Name(s) of the executable(s) to be built 1913e12c5d1SDavid du Colombier\f(CWLIB\fP Library name(s) 1927dd7cddfSDavid du Colombier\f(CWOFILES\fP Object files 1937dd7cddfSDavid du Colombier\f(CWHFILES\fP Header files included by all source files 1943e12c5d1SDavid du Colombier\f(CWYFILES\fP \f(CWYacc\fP input files 1953e12c5d1SDavid du Colombier\f(CWBIN\fP Directory where executables are installed 1963e12c5d1SDavid du Colombier.TE 1973e12c5d1SDavid du Colombier.SH 1983e12c5d1SDavid du ColombierMkfile Organization 1993e12c5d1SDavid du Colombier.LP 2003e12c5d1SDavid du ColombierAll 2013e12c5d1SDavid du Colombiermkfiles 2023e12c5d1SDavid du Colombiershare the following common structure: 2033e12c5d1SDavid du Colombier.P1 204219b2ee8SDavid du Colombier</$objtype/mkfile # \f1architecture-dependent definitions\fP 2053e12c5d1SDavid du Colombier.sp 206219b2ee8SDavid du Colombier\fIvariable definitions\fP # TARG\f1, \fPOFILES\f1, \fPHFILES\f1, etc.\fP 2073e12c5d1SDavid du Colombier.sp 208219b2ee8SDavid du Colombier</sys/src/cmd/\fIgeneric\fP # mkone\f1, \fPmkmany\f1, \fPmklib\f1, or \fPmksyslib 2093e12c5d1SDavid du Colombier.sp 210219b2ee8SDavid du Colombier\fIvariable overrides\fP # CFLAGS\f1, \fPobjtype\f1, etc.\fP 211219b2ee8SDavid du Colombier.sp 212219b2ee8SDavid du Colombier\fIextra rules\fP # \f1overrides, augmented rules, additional targets\fP 2133e12c5d1SDavid du Colombier.P2 2147dd7cddfSDavid du ColombierNote that the architecture-dependent mkfiles include file 2157dd7cddfSDavid du Colombier.CW /sys/src/mkfile.proto 2167dd7cddfSDavid du Colombierfor system-wide variables that are common to all architectures. 2177dd7cddfSDavid du Colombier.LP 2183e12c5d1SDavid du ColombierThe variables driving the expansion of the generic mkfile 2193e12c5d1SDavid du Colombiermay be specified in any order as long as they are defined 2203e12c5d1SDavid du Colombierbefore the inclusion of the generic mkfile. The value 2213e12c5d1SDavid du Colombierof a variable may be changed by assigning a new value 2223e12c5d1SDavid du Colombierfollowing the inclusion of the generic mkfile, but the 2233e12c5d1SDavid du Colombiereffects are sometimes counter-intuitive. 2243e12c5d1SDavid du ColombierSuch variable assignments do not apply to the target and 2253e12c5d1SDavid du Colombierprerequisite portions of any previously defined rules; 226219b2ee8SDavid du Colombierthe new values only apply to the recipes of rules preceding 227219b2ee8SDavid du Colombierthe assignment statement and 228219b2ee8SDavid du Colombierto all parts of any rules following it. 2293e12c5d1SDavid du Colombier.LP 2303e12c5d1SDavid du ColombierThe rules supplied by the generic mkfile may 2313e12c5d1SDavid du Colombierbe overridden or augmented. The new rules must 2323e12c5d1SDavid du Colombierbe specified after the inclusion of the generic 2333e12c5d1SDavid du Colombiermkfile. If the target and prerequisite portion 2343e12c5d1SDavid du Colombierof the rule exactly match the target and prerequisite 2353e12c5d1SDavid du Colombierportion of a previously defined rule and the new rule contains 2363e12c5d1SDavid du Colombiera recipe, the new rule replaces the old one. 2373e12c5d1SDavid du ColombierIf the target of a new rule exactly matches the 2383e12c5d1SDavid du Colombiertarget of a previous rule and one or more new 2393e12c5d1SDavid du Colombierprerequisites are specified and the new rule contains 2403e12c5d1SDavid du Colombierno recipe, the new prerequisites are added to the prerequisites 2413e12c5d1SDavid du Colombierof the old rule. 2423e12c5d1SDavid du Colombier.LP 2433e12c5d1SDavid du ColombierFollowing sections discuss 2443e12c5d1SDavid du Colombiereach generic mkfile in detail. 2453e12c5d1SDavid du Colombier.SH 2463e12c5d1SDavid du ColombierMkone 2473e12c5d1SDavid du Colombier.LP 2483e12c5d1SDavid du ColombierThe 2493e12c5d1SDavid du Colombier.CW mkone 2503e12c5d1SDavid du Colombiergeneric mkfile contains rules for building 2513e12c5d1SDavid du Colombiera single executable from one or more files 2523e12c5d1SDavid du Colombierin a directory. 2533e12c5d1SDavid du ColombierThe variable 2543e12c5d1SDavid du Colombier.CW TARG 2553e12c5d1SDavid du Colombierspecifies the name of the executable and 2563e12c5d1SDavid du Colombiervariables 2573e12c5d1SDavid du Colombier.CW OFILES 2583e12c5d1SDavid du Colombierand 2593e12c5d1SDavid du Colombier.CW YFILES 2603e12c5d1SDavid du Colombierspecify the object files and 2613e12c5d1SDavid du Colombier.CW yacc 2623e12c5d1SDavid du Colombiersource files used to build it. 2633e12c5d1SDavid du Colombier.CW HFILES 2643e12c5d1SDavid du Colombiercontains the names of the local header files 2653e12c5d1SDavid du Colombierincluded in all source files. 2663e12c5d1SDavid du Colombier.CW BIN 2673e12c5d1SDavid du Colombieris the name of the directory where the executable 2683e12c5d1SDavid du Colombieris installed. 2693e12c5d1SDavid du Colombier.CW LIB 2703e12c5d1SDavid du Colombiercontains the names of local libraries used by the 2713e12c5d1SDavid du Colombierlinker. This variable is rarely needed 2723e12c5d1SDavid du Colombieras libraries referenced by a 2733e12c5d1SDavid du Colombier.CW #pragma 2743e12c5d1SDavid du Colombierdirective in an associated header file, including 2753e12c5d1SDavid du Colombierall system libraries, are automatically 2763e12c5d1SDavid du Colombiersearched by the loader. 2773e12c5d1SDavid du Colombier.LP 2787dd7cddfSDavid du ColombierIf 2797dd7cddfSDavid du Colombier.CW mk 2807dd7cddfSDavid du Colombieris executed without a target, the 2813e12c5d1SDavid du Colombier.CW all 2823e12c5d1SDavid du Colombiertarget is built; it 2833e12c5d1SDavid du Colombierproduces an executable in 2843e12c5d1SDavid du Colombier.CW $O.out . 2853e12c5d1SDavid du ColombierVariable 2863e12c5d1SDavid du Colombier.CW HFILES 2873e12c5d1SDavid du Colombieridentifies the header files that 2883e12c5d1SDavid du Colombierare included in all or most or 2893e12c5d1SDavid du Colombierthe C source files. Occasionally, 2903e12c5d1SDavid du Colombiera program has other header files 2913e12c5d1SDavid du Colombierthat are only used in some 2923e12c5d1SDavid du Colombiersource files. A 2933e12c5d1SDavid du Colombierheader can be added to the prerequisites for 2943e12c5d1SDavid du Colombierthose object files by adding a rule of 2953e12c5d1SDavid du Colombierthe following form following the inclusion of generic mkfile 2963e12c5d1SDavid du Colombier.CW mkone : 2973e12c5d1SDavid du Colombier.P1 2983e12c5d1SDavid du Colombierfile.$O: header.h 2993e12c5d1SDavid du Colombier.P2 3003e12c5d1SDavid du Colombier.LP 3013e12c5d1SDavid du ColombierThe mkfile for a directory producing a single 3023e12c5d1SDavid du Colombierexecutable using the normal set of rules is 3033e12c5d1SDavid du Colombiertrivial: a list of some files followed by the 3043e12c5d1SDavid du Colombierinclusion of 3053e12c5d1SDavid du Colombier.I mkone. 3063e12c5d1SDavid du ColombierFor example, 307219b2ee8SDavid du Colombier.CW /sys/src/cmd/diff/mkfile 3083e12c5d1SDavid du Colombiercontains: 3093e12c5d1SDavid du Colombier.P1 3103e12c5d1SDavid du Colombier< /$objtype/mkfile 3113e12c5d1SDavid du Colombier 312219b2ee8SDavid du ColombierTARG=diff 313219b2ee8SDavid du ColombierOFILES=\e 314219b2ee8SDavid du Colombier diffdir.$O\e 315219b2ee8SDavid du Colombier diffio.$O\e 316219b2ee8SDavid du Colombier diffreg.$O\e 317219b2ee8SDavid du Colombier main.$O\e 3183e12c5d1SDavid du Colombier 319219b2ee8SDavid du ColombierHFILES=diff.h 3203e12c5d1SDavid du Colombier 3213e12c5d1SDavid du ColombierBIN=/$objtype/bin 3223e12c5d1SDavid du Colombier</sys/src/cmd/mkone 3233e12c5d1SDavid du Colombier.P2 3243e12c5d1SDavid du ColombierThe more complex mkfile in 3257dd7cddfSDavid du Colombier.CW /sys/src/cmd/awk 3267dd7cddfSDavid du Colombieroverrides compiler and loader variables to 3277dd7cddfSDavid du Colombierselect the ANSI/POSIX Computing Environment with appropriately 3287dd7cddfSDavid du Colombierdefined command line variables. It also overrides 3297dd7cddfSDavid du Colombierthe default 3307dd7cddfSDavid du Colombier.CW yacc 3317dd7cddfSDavid du Colombierrule to place the output soure in file 3327dd7cddfSDavid du Colombier.CW awkgram.c 3337dd7cddfSDavid du Colombierand the 3347dd7cddfSDavid du Colombier.CW clean 3357dd7cddfSDavid du Colombierand 3367dd7cddfSDavid du Colombier.CW nuke 3377dd7cddfSDavid du Colombierrules, so it can remove the non-standard intermediate 3387dd7cddfSDavid du Colombierfiles. Finally, the last three rules build a version of 3397dd7cddfSDavid du Colombier.CW maketab 3407dd7cddfSDavid du Colombierappropriate for the architecture where the 3417dd7cddfSDavid du Colombier.CW mk 3427dd7cddfSDavid du Colombieris being 3437dd7cddfSDavid du Colombierrun and then executes it to create source file 3447dd7cddfSDavid du Colombier.CW proctab.c : 3453e12c5d1SDavid du Colombier.P1 3463e12c5d1SDavid du Colombier</$objtype/mkfile 3473e12c5d1SDavid du Colombier 3487dd7cddfSDavid du ColombierTARG=awk 3497dd7cddfSDavid du ColombierOFILES=re.$O\e 3507dd7cddfSDavid du Colombier lex.$O\e 3517dd7cddfSDavid du Colombier main.$O\e 3527dd7cddfSDavid du Colombier parse.$O\e 3537dd7cddfSDavid du Colombier proctab.$O\e 3547dd7cddfSDavid du Colombier tran.$O\e 3557dd7cddfSDavid du Colombier lib.$O\e 3567dd7cddfSDavid du Colombier run.$O\e 3577dd7cddfSDavid du Colombier awkgram.$O\e 3583e12c5d1SDavid du Colombier 3597dd7cddfSDavid du ColombierHFILES=awk.h\e 3607dd7cddfSDavid du Colombier y.tab.h\e 3617dd7cddfSDavid du Colombier proto.h\e 3623e12c5d1SDavid du Colombier 3637dd7cddfSDavid du ColombierYFILES=awkgram.y 364219b2ee8SDavid du Colombier 365219b2ee8SDavid du ColombierBIN=/$objtype/bin 3663e12c5d1SDavid du Colombier</sys/src/cmd/mkone 3677dd7cddfSDavid du ColombierCFLAGS=-c -D_REGEXP_EXTENSION -D_RESEARCH_SOURCE \e 3687dd7cddfSDavid du Colombier -D_BSD_EXTENSION -DUTF 3697dd7cddfSDavid du ColombierYFLAGS=-S -d -v 3707dd7cddfSDavid du ColombierCC=pcc 3717dd7cddfSDavid du ColombierLD=pcc 3727dd7cddfSDavid du Colombiercpuobjtype=`{sed -n 's/^O=//p' /$cputype/mkfile} 3733e12c5d1SDavid du Colombier 3747dd7cddfSDavid du Colombiery.tab.h awkgram.c: $YFILES 3757dd7cddfSDavid du Colombier $YACC -o awkgram.c $YFLAGS $prereq 3763e12c5d1SDavid du Colombier 3777dd7cddfSDavid du Colombierclean:V: 3787dd7cddfSDavid du Colombier rm -f *.[$OS] [$OS].out [$OS].maketab y.tab.? y.debug\e 3797dd7cddfSDavid du Colombier y.output $TARG 380219b2ee8SDavid du Colombier 3817dd7cddfSDavid du Colombiernuke:V: 3827dd7cddfSDavid du Colombier rm -f *.[$OS] [$OS].out [$OS].maketab y.tab.? y.debug\e 3837dd7cddfSDavid du Colombier y.output awkgram.c $TARG 3847dd7cddfSDavid du Colombier 3857dd7cddfSDavid du Colombierproctab.c: $cpuobjtype.maketab 3867dd7cddfSDavid du Colombier ./$cpuobjtype.maketab >proctab.c 3877dd7cddfSDavid du Colombier 3887dd7cddfSDavid du Colombier$cpuobjtype.maketab: y.tab.h maketab.c 3897dd7cddfSDavid du Colombier objtype=$cputype 3907dd7cddfSDavid du Colombier mk maketab.$cputype 3917dd7cddfSDavid du Colombier 3927dd7cddfSDavid du Colombiermaketab.$cputype:V: y.tab.h maketab.$O 3937dd7cddfSDavid du Colombier $LD -o $O.maketab maketab.$O 3943e12c5d1SDavid du Colombier.P2 3953e12c5d1SDavid du Colombier.SH 3963e12c5d1SDavid du ColombierMkmany 3973e12c5d1SDavid du Colombier.LP 3983e12c5d1SDavid du ColombierThe 3993e12c5d1SDavid du Colombier.CW mkmany 4003e12c5d1SDavid du Colombiergeneric mkfile builds several 4013e12c5d1SDavid du Colombierexecutables from the files in a 4023e12c5d1SDavid du Colombierdirectory. It differs from the operation of 4033e12c5d1SDavid du Colombier.CW mkone 4043e12c5d1SDavid du Colombierin three respects: 4053e12c5d1SDavid du Colombier.CW TARG 4063e12c5d1SDavid du Colombierspecifies the names of all executables, 4073e12c5d1SDavid du Colombierthere is no default command-line target, 4083e12c5d1SDavid du Colombierand additional rules allow a single executable to 4093e12c5d1SDavid du Colombierbe built or installed. 4103e12c5d1SDavid du Colombier.LP 4113e12c5d1SDavid du ColombierThe 4123e12c5d1SDavid du Colombier.CW TARG 4133e12c5d1SDavid du Colombiervariable specifies the names of all 4143e12c5d1SDavid du Colombierexecutables produced by the mkfile. The 4153e12c5d1SDavid du Colombierrules assume the name of each executable is also 4163e12c5d1SDavid du Colombierthe name of the file containing its 4173e12c5d1SDavid du Colombier.CW main 4183e12c5d1SDavid du Colombierfunction. 4193e12c5d1SDavid du Colombier.CW OFILES 4203e12c5d1SDavid du Colombierspecifies files containing 4213e12c5d1SDavid du Colombiercommon subroutines loaded with all executables. 4223e12c5d1SDavid du ColombierConsider the mkfile: 4233e12c5d1SDavid du Colombier.P1 4243e12c5d1SDavid du Colombier</$objtype/mkfile 4253e12c5d1SDavid du Colombier 4263e12c5d1SDavid du ColombierTARG=alpha beta 4273e12c5d1SDavid du ColombierOFILES=common.$O 4283e12c5d1SDavid du ColombierBIN=/$objtype/bin 4293e12c5d1SDavid du Colombier</sys/src/cmd/mkmany 4303e12c5d1SDavid du Colombier.P2 4313e12c5d1SDavid du ColombierIt assumes the main functions for executables 4323e12c5d1SDavid du Colombier.CW alpha 4333e12c5d1SDavid du Colombierand 4343e12c5d1SDavid du Colombier.CW beta 4353e12c5d1SDavid du Colombierare in files 4363e12c5d1SDavid du Colombier.CW alpha.$O 437219b2ee8SDavid du Colombierand 438219b2ee8SDavid du Colombier.CW beta.$O 439219b2ee8SDavid du Colombierand that both programs use the subroutines 4403e12c5d1SDavid du Colombierin file 4417dd7cddfSDavid du Colombier.CW common.$O . 4423e12c5d1SDavid du ColombierThe 4433e12c5d1SDavid du Colombier.CW all 4443e12c5d1SDavid du Colombiertarget builds all executables, leaving each in 4453e12c5d1SDavid du Colombiera file with a name of the form 4463e12c5d1SDavid du Colombier.CW $O.\fIprogname\fP 4473e12c5d1SDavid du Colombierwhere 4483e12c5d1SDavid du Colombier.I progname 4493e12c5d1SDavid du Colombieris the name of the executable. In this 4503e12c5d1SDavid du Colombierexample the 4513e12c5d1SDavid du Colombier.CW all 4523e12c5d1SDavid du Colombiertarget produces executables 4533e12c5d1SDavid du Colombier.CW $O.alpha 4543e12c5d1SDavid du Colombierand 4553e12c5d1SDavid du Colombier.CW $O.beta . 4563e12c5d1SDavid du Colombier.LP 4573e12c5d1SDavid du ColombierThe 4583e12c5d1SDavid du Colombier.CW mkmany 4593e12c5d1SDavid du Colombierrules provide additional 4603e12c5d1SDavid du Colombiertargets for building a single 4613e12c5d1SDavid du Colombierexecutable: 4623e12c5d1SDavid du Colombier.TS 463219b2ee8SDavid du Colombierlw(1i) lw(3.8i). 4643e12c5d1SDavid du Colombier\f(CW$O.progname\fP T{ 4653e12c5d1SDavid du ColombierBuilds executable 4663e12c5d1SDavid du Colombier\f(CW$O.\fP\fIprogname\fP 4673e12c5d1SDavid du Colombierin the current directory. When the target 4683e12c5d1SDavid du Colombierarchitecture is not the current architecture 4693e12c5d1SDavid du Colombierthe 4703e12c5d1SDavid du Colombier.CW mk 4713e12c5d1SDavid du Colombiercommand 4723e12c5d1SDavid du Colombiermust be prefixed with the customary 4733e12c5d1SDavid du Colombier.CW objtype=\fIarchitecture\fP 4743e12c5d1SDavid du Colombierassignment to select the proper compilers and loaders. 4753e12c5d1SDavid du ColombierT} 4763e12c5d1SDavid du Colombier\f(CWprogname.install\fP T{ 4773e12c5d1SDavid du ColombierInstalls executable 4783e12c5d1SDavid du Colombier.I progname 4793e12c5d1SDavid du Colombierfor the target architecture. 4803e12c5d1SDavid du ColombierT} 4813e12c5d1SDavid du Colombier\f(CWprogname.installall\fP T{ 4823e12c5d1SDavid du ColombierInstalls executable 4833e12c5d1SDavid du Colombier.I progname 4843e12c5d1SDavid du Colombierfor all architectures. 4853e12c5d1SDavid du ColombierT} 4863e12c5d1SDavid du Colombier.TE 4873e12c5d1SDavid du Colombier.SH 4883e12c5d1SDavid du ColombierMklib 4893e12c5d1SDavid du Colombier.LP 4903e12c5d1SDavid du ColombierThe 4913e12c5d1SDavid du Colombier.CW mklib 4923e12c5d1SDavid du Colombiergeneric mkfile builds a local library. 4933e12c5d1SDavid du ColombierSince this form of mkfile constructs no 4943e12c5d1SDavid du Colombierexecutable, the 4953e12c5d1SDavid du Colombier.CW TARG 4963e12c5d1SDavid du Colombierand 4973e12c5d1SDavid du Colombier.CW BIN 4983e12c5d1SDavid du Colombiervariables are not needed. Instead, the 4993e12c5d1SDavid du Colombier.CW LIB 5003e12c5d1SDavid du Colombiervariable specifies the library 5013e12c5d1SDavid du Colombierto be built or updated. Variable 5023e12c5d1SDavid du Colombier.CW OFILES 5033e12c5d1SDavid du Colombiercontains the names of the object files to be archived 5043e12c5d1SDavid du Colombierin the library. The use of variables 5053e12c5d1SDavid du Colombier.CW YFILES 5063e12c5d1SDavid du Colombierand 5073e12c5d1SDavid du Colombier.CW HFILES 5083e12c5d1SDavid du Colombierdoes not change. When possible, only the 5093e12c5d1SDavid du Colombierout-of-date members of the library are updated. 5103e12c5d1SDavid du Colombier.LP 5113e12c5d1SDavid du ColombierThe variable 512219b2ee8SDavid du Colombier.CW LIBDIR 5133e12c5d1SDavid du Colombiercontains the name of the directory where the 5143e12c5d1SDavid du Colombierlibrary is installed; by default it selects 5153e12c5d1SDavid du Colombierthe current directory. It can be overridden 5163e12c5d1SDavid du Colombierby assigning the new directory name after the 5173e12c5d1SDavid du Colombierpoint where 5183e12c5d1SDavid du Colombier.CW mklib 5193e12c5d1SDavid du Colombieris included. 5203e12c5d1SDavid du Colombier.LP 5213e12c5d1SDavid du ColombierThe 5223e12c5d1SDavid du Colombier.CW clean 5233e12c5d1SDavid du Colombiertarget removes object files and 5247dd7cddfSDavid du Colombier.CW yacc 5253e12c5d1SDavid du Colombierintermediate files but does not touch the 5263e12c5d1SDavid du Colombierlibrary. The 5273e12c5d1SDavid du Colombier.CW nuke 528219b2ee8SDavid du Colombiertarget removes the library as well as the 5293e12c5d1SDavid du Colombierfiles removed by the 5303e12c5d1SDavid du Colombier.CW clean 5313e12c5d1SDavid du Colombiertarget. The command 532*40ff8eeaSDavid du Colombier.P1 533*40ff8eeaSDavid du Colombiermk -s clean all 534*40ff8eeaSDavid du Colombier.P2 5353e12c5d1SDavid du Colombiercauses the existing library to be updated, or 5363e12c5d1SDavid du Colombiercreated if it doesn't already exist. The command 537*40ff8eeaSDavid du Colombier.P1 538*40ff8eeaSDavid du Colombiermk -s nuke all 539*40ff8eeaSDavid du Colombier.P2 5403e12c5d1SDavid du Colombierforces the library to be rebuilt from scratch. 541219b2ee8SDavid du Colombier.LP 5423e12c5d1SDavid du ColombierThe mkfile from 5433e12c5d1SDavid du Colombier.CW /sys/src/cmd/upas/libString 5443e12c5d1SDavid du Colombiercontains the following specifications to 5453e12c5d1SDavid du Colombierbuild the local library 5463e12c5d1SDavid du Colombier.CW libString.a$O 5473e12c5d1SDavid du Colombierfor the object architecture referenced by 5483e12c5d1SDavid du Colombier.CW $O\fR\:\fP 5493e12c5d1SDavid du Colombier.P1 5503e12c5d1SDavid du Colombier</$objtype/mkfile 5513e12c5d1SDavid du Colombier 5523e12c5d1SDavid du ColombierLIB=libString.a$O 5533e12c5d1SDavid du ColombierOFILES= s_alloc.$O\e 5543e12c5d1SDavid du Colombier s_append.$O\e 5553e12c5d1SDavid du Colombier s_array.$O\e 5563e12c5d1SDavid du Colombier s_copy.$O\e 5573e12c5d1SDavid du Colombier s_getline.$O\e 5583e12c5d1SDavid du Colombier s_grow.$O\e 5593e12c5d1SDavid du Colombier s_nappend.$O\e 5603e12c5d1SDavid du Colombier s_parse.$O\e 5613e12c5d1SDavid du Colombier s_read.$O\e 5623e12c5d1SDavid du Colombier s_read_line.$O\e 5633e12c5d1SDavid du Colombier s_tolower.$O\e 5643e12c5d1SDavid du Colombier 5653e12c5d1SDavid du Colombier</sys/src/cmd/mklib 5663e12c5d1SDavid du Colombier 5673e12c5d1SDavid du Colombiernuke:V: 5683e12c5d1SDavid du Colombier mk clean 569219b2ee8SDavid du Colombier rm -f libString.a[$OS] 5703e12c5d1SDavid du Colombier.P2 5713e12c5d1SDavid du ColombierThe override of the rule for target 5723e12c5d1SDavid du Colombier.CW nuke 5733e12c5d1SDavid du Colombierremoves the libraries for all architectures as 5743e12c5d1SDavid du Colombieropposed to the default recipe for this target 5753e12c5d1SDavid du Colombierwhich removes the library for the current architecture. 5763e12c5d1SDavid du Colombier.SH 5773e12c5d1SDavid du ColombierMksyslib 5783e12c5d1SDavid du Colombier.LP 5793e12c5d1SDavid du ColombierThe 5803e12c5d1SDavid du Colombier.CW mksyslib 5813e12c5d1SDavid du Colombiergeneric mkfile is similar to the 5823e12c5d1SDavid du Colombier.CW mklib 583219b2ee8SDavid du Colombiermkfile except that it operates on a system library 5843e12c5d1SDavid du Colombierinstead of a local library. 5853e12c5d1SDavid du ColombierThe 5863e12c5d1SDavid du Colombier.CW install 5873e12c5d1SDavid du Colombierand 5883e12c5d1SDavid du Colombier.CW all 5893e12c5d1SDavid du Colombiertargets are the same; since there is no local copy of 5903e12c5d1SDavid du Colombierthe library, all updates are performed on the 5913e12c5d1SDavid du Colombierinstalled library. 5923e12c5d1SDavid du ColombierThe rule for the 5933e12c5d1SDavid du Colombier.CW nuke 5943e12c5d1SDavid du Colombiertarget is identical to that of the 5953e12c5d1SDavid du Colombier.CW clean 5963e12c5d1SDavid du Colombiertarget; unlike the 5973e12c5d1SDavid du Colombier.CW nuke 5983e12c5d1SDavid du Colombiertarget for local libraries, 5993e12c5d1SDavid du Colombierthe library is never removed. 6003e12c5d1SDavid du Colombier.LP 6013e12c5d1SDavid du ColombierNo attempt is made to determine if individual library 6023e12c5d1SDavid du Colombiermembers are up-to-date; all members of a 6033e12c5d1SDavid du Colombierlibrary are always updated. 6043e12c5d1SDavid du ColombierSpecial targets support manipulation of a single 6053e12c5d1SDavid du Colombierobject file; the target 6063e12c5d1SDavid du Colombier.CW objfile 6073e12c5d1SDavid du Colombierupdates file 6083e12c5d1SDavid du Colombier.CW objfile\f(CW.$O\fP 6093e12c5d1SDavid du Colombierin the library of the current architecture and the target 6103e12c5d1SDavid du Colombier.CW objfile.all 6113e12c5d1SDavid du Colombierupdates 6123e12c5d1SDavid du Colombier.CW objfile\f(CW.$O\fP 6133e12c5d1SDavid du Colombierin the libraries of all architectures. 6143e12c5d1SDavid du Colombier.SH 6153e12c5d1SDavid du ColombierOverrides 6163e12c5d1SDavid du Colombier.LP 6173e12c5d1SDavid du ColombierThe rules provided by a generic mkfile or 6183e12c5d1SDavid du Colombierthe variables used to control the evaluation 6193e12c5d1SDavid du Colombierof those rules may be overridden in most 6203e12c5d1SDavid du Colombiercircumstances. Overrides 6213e12c5d1SDavid du Colombiermust be specified in the product mkfile 6223e12c5d1SDavid du Colombierafter the point where the generic 6233e12c5d1SDavid du Colombiermkfile is included; in general, variable 6243e12c5d1SDavid du Colombierand rule overrides occupy the end of a 6253e12c5d1SDavid du Colombierproduct mkfile. 6263e12c5d1SDavid du Colombier.LP 6273e12c5d1SDavid du ColombierThe value of a variable is overridden by 6283e12c5d1SDavid du Colombierassigning a new value to the variable. 6293e12c5d1SDavid du ColombierMost variable overrides modify the 6303e12c5d1SDavid du Colombiervalues of flags or the names of commands executed 6313e12c5d1SDavid du Colombierin recipes. For example, the default value of 6323e12c5d1SDavid du Colombier.CW CFLAGS 6333e12c5d1SDavid du Colombieris often overridden or augmented and 634219b2ee8SDavid du Colombierthe ANSI/POSIX Computing Environment is selected by 6353e12c5d1SDavid du Colombiersetting the 6363e12c5d1SDavid du Colombier.CW CC 6373e12c5d1SDavid du Colombierand 6383e12c5d1SDavid du Colombier.CW LD 6393e12c5d1SDavid du Colombiervariables to 6403e12c5d1SDavid du Colombier.CW pcc. 6413e12c5d1SDavid du Colombier.LP 6423e12c5d1SDavid du ColombierModifying rules is trickier than modifying 6433e12c5d1SDavid du Colombiervariables. Additional constraints can be added 644219b2ee8SDavid du Colombierto a rule by specifying the target and 6453e12c5d1SDavid du Colombierthe new prerequisite. For example, 6463e12c5d1SDavid du Colombier.P1 6473e12c5d1SDavid du Colombier%.$O: header.h 6483e12c5d1SDavid du Colombier.P2 6493e12c5d1SDavid du Colombieradds file 6503e12c5d1SDavid du Colombier.CW header.h 651219b2ee8SDavid du Colombierthe set of prerequisites for all object files. 6523e12c5d1SDavid du ColombierThere is no mechanism for adding additional 6533e12c5d1SDavid du Colombiercommands to an existing recipe; if a 6543e12c5d1SDavid du Colombierrecipe is unsatisfactory, the rule and its recipe 6553e12c5d1SDavid du Colombiermust be completely overridden. 6563e12c5d1SDavid du ColombierA rule is overridden only when the replacement rule 6573e12c5d1SDavid du Colombiermatches the target and prerequisite portions 6583e12c5d1SDavid du Colombierof the original rule exactly. The recipe 6593e12c5d1SDavid du Colombierassociated with the new rule 6603e12c5d1SDavid du Colombierthen replaces the recipe of the original rule. 6613e12c5d1SDavid du ColombierFor example, 6627dd7cddfSDavid du Colombier.CW /sys/src/cmd/lex/mkfile 6637dd7cddfSDavid du Colombieroverrides the default 6647dd7cddfSDavid du Colombier.CW installall 6657dd7cddfSDavid du Colombierrule to perform the normal loop on all 6667dd7cddfSDavid du Colombierarchitectures and then copy a prototype file 6677dd7cddfSDavid du Colombierto the system library directory. 6683e12c5d1SDavid du Colombier.P1 6693e12c5d1SDavid du Colombier</$objtype/mkfile 6703e12c5d1SDavid du Colombier 6717dd7cddfSDavid du ColombierTARG=lex 6727dd7cddfSDavid du ColombierOFILES=lmain.$O\e 6737dd7cddfSDavid du Colombier y.tab.$O\e 6747dd7cddfSDavid du Colombier sub1.$O\e 6757dd7cddfSDavid du Colombier sub2.$O\e 6767dd7cddfSDavid du Colombier header.$O\e 6773e12c5d1SDavid du Colombier 6787dd7cddfSDavid du ColombierHFILES=ldefs.h\e 6797dd7cddfSDavid du Colombier 6807dd7cddfSDavid du ColombierYFILES=parser.y\e 6817dd7cddfSDavid du Colombier 6827dd7cddfSDavid du ColombierBIN=/$objtype/bin 683219b2ee8SDavid du Colombier</sys/src/cmd/mkone 6843e12c5d1SDavid du Colombier 6857dd7cddfSDavid du Colombierinstallall:V: 6867dd7cddfSDavid du Colombier for(objtype in $CPUS) 6877dd7cddfSDavid du Colombier mk install 6887dd7cddfSDavid du Colombier cp ncform /sys/lib/lex 6897dd7cddfSDavid du Colombier.P2 6907dd7cddfSDavid du ColombierAnother way to perform the same override is to 6917dd7cddfSDavid du Colombieradd a dependency to the default 6927dd7cddfSDavid du Colombier.CW installall 6937dd7cddfSDavid du Colombierrule that executes an additional rule to 6947dd7cddfSDavid du Colombierinstall the prototype file: 6957dd7cddfSDavid du Colombier.P1 6967dd7cddfSDavid du Colombierinstallall:V: ncform.install 6973e12c5d1SDavid du Colombier 6987dd7cddfSDavid du Colombierncform.install:V: 6997dd7cddfSDavid du Colombier cp ncform /sys/lib/lex 7003e12c5d1SDavid du Colombier.P2 7013e12c5d1SDavid du Colombier.SH 7023e12c5d1SDavid du ColombierSpecial Tricks 7033e12c5d1SDavid du Colombier.LP 7043e12c5d1SDavid du ColombierTwo special cases 705219b2ee8SDavid du Colombierrequire extra deviousness. 7063e12c5d1SDavid du Colombier.LP 7073e12c5d1SDavid du ColombierIn the first, a file needed to build an 708219b2ee8SDavid du Colombierexecutable is generated by a program that, 7093e12c5d1SDavid du Colombierin turn, is built from a source file that 7103e12c5d1SDavid du Colombieris not part of the product. In this case, 7113e12c5d1SDavid du Colombierthe 7123e12c5d1SDavid du Colombierexecutable must be built for the 7133e12c5d1SDavid du Colombiertarget architecture, but the intermediate 7143e12c5d1SDavid du Colombierexecutable must be built for the architecture 7153e12c5d1SDavid du Colombier.CW mk 7163e12c5d1SDavid du Colombieris executing on. The intermediate executable 7173e12c5d1SDavid du Colombieris built by recursively invoking 7183e12c5d1SDavid du Colombier.CW mk 7193e12c5d1SDavid du Colombierwith the appropriate target and the 7203e12c5d1SDavid du Colombierexecuting architecture as the target 7213e12c5d1SDavid du Colombierarchitecture. When that 7223e12c5d1SDavid du Colombier.CW mk 7233e12c5d1SDavid du Colombiercompletes, the intermediate is 7243e12c5d1SDavid du Colombierexecuted to generate the source file to 7253e12c5d1SDavid du Colombiercomplete the build for the target architecture. 7267dd7cddfSDavid du ColombierThe earlier example of 7277dd7cddfSDavid du Colombier.CW /sys/src/cmd/awk/mkfile 7287dd7cddfSDavid du Colombierillustrates this technique. 7293e12c5d1SDavid du Colombier.LP 7303e12c5d1SDavid du ColombierAnother awkward situation 7313e12c5d1SDavid du Colombieroccurs when a directory contains 7323e12c5d1SDavid du Colombiersource to build an executable as 7333e12c5d1SDavid du Colombierwell as source for auxiliary executables 7343e12c5d1SDavid du Colombierthat are not to be installed. In this case 7353e12c5d1SDavid du Colombierthe 7363e12c5d1SDavid du Colombier.CW mkmany 7373e12c5d1SDavid du Colombiergeneric rules are inappropriate, because 7383e12c5d1SDavid du Colombierall executables would be built and installed. 739219b2ee8SDavid du ColombierInstead, use the 7403e12c5d1SDavid du Colombier.CW mkone 7413e12c5d1SDavid du Colombiergeneric file to build the primary executable 7423e12c5d1SDavid du Colombierand provide extra targets to 743219b2ee8SDavid du Colombierbuild the auxiliary files. This 7443e12c5d1SDavid du Colombierapproach is also useful when the auxiliary 7453e12c5d1SDavid du Colombierfiles are not executables; 7463e12c5d1SDavid du Colombier.CW /sys/src/cmd/spell/mkfile 747219b2ee8SDavid du Colombieraugments the default rules to build and install the 7483e12c5d1SDavid du Colombier.CW spell 7493e12c5d1SDavid du Colombierexecutable with 7503e12c5d1SDavid du Colombierelaborate rules to generate 7513e12c5d1SDavid du Colombierand maintain the auxiliary spelling lists. 752