Annotation of 43BSDReno/share/doc/ps1/12.make/make.ms, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.