document for 4.3BSD release
[unix-history] / usr / src / old / make / PSD.doc / make.ms
CommitLineData
b08e5e52 1.\" @(#)make.ms 6.1 (Berkeley) %G%
05e56b41 2.\"
b08e5e52
KM
3.EH 'PS1:12-%''Make \(em A Program for Maintaining Computer Programs'
4.OH 'Make \(em A Program for Maintaining Computer Programs''PS1:12-%'
05e56b41 5.....TR 57
b08e5e52 6.\".RP
05e56b41
KM
7.de IT
8.if n .ul
9\&\\$3\f2\\$1\fR\^\&\\$2
10..
11.TL
12Make \(em A Program for Maintaining Computer Programs
13.AU
14S. I. Feldman
15.AI
16.MH
17.AB
18.PP
19In a programming project, it is easy to lose track of which files need
20to be reprocessed or recompiled after a change is made in some part of the source.
21.I Make
22provides a simple mechanism for maintaining up-to-date versions of programs that result
23from many operations on a number of files.
24It is possible to tell
25.I Make
26the sequence of commands that create certain files,
27and the list of files that require other files to be current before the operations can be done.
28Whenever a change is made in any part of the program,
29the
30.I Make
31command will create the proper files simply, correctly,
32and with a minimum amount of effort.
33.PP
34The basic operation of
35.I Make
36is to find the name of a needed target in the description, ensure that all of the files on which it depends exist and
37are up to date, and then create the target if it has not been modified since its generators were.
38The description file really defines the graph of dependencies;
39.I Make
40does a depth-first search of this graph
41to determine what work is really necessary.
42.PP
43.I Make
44also provides a simple macro substitution facility
45and the ability to encapsulate commands in a single file
46for convenient administration.
b08e5e52
KM
47.sp 2
48Revised April, 1986
05e56b41
KM
49.AE
50.SH
51Introduction
52.PP
53It is common practice to divide large programs into smaller, more manageable pieces.
54The pieces may require quite different treatments:
55some may need to be run through a macro processor, some may need to be processed by
56a sophisticated program generator (e.g., Yacc[1] or Lex[2]).
57The outputs of these generators may then have to be compiled with special options and with
58certain definitions and declarations.
59The code resulting from these transformations may then need to be loaded together with
60certain libraries under the control of special options.
61Related maintenance activities involve running complicated test scripts
62and installing validated modules.
63Unfortunately, it is very easy for a programmer to forget which files depend on which others,
64which files have been modified recently, and the exact sequence of operations
65needed to make or exercise a new version of the program.
66After a long editing session, one may easily lose track of which files have been changed
67and which object modules are still valid,
68since a change to a declaration can obsolete a dozen other files.
69Forgetting to compile a routine that has been changed or that uses changed declarations will result in
70a program that will not work, and a bug that can be very hard to track down.
71On the other hand, recompiling everything in sight just to be safe is very wasteful.
72.PP
73The program described in this report mechanizes many of the activities of program development
74and maintenance.
75If the information on inter-file dependences and command sequences is stored in a file, the simple command
76.DS
77make
78.DE
79is frequently sufficient to update the interesting files,
80regardless of the number that have been edited since the last ``make''.
81In most cases, the description file is easy to write and changes infrequently.
82It is usually easier to type the
83.IT make
84command than to issue even one of the needed operations, so the typical cycle of program development operations becomes
85.DS
86think \(em edit \(em \fImake\fR \(em test . . .
87.DE
88.PP
89.IT Make
90is most useful for medium-sized programming projects;
91it does not solve the problems of maintaining multiple source versions
92or of describing huge programs.
93.IT Make
94was designed for use on Unix, but a version runs on GCOS.
95.SH
96Basic Features
97.PP
98The basic operation of
99.IT make
100is to update a target file by ensuring
101that all of the files on which it depends exist and are up to date,
102then creating the target if it has not been modified since its dependents were.
103.IT Make
104does a depth-first search of the graph of dependences.
105The operation of the command depends on the ability to find the date and time
106that a file was last modified.
107.PP
108To illustrate, let us consider a simple example:
109A program named
110.IT prog
111is made by compiling and loading three C-language files
112.IT x.c ,
113.IT y.c ,
114and
115.IT z.c
116with the
117.IT lS
118library.
119By convention, the output of the C compilations will be found in files named
120.IT x.o ,
121.IT y.o ,
122and
123.IT z.o .
124Assume that the files
125.IT x.c
126and
127.IT y.c
128share some declarations in a file named
129.IT defs ,
130but that
131.IT z.c
132does not.
133That is,
134.IT x.c
135and
136.IT y.c
137have the line
138.DS
139#include "defs"
140.DE
141The following text describes the relationships and operations:
142.DS
143prog : x.o y.o z.o
144 cc x.o y.o z.o \-lS \-o prog
145.sp .5
146x.o y.o : defs
147.DE
148If this information were stored in a file named
149.IT makefile ,
150the command
151.DS
152make
153.DE
154would perform the operations needed to recreate
155.IT prog
156after any changes had been made to any of the four source files
157.IT x.c ,
158.IT y.c ,
159.IT z.c ,
160or
161.IT defs .
162.PP
163.IT Make
164operates using three sources of information:
165a user-supplied description file (as above),
166file names and ``last-modified'' times from the file system,
167and built-in rules to bridge some of the gaps.
168In our example, the first line says that
169.IT prog
170depends on three ``\fI.o\fR'' files.
171Once these object files are current, the second line describes how to load them to create
172.IT prog .
173The third line says that
174.IT x.o
175and
176.IT y.o
177depend on the file
178.IT defs .
179From the file system,
180.IT make
181discovers that there are three ``\fI.c\fR'' files corresponding to the needed ``\fI.o\fR'' files,
182and uses built-in information on how to generate an object from a source file
183(\fIi.e.,\fR issue a ``cc\ \-c'' command).
184.PP
185The following long-winded description file is equivalent to the one above, but
186takes no advantage of
187.IT make 's
188innate knowledge:
189.DS
190prog : x.o y.o z.o
191 cc x.o y.o z.o \-lS \-o prog
192.sp .3
193x.o : x.c defs
194 cc \-c x.c
195y.o : y.c defs
196 cc \-c y.c
197z.o : z.c
198 cc \-c z.c
199.DE
200.PP
201If none of the source or object files had changed since the last time
202.IT prog
203was made, all of the files would be current, and
204the command
205.DS
206make
207.DE
208would just announce this fact and stop.
209If, however, the
210.IT defs
211file had been edited,
212.IT x.c
213and
214.IT y.c
215(but not
216.IT z.c )
217would be recompiled, and then
218.IT prog
219would be created from the new ``\fI.o\fR'' files.
220If only the file
221.IT y.c
222had changed, only it would be recompiled, but it would still be necessary to reload
223.IT prog .
224.PP
225If no target name is given on the
226.IT make
227command line, the first target mentioned in the description is created;
228otherwise the specified targets are made.
229The command
230.DS
231make x.o
232.DE
233would recompile
234.IT x.o
235if
236.IT x.c
237or
238.IT defs
239had changed.
240.PP
241If the file exists after the commands are executed,
242its time of last modification is used in further decisions;
243otherwise the current time is used.
244It is often quite useful to include rules with mnemonic names and commands that do not
245actually produce a file with that name.
246These entries can take advantage of
247.IT make 's
248ability to generate files and substitute macros.
249Thus, an entry
250``save''
251might be included to copy a certain set of files, or an entry
252``cleanup''
253might be used to throw away unneeded intermediate files.
254In other cases one may maintain a zero-length file purely to keep track
255of the time at which certain actions were performed.
256This technique is useful for maintaining remote archives and listings.
257.PP
258.IT Make
259has a simple macro mechanism for substituting in dependency lines and command strings.
260Macros are defined by command arguments or description file lines with embedded equal signs.
261A macro is invoked by preceding the name by a dollar sign;
262macro names longer than one character must be parenthesized.
263The name of the macro is either the single character after the dollar sign or a name inside parentheses.
264The following are valid macro invocations:
265.DS
266$(CFLAGS)
267$2
268$(xy)
269$Z
270$(Z)
271.DE
272The last two invocations are identical.
273$$ is a dollar sign.
274All of these macros are assigned values during input, as shown below.
275Four special macros change values during the execution of the command:
276$\(**, $@, $?, and $<.
277They will be discussed later.
278The following fragment shows the use:
279.DS
280OBJECTS = x.o y.o z.o
281LIBES = \-lS
282prog: $(OBJECTS)
283 cc $(OBJECTS) $(LIBES) \-o prog
284 . . .
285.DE
286The command
287.DS
288make
289.DE
290loads the three object files with the
291.IT lS
292library. The command
293.DS
294make "LIBES= \-ll \-lS"
295.DE
296loads them with both the Lex (``\-ll'') and the Standard (``\-lS'') libraries,
297since macro definitions on the command line override definitions in the description.
298(It is necessary to quote arguments with embedded blanks in
299.UX
300commands.)
301.PP
302The following sections detail the form of description files and the command line,
303and discuss options and built-in rules in more detail.
304.SH
305Description Files and Substitutions
306.PP
307A description file contains three types of information:
308macro definitions,
309dependency information,
310and executable commands.
311There is also a comment convention:
312all characters after a sharp (#) are ignored, as is the sharp itself.
313Blank lines and lines beginning with a sharp are totally ignored.
314If a non-comment line is too long, it can be continued using a backslash.
315If the last character of a line is a backslash, the backslash, newline,
316and following blanks and tabs are replaced by a single blank.
317.PP
318A macro definition is a line containing an equal sign not preceded by a colon or a tab.
319The name (string of letters and digits) to the left of the equal sign
320(trailing blanks and tabs are stripped) is assigned the string of characters following the equal sign
321(leading blanks and tabs are stripped.)
322The following are valid macro definitions:
323.DS
3242 = xyz
325abc = \-ll \-ly \-lS
326LIBES =
327.DE
328The last definition assigns LIBES the null string.
329A macro that is never explicitly defined has the null string as value.
330Macro definitions may also appear on the
331.IT make
332command line (see below).
333.PP
334Other lines give information about target files.
335The general form of an entry is:
336.DS
337target1 [target2 . . .] :[:] [dependent1 . . .] [; commands] [# . . .]
338[\fI(tab)\fR commands] [# . . .]
339 . . .
340.DE
341Items inside brackets may be omitted.
342Targets and dependents are strings of letters, digits, periods, and slashes.
343(Shell metacharacters ``\(**'' and ``?'' are expanded.)
344A command is any string of characters not including a sharp (except in quotes)
345or newline.
346Commands may appear either after a semicolon on a dependency line
347or on lines beginning with a tab immediately following a dependency line.
348.PP
349A dependency line may have either a single or a double colon.
350A target name may appear on more than one dependency line, but all of those lines must be of the
351same (single or double colon) type.
352.IP 1.
353For the usual single-colon case,
354at most one of these dependency lines may have a command sequence associated with it.
355If the target is out of date with any of the dependents on any of the lines,
356and a command sequence is specified (even a null one following a semicolon or tab),
357it is executed; otherwise a default creation rule may be invoked.
358.IP 2.
359In the double-colon case, a command sequence may be associated with each dependency line;
360if the target is out of date with any of the files on a particular line, the associated
361commands are executed.
362A built-in rule may also be executed.
363This detailed form is of particular value in updating archive-type files.
364.PP
365If a target must be created, the sequence of commands is executed.
366Normally, each command line is printed and then
367passed to a separate invocation of the Shell after substituting for macros.
368(The printing is suppressed in silent mode or if the command line begins with an @ sign).
369.IT Make
370normally stops if any command signals an error by returning a non-zero error code.
371(Errors are ignored if the ``\-i'' flags has been specified on the
372.IT make
373command line,
374if the fake target name ``.IGNORE'' appears in the description file,
375or if the command string in the description file begins with a hyphen.
376Some
377.UX
378commands return meaningless status).
379Because each command line is passed to a separate invocation of the Shell,
380care must be taken with certain commands (e.g., \fIcd\fR and Shell control commands) that have meaning only
381within a single Shell process;
382the results are forgotten before the next line is executed.
383.PP
384Before issuing any command, certain macros are set.
385$@ is set to the name of the file to be ``made''.
386$? is set to the string of names that were found to be younger than the target.
387If the command was generated by an implicit rule (see below),
388$< is the name of the related file that caused the action, and
389$\(** is the prefix shared by the current and the dependent file names.
390.PP
391If a file must be made but there are no explicit commands or relevant
392built-in rules,
393the commands associated with the name ``.DEFAULT'' are used.
394If there is no such name,
395.IT make
396prints a message and stops.
397.SH
398Command Usage
399.PP
400The
401.IT make
402command takes four kinds of arguments:
403macro definitions, flags, description file names, and target file names.
404.DS
405make [ flags ] [ macro definitions ] [ targets ]
406.DE
407The following summary of the operation of the command explains how these arguments are interpreted.
408.PP
409First, all macro definition arguments (arguments with embedded equal signs) are analyzed
410and the assignments made.
411Command-line macros override corresponding definitions found in the description files.
412.PP
413Next, the flag arguments are examined.
414The permissible flags are
415.IP \-i
416Ignore error codes returned by invoked commands.
417This mode is entered if the fake target name ``.IGNORE'' appears in the description file.
418.IP \-s
419Silent mode. Do not print command lines before executing.
420This mode is also entered if the fake target name ``.SILENT'' appears in the description file.
421.IP \-r
422Do not use the built-in rules.
423.IP \-n
424No execute mode. Print commands, but do not execute them.
425Even lines beginning with an ``@'' sign are printed.
426.IP \-t
427Touch the target files (causing them to be up to date) rather than issue the usual commands.
428.IP \-q
429Question.
430The
431.IT make
432command returns a zero or non-zero status code depending on whether the target file
433is or is not up to date.
434.IP \-p
435Print out the complete set of macro definitions and target descriptions
436.IP \-d
437Debug mode. Print out detailed information on files and times examined.
438.IP \-f
439Description file name. The next argument is assumed to be the name of a description file.
440A file name of ``\-'' denotes the standard input.
441If there are no ``\-f\|'' arguments, the file named
442.IT makefile
443or
444.IT Makefile
445in the current directory is read.
446The contents of the description files override the built-in rules if they are present).
447.PP
448Finally, the remaining arguments are assumed to be the names of targets to be made;
449they are done in left to right order.
450If there are no such arguments, the first name in the description files that does not
451begin with a period is ``made''.
452.SH
453Implicit Rules
454.PP
455The
456.ul
457make
458program uses a table of interesting suffixes and a set
459of transformation rules to supply default dependency
460information and implied commands.
461(The Appendix describes these tables and means of overriding
462them.)
463The default suffix list is:
464.KS
465.sp
466.nf
467.ta 0.5i 1.5i
468 \fI.o\fR Object file
469 \fI.c\fR C source file
470 \fI.e\fR Efl source file
471 \fI.r\fR Ratfor source file
472 \fI.f\fR Fortran source file
473 \fI.s\fR Assembler source file
474 \fI.y\fR Yacc-C source grammar
475 \fI.yr\fR Yacc-Ratfor source grammar
476 \fI.ye\fR Yacc-Efl source grammar
477 \fI.l\fR Lex source grammar
478.fi
479.sp
480.KE
481The following diagram summarizes the default transformation paths.
482If there are two paths connecting a pair of suffixes, the longer
483one is used only if the intermediate file exists or is
484named in the description.
485.KS
486.sp
487.ft I
488.ta 2i
489 .o
490.sp 2
491.ta 0.75i 1.25i 1.6i 2.1i
492 .c .r .e .f .s .y .yr .ye .l .d
493.sp 2
494.ta 0.6i 1.25i 1.6i
495 .y .l .yr .ye
496.ft R
497.sp
498.KE
499.PP
500If the file
501.ul
502x.o
503were needed and there were an
504.ul
505x.c
506in the description or directory, it would be compiled.
507If there were also an
508.IT x.l ,
509that grammar would be run through Lex before compiling the result.
510However, if there were no
511.ul
512x.c
513but there were an
514.IT x.l ,
515.IT make
516would discard the intermediate C-language file and use the
517direct link in the graph above.
518.PP
519It is possible to change the names of some of the compilers used in the
520default, or the flag arguments with which they are invoked by knowing
521the macro names used.
522The compiler names are the macros AS, CC, RC, EC, YACC, YACCR, YACCE, and LEX.
523The command
524.DS
525make CC=newcc
526.DE
527will cause the ``newcc'' command to be used instead of the
528usual C compiler.
529The macros CFLAGS, RFLAGS, EFLAGS, YFLAGS, and LFLAGS may be set to
530cause these commands to be issued with optional flags.
531Thus,
532.DS
533make "CFLAGS=\|\(miO"
534.DE
535causes the optimizing C compiler to be used.
b08e5e52
KM
536.PP
537Another special macro is `VPATH'.
538The ``VPATH'' macro should be set to a list of directories separated by colons.
539When
540.I make
541searches for a file as a result of a dependency relation, it will
542first search the current directory and then each of the directories on the
543``VPATH'' list.
544If the file is found, the actual path to the file will be used, rather than
545just the filename.
546If ``VPATH'' is not defined, then only the current directory is searched.
547Note that ``VPATH'' is intended to act like the System V ``VPATH'' support,
548but there is no guarantee that it functions identically.
549.PP
550One use for ``VPATH'' is when one has several programs that compile from the
551same source.
552The source can be kept in one directory and each set of
553object files (along with a separate
554.IR makefile )
555would be in a separate subdirectory.
556The ``VPATH'' macro would point to the source directory in this case.
05e56b41
KM
557.SH
558Example
559.PP
560As an example of the use of
561.ul
562make,
563we will present the description file used to maintain
564the
565.ul
566make
567command itself.
568The code for
569.ul
570make
571is spread over a number of C source files and a Yacc grammar.
572The description file contains:
573.DS
574# Description file for the Make command
575.sp .3
576P = und \-3 | opr \-r2 # send to GCOS to be printed
577FILES = Makefile version.c defs main.c doname.c misc.c files.c dosys.c\
578 gram.y lex.c gcos.c
579OBJECTS = version.o main.o doname.o misc.o files.o dosys.o gram.o
580LIBES= \-lS
581LINT = lint \-p
582CFLAGS = \-O
583.sp .3
584make: $(OBJECTS)
585 cc $(CFLAGS) $(OBJECTS) $(LIBES) \-o make
586 size make
587.sp .3
588$(OBJECTS): defs
589gram.o: lex.c
590.sp .3
591cleanup:
592 -rm *.o gram.c
593 -du
594.sp .3
595install:
596 @size make /usr/bin/make
597 cp make /usr/bin/make ; rm make
598.sp .3
599print: $(FILES) # print recently changed files
600 pr $? | $P
601 touch print
602.sp .3
603test:
604 make \-dp | grep \-v TIME >1zap
605 /usr/bin/make \-dp | grep \-v TIME >2zap
606 diff 1zap 2zap
607 rm 1zap 2zap
608.sp .3
609lint : dosys.c doname.c files.c main.c misc.c version.c gram.c
610 $(LINT) dosys.c doname.c files.c main.c misc.c version.c gram.c
611 rm gram.c
612.sp .3
613arch:
614 ar uv /sys/source/s2/make.a $(FILES)
615.DE
616.IT Make
617usually prints out each command before issuing it.
618The following output results from typing the simple command
619.DS
620make
621.DE
622in a directory containing only the source and description file:
623.DS
624 cc \-c version.c
625 cc \-c main.c
626 cc \-c doname.c
627 cc \-c misc.c
628 cc \-c files.c
629 cc \-c dosys.c
630 yacc gram.y
631 mv y.tab.c gram.c
632 cc \-c gram.c
633 cc version.o main.o doname.o misc.o files.o dosys.o gram.o \-lS \-o make
634 13188+3348+3044 = 19580b = 046174b
635.DE
636Although none of the source files or grammars were mentioned
637by name in the description file,
638.IT make
639found them using its suffix rules and issued the needed commands.
640The string of digits results from the ``size make''
641command; the printing of the command line itself was
642suppressed by an @ sign.
643The @ sign on the
644.IT size
645command in the description file suppressed the printing of the command,
646so only the sizes are written.
647.PP
648The last few entries in the description file are useful maintenance sequences.
649The ``print'' entry prints only the files that have been changed since the last
650``make print'' command.
651A zero-length file
652.IT print
653is maintained to keep track of the time of the printing;
654the $? macro in the command line then picks up only the names of the files
655changed since
656.IT print
657was touched.
658The printed output can be sent to a different printer or to a file by changing the definition of the
659.IT P
660macro:
661.DS
662make print "P = opr \-sp"
663 \fIor\fR
664make print "P= cat >zap"
665.DE
666.SH
667Suggestions and Warnings
668.PP
669The most common difficulties arise from
670.IT make 's
671specific meaning of dependency.
672If file
673.IT x.c
674has a ``#include "defs"''
675line, then the object file
676.IT x.o
677depends on
678.IT defs ;
679the source file
680.IT x.c
681does not.
682(If
683.IT defs
684is changed, it is not necessary to do anything
685to the file
686.IT x.c ,
687while it is necessary to recreate
688.IT x.o .)
689.PP
690To discover what
691.IT make
692would do, the ``\-n'' option is very useful.
693The command
694.DS
695make \-n
696.DE
697orders
698.IT make
699to print out the commands it would issue without actually taking the time to execute them.
700If a change to a file is absolutely certain to be benign
701(e.g., adding a new definition to an include file),
702the ``\-t'' (touch) option
703can save a lot of time:
704instead of issuing a large number of superfluous recompilations,
705.IT make
706updates the modification times on the affected file.
707Thus, the command
708.DS
709make \-ts
710.DE
711(``touch silently'') causes the relevant files to appear up to date.
712Obvious care is necessary, since this mode of operation subverts
713the intention of
714.IT make
715and destroys all memory of the previous relationships.
716.PP
717The debugging flag (``\-d'') causes
718.IT make
719to print out a very detailed description of what it is doing, including the
720file times. The output is verbose, and recommended only as a last resort.
721.SH
722Acknowledgments
723.PP
724I would like to thank S. C. Johnson for suggesting this approach
725to program maintenance control.
726I would like to thank S. C. Johnson and H. Gajewska for being
727the prime guinea pigs during development of
728.IT make .
729.SH
730References
731.IP 1.
732S. C. Johnson,
733``Yacc \(em Yet Another Compiler-Compiler'',
734Bell Laboratories
735Computing Science Technical Report #32,
736July 1978.
737.IP 2.
738M. E. Lesk,
739``Lex \(em A Lexical Analyzer Generator'',
740Computing Science Technical Report #39,
741October 1975.
742.bp
743.SH
744Appendix. Suffixes and Transformation Rules
745.PP
746The
747.ul
748make
749program itself does not know what file name suffixes are interesting
750or how to transform a file with one suffix into a file with another
751suffix.
752This information is stored in an internal table that has the form of a description file.
753If the ``\-r'' flag is used, this table is not used.
754.PP
755The list of suffixes is actually the dependency list for the name
756``.SUFFIXES'';
757.ul
758make
759looks for a file with any of the suffixes on the list.
760If such a file exists, and if there is a transformation
761rule for that combination,
762.ul
763make
764acts as described earlier.
765The transformation rule names are the concatenation of the
766two suffixes.
767The name of the rule to transform a ``\fI.r\fR'' file to a ``\fI.o\fR'' file
768is thus ``\fI.r.o\fR''.
769If the rule is present and no explicit command sequence
770has been given in the user's description files, the command
771sequence for the rule ``.r.o'' is used.
772If a command is generated by using one of these suffixing rules,
773the macro $\(** is given the value of the stem
774(everything but the suffix) of the name of the file to be made,
775and the macro $< is the name of the dependent that caused the action.
776.PP
777The order of the suffix list is significant, since it is scanned from
778left to right, and the first name that is formed that has both a file
779and a rule associated with it is used.
780If new names are to be appended, the user can just add an entry for
781``.SUFFIXES'' in his own description file; the dependents will be added to the usual list.
782A ``.SUFFIXES'' line without any dependents deletes the current list.
783(It is necessary to clear the current list if the order of names is to be changed).
784.PP
785The following is an excerpt from the default rules file:
786.DS
787.ta .5i 1i
788 .SUFFIXES : .o .c .e .r .f .y .yr .ye .l .s
789 YACC=yacc
790 YACCR=yacc \-r
791 YACCE=yacc \-e
792 YFLAGS=
793 LEX=lex
794 LFLAGS=
795 CC=cc
796 AS=as \-
797 CFLAGS=
798 RC=ec
799 RFLAGS=
800 EC=ec
801 EFLAGS=
802 FFLAGS=
803 .c.o :
804 $(CC) $(CFLAGS) \-c $<
805 .e.o .r.o .f.o :
806 $(EC) $(RFLAGS) $(EFLAGS) $(FFLAGS) \-c $<
807 .s.o :
808 $(AS) \-o $@ $<
809 .y.o :
810 $(YACC) $(YFLAGS) $<
811 $(CC) $(CFLAGS) \-c y.tab.c
812 rm y.tab.c
813 mv y.tab.o $@
814 .y.c :
815 $(YACC) $(YFLAGS) $<
816 mv y.tab.c $@
817.DE