From 46439007cf417cbd9ac8049bb4122c890097a0fa Mon Sep 17 00:00:00 2001 From: "Charles.Forsyth" Date: Fri, 22 Dec 2006 20:52:35 +0000 Subject: 20060303-partial --- doc/mk.ms | 1539 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1539 insertions(+) create mode 100644 doc/mk.ms (limited to 'doc/mk.ms') diff --git a/doc/mk.ms b/doc/mk.ms new file mode 100644 index 00000000..9245264f --- /dev/null +++ b/doc/mk.ms @@ -0,0 +1,1539 @@ +.TL +Maintaining Files on Plan 9 with Mk +.AU +Andrew G. Hume +andrew@research.att.com +Bob Flandrena +bobf@plan9.bell-labs.com +.AB +.PP +.CW Mk +is a tool +for describing and maintaining dependencies between +files. +It is similar to the +UNIX program +.CW make , +but provides several new capabilities. +.CW Mk\fR'\fPs +flexible rule specifications, implied +dependency derivation, and parallel +execution of maintenance actions are +well-suited to the Plan 9 environment. +Almost all Plan 9 maintenance procedures +are automated using +.CW mk . +.AE +.NH 1 +Introduction +.PP +.CW Mk +performs the same task as +.CW make +[Feld79] but is different in many ways. +This document describes +.CW mk\fR'\fPs +capabilities and discusses how they are +used in Plan 9. There are occasional references +to differences between +.CW mk +and +.CW make , +but +an appendix summarizes the details. +.PP +.CW Mk +works well in the Plan 9 environment. +It supports program construction +in a heterogeneous environment and +exploits the power of multiprocessors by executing +maintenance actions in parallel. +It interacts seamlessly with the Plan 9 command +interpreter +.CW rc +and accepts pattern-based dependency specifications +that are not limited to describing +rules for program construction. +The result is a tool that is flexible enough to +perform many maintenance tasks including +database maintenance, +hardware design, and document production. +.PP +This document begins by discussing +the syntax of the input file, +the pattern matching capabilities, and +the special rules for maintaining archives. +A brief description of +.CW mk\fR'\fPs +algorithm for deriving dependencies +is followed by a discussion +of the conventions used to resolve ambiguous +specifications. The final sections +describe parallel execution +and special features. +.PP +An earlier paper [Hume87] +provides a detailed discussion of +.CW mk\fR'\fPs +design. +.NH 1 +The \f(CWMkfile\fP +.PP +.CW Mk +reads a file describing relationships among files +and executes commands to bring the files up to date. +The specification file, called a +.CW mkfile , +contains three types of statements: +assignments, includes, and rules. +Assignment and include statements are similar +to those in C. +Rules specify dependencies between a +.I target +and its +.I prerequisites . +When the target and prerequisites are files, their +modification times determine if they +are out of date. Rules often contain a +.I recipe , +an +.I rc (1) +script that produces the target from +the prerequisites. +.PP +This simple +.CW mkfile +produces an executable +from a C source file: +.P1 +CC=pcc +f1: f1.c + $CC -o f1 f1.c +.P2 +The first line assigns the name of the portable ANSI/POSIX compiler +to the +.CW mk +variable +.CW CC ; +subsequent references of the form +.CW $CC +select this compiler. +The only rule specifies a dependence between the target file +.CW f1 +and the prerequisite file +.CW f1.c . +If the target does not exist or if the +prerequisite has been modified more recently than +the target, +.CW mk +passes the recipe to +.CW rc +for execution. Here, +.CW f1.c +is compiled and loaded to produce +.CW f1 . +.PP +The native Plan 9 environment +requires executables for +all architectures, not only the current one. +The Plan 9 version of the same +.CW mkfile +looks like: +.P1 + $target +.P2 +produces the message +.P1 +.CW "mk: pic mk.ms | ... : exit status=rc 685: deleting 'pic.out'" +.P2 +if any program in the recipe exits with an error status. +.NH 1 +Unspecified dependencies +.PP +The +.CW -w +command line flag forces the +files following the flag to be treated +as if they were just modified. +We can use this flag with a command that selects files +to force a build based on the selection criterion. +For example, if the declaration of +a global variable named +.I var +is changed in a header file, +all source files that reference +it can be rebuilt with the command +.P1 +$ mk -w`{grep -l \fIvar\fP *.[cyl]} +.P2 +.NH 1 +Conclusion +.PP +There are many programs related to +.CW make , +each choosing a different balance between +specialization and generality. +.CW Mk +emphasizes generality but allows +customization through its pattern specifications and +include facilities. +.PP +Plan 9 presents a difficult problem, particularly +because of its heterogeneous collection of +architectures and languages. +.CW Mk\fR'\fPs +flexible specification language and simple +interaction with +.CW rc +work well in this environment. +.PP +As a result, +Plan 9 relies on +.CW mk +to automate almost all maintenance. +Tasks as diverse as updating the +network data base, producing the manual, +or building a release are expressed as +.CW mk +procedures. +.NH 1 +References +.LP +[Cmel86] R. F. Cmelik, +``Concurrent Make: A Distributed Program in Concurrent C'', +AT&T Bell Laboratories Technical Report, 1986. +.LP +[Feld79] S. I. Feldman, +``Make \(em a program for maintaining computer programs'', +.I +Software Practice & Experience , +.R +1979 +Vol 9 #4, +pp. 255-266. +.LP +[Flan95] Bob Flandrena, +``Plan 9 Mkfiles'', +this volume. +.LP +[Hume87] A. G. Hume, +``Mk: A Successor to Make'', +.I +USENIX Summer Conf. Proc., +.R +Phoenix, Az. +.NH 1 +Appendix: Differences between +.CW make +and +.CW mk +.PP +The differences between +.CW mk +and +.CW make +are: +.IP \(bu 3n +.CW Make +builds targets when it needs them, allowing systematic use of side effects. +.CW Mk +constructs the entire dependency graph before building any target. +.IP \(bu +.CW Make +supports suffix rules and +.CW % +metarules. +.CW Mk +supports +.CW % +and regular expression metarules. +(Older versions of +.CW make +support only suffix rules.) +.IP \(bu +.CW Mk +performs transitive closure on metarules, +.CW make +does not. +.IP \(bu +.CW Make +supports cyclic dependencies, +.CW mk +does not. +.IP \(bu +.CW Make +evaluates recipes one line at a time, replacing variables by their values and +executing some commands internally. +.CW Mk +passes the entire recipe to the shell without +interpretation or internal execution. +.IP \(bu +.CW Make +supports parallel execution of single-line recipes when building +the prerequisites for specified targets. +.CW Mk +supports parallel execution of all recipes. +(Older versions of +.CW make +did not support parallel execution.) +.IP \(bu +.CW Make +uses special targets (beginning with a period) +to indicate special processing. +.CW Mk +uses attributes to modify rule evaluation. +.IP \(bu +.CW Mk +supports virtual +targets that are independent of the file system. +.IP \(bu +.CW Mk +allows non-standard out-of-date determination, +.CW make +does not. +.PP +It is usually easy to convert a +.CW makefile +to or from an equivalent +.CW mkfile . -- cgit v1.2.3