xref: /plan9/sys/doc/mkfiles.ms (revision 40ff8eea1c5efc4eea846772b837af5b364baa56)
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