home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume19 / dmake / part18 < prev    next >
Encoding:
Text File  |  1991-05-11  |  40.2 KB  |  1,135 lines

  1. Newsgroups: comp.sources.misc
  2. From: Dennis Vadura <dvadura@watdragon.waterloo.edu>
  3. Subject:  v19i039:  dmake - dmake version 3.7, Part18/37
  4. Message-ID: <1991May12.002030.9371@sparky.IMD.Sterling.COM>
  5. X-Md4-Signature: ab77b86c09a8ee945be84a5894fe2537
  6. Date: Sun, 12 May 1991 00:20:30 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: Dennis Vadura <dvadura@watdragon.waterloo.edu>
  10. Posting-number: Volume 19, Issue 39
  11. Archive-name: dmake/part18
  12. Supersedes: dmake-3.6: Volume 15, Issue 52-77
  13.  
  14. ---- Cut Here and feed the following to sh ----
  15. #!/bin/sh
  16. # this is dmake.shar.18 (part 18 of a multipart archive)
  17. # do not concatenate these parts, unpack them in order with /bin/sh
  18. # file dmake/man/dmake.p continued
  19. #
  20. if test ! -r _shar_seq_.tmp; then
  21.     echo 'Please unpack part 1 first!'
  22.     exit 1
  23. fi
  24. (read Scheck
  25.  if test "$Scheck" != 18; then
  26.     echo Please unpack part "$Scheck" next!
  27.     exit 1
  28.  else
  29.     exit 0
  30.  fi
  31. ) < _shar_seq_.tmp || exit 1
  32. if test -f _shar_wnt_.tmp; then
  33. sed 's/^X//' << 'SHAR_EOF' >> 'dmake/man/dmake.p' &&
  34. X
  35. X     When a regular recipe is invoked ddmmaakkee executes each line of
  36. X     the recipe separately using a new copy of a shell if a shell
  37. X     is required.  Thus effects of commands do not generally per-
  38. X     sist across recipe lines.  (e.g. cd requests in a recipe
  39. X     line do not carry over to the next recipe line) The decision
  40. X     on whether a shell is required to execute a command is based
  41. X     on the value of the macro SHELLMETAS or on the specification
  42. X     of '+' or .USESHELL for the current recipe or target respec-
  43. X     tively.  If any character in the value of SHELLMETAS is
  44. X     found in the expanded recipe text-line or the use of a shell
  45. X     is requested explicitly via '+' or .USESHELL then the com-
  46. X     mand is executed using a shell, otherwise the command is
  47. X
  48. X
  49. X
  50. Version 3.70                    UW                             39
  51. X
  52. X
  53. X
  54. X
  55. DMAKE(p)             Unsupported Free Software            DMAKE(p)
  56. X
  57. X
  58. X
  59. X     executed directly.  The shell that is used for execution is
  60. X     given by the value of the macro SHELL.  The flags that are
  61. X     passed to the shell are given by the value of SHELLFLAGS.
  62. X     Thus ddmmaakkee constructs the command line:
  63. X
  64. X          $(SHELL) $(SHELLFLAGS) $(expanded_recipe_command)
  65. X
  66. X     Normally ddmmaakkee writes the command line that it is about to
  67. X     invoke to standard output.  If the .SILENT attribute is set
  68. X     for the target or for the recipe line (via @), then the
  69. X     recipe line is not echoed.
  70. X
  71. X     Group recipe processing is similar to that of regular
  72. X     recipes, except that a shell is always invoked.  The shell
  73. X     that is invoked is given by the value of the macro GROUP-
  74. X     SHELL, and its flags are taken from the value of the macro
  75. X     GROUPFLAGS.  If a target has the .PROLOG attribute set then
  76. X     ddmmaakkee prepends to the shell script the recipe associated
  77. X     with the special target .GROUPPROLOG, and if the attribute
  78. X     .EPILOG is set as well, then the recipe associated with the
  79. X     special target .GROUPEPILOG is appended to the script file.
  80. X     This facility can be used to always prepend a common header
  81. X     and common trailer to group recipes.  Group recipes are
  82. X     echoed to standard output just like standard recipes, but
  83. X     are enclosed by lines beginning with [ and ].
  84. X
  85. X     The recipe flags [+,-,%,@] are recognized at the start of a
  86. X     recipe line even if they appear in a macro.  For example:
  87. X
  88. X          SH = +
  89. X          all:
  90. X               $(SH)echo hi
  91. X
  92. X     is completely equivalent to writing
  93. X
  94. X          SH = +
  95. X          all:
  96. X               +echo hi
  97. X
  98. X
  99. X     The last step performed by ddmmaakkee prior to running a recipe
  100. X     is to set the macro CMNDNAME to the name of the command to
  101. X     execute (determined by finding the first white-space ending
  102. X     token in the command line).  It then sets the macro CMNDARGS
  103. X     to be the remainder of the line.  ddmmaakkee then expands the
  104. X     macro COMMAND which by default is set to
  105. X
  106. X          COMMAND = $(CMNDNAME) $(CMNDARGS)
  107. X
  108. X     The result of this final expansion is the command that will
  109. X     be executed.  The reason for this expansion is to allow for
  110. X     a different interface to the argument passing facilities
  111. X
  112. X
  113. X
  114. Version 3.70                    UW                             40
  115. X
  116. X
  117. X
  118. X
  119. DMAKE(p)             Unsupported Free Software            DMAKE(p)
  120. X
  121. X
  122. X
  123. X     (esp. under DOS) than that provided by ddmmaakkee. You can for
  124. X     example define COMMAND to be
  125. X
  126. X          COMMAND = $(CMNDNAME) @$(mktmp $(CMNDARGS))
  127. X
  128. X     which dumps the arguments into a temporary file and runs the
  129. X     command
  130. X
  131. X          $(CMNDNAME) @/tmp/ASAD23043
  132. X
  133. X     which has a much shorter argument list.  It is now up to the
  134. X     command to use the supplied argument as the source for all
  135. X     other arguments.  As an optimization, if COMMAND is not
  136. X     defined ddmmaakkee does not perform the above expansion.  On sys-
  137. X     tems, such as UNIX, that handle long command lines this pro-
  138. X     vides a slight saving in processing the makefiles.
  139. X
  140. MMAAKKIINNGG LLIIBBRRAARRIIEESS
  141. X     Libraries are easy to maintain using ddmmaakkee.  A library is a
  142. X     file containing a collection of object files.  Thus to make
  143. X     a library you simply specify it as a target with the
  144. X     .LIBRARY attribute set and specify its list of prere-
  145. X     quisites.  The prerequisites should be the object members
  146. X     that are to go into the library.  When ddmmaakkee makes the
  147. X     library target it uses the .LIBRARY attribute to pass to the
  148. X     prerequisites the .LIBMEMBER attribute and the name of the
  149. X     library.  This enables the file binding mechanism to look
  150. X     for the member in the library if an appropriate object file
  151. X     cannot be found. A small example best illustrates this.
  152. X
  153. X          mylib.a .LIBRARY : mem1.o mem2.o mem3.o
  154. X               rules for making library...
  155. X               # remember to remove .o's when lib is made
  156. X
  157. X          # equivalent to:  '%.o : %.c ; ...'
  158. X          .c.o :; rules for making .o from .c say
  159. X
  160. X     ddmmaakkee will use the .c.o rule for making the library members
  161. X     if appropriate .c files can be found using the search rules.
  162. X     NOTE:  this is not specific in any way to C programs, they
  163. X     are simply used as an example.
  164. X
  165. X     ddmmaakkee tries to handle the old library construct format in a
  166. X     sensible way.  The construct _l_i_b_(_m_e_m_b_e_r_._o_) is separated and
  167. X     the _l_i_b portion is declared as a library target.  The new
  168. X     target is defined with the .LIBRARY attribute set and the
  169. X     _m_e_m_b_e_r_._o portion of the construct is declared as a prere-
  170. X     quisite of the lib target.  If the construct _l_i_b_(_m_e_m_b_e_r_._o_)
  171. X     appears as a prerequisite of a target in the makefile, that
  172. X     target has the new name of the lib assigned as its prere-
  173. X     quisite.  Thus the following example:
  174. X
  175. X
  176. X
  177. X
  178. Version 3.70                    UW                             41
  179. X
  180. X
  181. X
  182. X
  183. DMAKE(p)             Unsupported Free Software            DMAKE(p)
  184. X
  185. X
  186. X
  187. X          a.out : ml.a(a.o) ml.a(b.o); $(CC) -o $@  $<
  188. X
  189. X          .c.o :; $(CC) -c $(CFLAGS) -o $@  $<
  190. X          %.a:
  191. X               ar rv $@ $<
  192. X               ranlib $@
  193. X               rm -rf $<
  194. X
  195. X     constructs the following dependency graph.
  196. X
  197. X          a.out : ml.a; $(CC) -o $@  $<
  198. X          ml.a .LIBRARY : a.o b.o
  199. X
  200. X          %.o : %.c ; $(CC) -c $(CFLAGS) -o $@  $<
  201. X          %.a :
  202. X               ar rv $@ $<
  203. X               ranlib $@
  204. X               rm -rf $<
  205. X
  206. X     and making a.out then works as expected.
  207. X
  208. X     The same thing happens for any target of the form
  209. X     _l_i_b_(_(_e_n_t_r_y_)_).  These targets have an additional feature in
  210. X     that the _e_n_t_r_y target has the .SYMBOL attribute set automat-
  211. X     ically.
  212. X
  213. X     NOTE:  If the notion of entry points is supported by the
  214. X     archive and by ddmmaakkee (currently not the case) then ddmmaakkee
  215. X     will search the archive for the entry point and return not
  216. X     only the modification time of the member which defines the
  217. X     entry but also the name of the member file.  This name will
  218. X     then replace _e_n_t_r_y and will be used for making the member
  219. X     file.  Once bound to an archive member the .SYMBOL attribute
  220. X     is removed from the target.  This feature is presently dis-
  221. X     abled as there is little standardization among archive for-
  222. X     mats, and we have yet to find a makefile utilizing this
  223. X     feature (possibly due to the fact that it is unimplemented
  224. X     in most versions of UNIX Make).
  225. X
  226. X     Finally, when ddmmaakkee looks for a library member it must first
  227. X     locate the library file.  It does so by first looking for
  228. X     the library relative to the current directory and if it is
  229. X     not found it then looks relative to the current value of
  230. X     $(TMD).  This allows commonly used libraries to be kept near
  231. X     the root of a source tree and to be easily found by ddmmaakkee.
  232. X
  233. KKEEEEPP SSTTAATTEE
  234. X     ddmmaakkee supports the keeping of state information for targets
  235. X     that it makes whenever the macro .KEEP_STATE is assigned a
  236. X     value.  The value of the macro should be the name of a state
  237. X     file that will contain the state information.  If state
  238. X     keeping is enabled then each target that does not poses the
  239. X
  240. X
  241. X
  242. Version 3.70                    UW                             42
  243. X
  244. X
  245. X
  246. X
  247. DMAKE(p)             Unsupported Free Software            DMAKE(p)
  248. X
  249. X
  250. X
  251. X     .NOSTATE attribute will have a record written into the state
  252. X     file indicating the target's name, the current directory,
  253. X     the command used to update the target, and which, if any, ::
  254. X     rule is being used.  When you make this target again if any
  255. X     of this information does not match the previous settings and
  256. X     the target is not out dated it will still be re-made.  The
  257. X     assumption is that one of the conditions above has changed
  258. X     and that we wish to remake the target.  For example, state
  259. X     keeping is used in the maintenance of ddmmaakkee to test compile
  260. X     different versions of the source using different compilers.
  261. X     Changing the compiler causes the compilation flags to be
  262. X     modified and hence all sources to be recompiled.
  263. X
  264. X     The state file is an ascii file and is portable, however it
  265. X     is not in human readable form as the entries represent hash
  266. X     keys of the above information.
  267. X
  268. X     The Sun Microsystem's Make construct
  269. X
  270. X          .KEEP_STATE :
  271. X
  272. X     is recognized and is mapped to ..KKEEEEPP__SSTTAATTEE::==__ssttaattee..mmkk.  The
  273. X     ddmmaakkee version of state keeping does not include scanning C
  274. X     source files for dependencies like Sun Make.  This is
  275. X     specific to C programs and it was felt that it does not
  276. X     belong in make.  ddmmaakkee instead provides the tool, ccddeeppeenndd,
  277. X     to scan C source files and to produce depedency information.
  278. X     Users are free to modify cdepend to produce other dependency
  279. X     files.  (NOTE: ccddeeppeenndd does not come with the distribution
  280. X     at this time, but will be available in a patch in the near
  281. X     future)
  282. X
  283. MMUULLTTII PPRROOCCEESSSSIINNGG
  284. X     If the architecture supports it then ddmmaakkee is capable of
  285. X     making a target's prerequisites in parallel.  ddmmaakkee will
  286. X     make as much in parallel as it can and use a number of child
  287. X     processes up to the maximum specified by MAXPROCESS or by
  288. X     the value supplied to the -P command line flag.  A parallel
  289. X     make is enabled by setting the value of MAXPROCESS (either
  290. X     directly or via -P option) to a value which is > 1.  ddmmaakkee
  291. X     guarantees that all dependencies as specified in the
  292. X     makefile are honored.  A target will not be made until all
  293. X     of its prerequisites have been made.  If a parallel make is
  294. X     being performed then the following restrictions on parallel-
  295. X     ism are enforced.
  296. X
  297. X          1.   Individual recipe lines in a non-group recipe are
  298. X               performed sequentially in the order in which they
  299. X               are specified within the makefile and in parallel
  300. X               with the recipes of other targets.
  301. X
  302. X
  303. X
  304. X
  305. X
  306. Version 3.70                    UW                             43
  307. X
  308. X
  309. X
  310. X
  311. DMAKE(p)             Unsupported Free Software            DMAKE(p)
  312. X
  313. X
  314. X
  315. X          2.   If a target contains multiple recipe definitions
  316. X               (cf. :: rules) then these are performed sequen-
  317. X               tially in the order in which the :: rules are
  318. X               specified within the makefile and in parallel with
  319. X               the recipes of other targets.
  320. X
  321. X          3.   If a target rule contains the `!' modifier, then
  322. X               the recipe is performed sequentially for the list
  323. X               of outdated prerequisites and in parallel with the
  324. X               recipes of other targets.
  325. X
  326. X          4.   If a target has the .SEQUENTIAL attribute set then
  327. X               all of its prerequisites are made sequentially
  328. X               relative to one another (as if MAXPROCESS=1), but
  329. X               in parallel with other targets in the makefile.
  330. X
  331. X     Note:  If you specify a parallel make then the order of tar-
  332. X     get update and the order in which the associated recipes are
  333. X     invoked will not correspond to that displayed by the -n
  334. X     flag.
  335. X
  336. CCOONNDDIITTIIOONNAALLSS
  337. X     ddmmaakkee supports a makefile construct called a _c_o_n_d_i_t_i_o_n_a_l.
  338. X     It allows the user to conditionally select portions of
  339. X     makefile text for input processing and to discard other por-
  340. X     tions.  This becomes useful for writing makefiles that are
  341. X     intended to function for more than one target host and
  342. X     environment.  The conditional expression is specified as
  343. X     follows:
  344. X
  345. X          .IF  _e_x_p_r_e_s_s_i_o_n
  346. X             ... if text ...
  347. X          .ELIF  _e_x_p_r_e_s_s_i_o_n
  348. X             ... if text ...
  349. X          .ELSE
  350. X             ... else text ...
  351. X          .END
  352. X
  353. X     The .ELSE and .ELIF portions are optional, and the condi-
  354. X     tionals may be nested (ie.  the text may contain another
  355. X     conditional).  .IF, .ELSE, and .END may appear anywhere in
  356. X     the makefile, but a single conditional expression may not
  357. X     span multiple makefiles.
  358. X
  359. X     _e_x_p_r_e_s_s_i_o_n can be one of the following three forms:
  360. X
  361. X          <text> | <text> == <text> | <text> != <text>
  362. X
  363. X     where _t_e_x_t is either text or a macro expression.  In any
  364. X     case, before the comparison is made, the expression is
  365. X     expanded.  The text portions are then selected and compared.
  366. X     White space at the start and end of the text portion is
  367. X
  368. X
  369. X
  370. Version 3.70                    UW                             44
  371. X
  372. X
  373. X
  374. X
  375. DMAKE(p)             Unsupported Free Software            DMAKE(p)
  376. X
  377. X
  378. X
  379. X     discarded before the comparison.  This means that a macro
  380. X     that evaluates to nothing but white space is considered a
  381. X     NULL value for the purpose of the comparison.  In the first
  382. X     case the expression evaluates TRUE if the text is not NULL
  383. X     otherwise it evaluates FALSE.  The remaining two cases both
  384. X     evaluate the expression on the basis of a string comparison.
  385. X     If a macro expression needs to be equated to a NULL string
  386. X     then compare it to the value of the macro $(NULL).  You can
  387. X     use the $(shell ...) macro to construct more complex test
  388. X     expressions.
  389. X
  390. EEXXAAMMPPLLEESS
  391. X          # A simple example showing how to use make
  392. X          #
  393. X          prgm : a.o b.o
  394. X               cc a.o b.o -o prgm
  395. X          a.o : a.c g.h
  396. X               cc a.c -o $@
  397. X          b.o : b.c g.h
  398. X               cc b.c -o $@
  399. X
  400. X     In the previous example prgm is remade only if a.o and/or
  401. X     b.o is out of date with respect to prgm.  These dependencies
  402. X     can be stated more concisely by using the inference rules
  403. X     defined in the standard startup file.  The default rule for
  404. X     making .o's from .c's looks something like this:
  405. X
  406. X          %.o : %.c; cc -c $(CFLAGS) -o $@ $<
  407. X
  408. X     Since there exists a rule (defined in the startup file) for
  409. X     making .o's from .c's ddmmaakkee will use that rule for manufac-
  410. X     turing a .o from a .c and we can specify our dependencies
  411. X     more concisely.
  412. X
  413. X          prgm : a.o b.o
  414. X               cc -o prgm $<
  415. X          a.o b.o : g.h
  416. X
  417. X     A more general way to say the above using the new macro
  418. X     expansions would be:
  419. X
  420. X          SRC = a b
  421. X          OBJ = {$(SRC)}.o
  422. X
  423. X          prgm : $(OBJ)
  424. X               cc -o $@ $<
  425. X
  426. X          $(OBJ) : g.h
  427. X
  428. X     If we want to keep the objects in a separate directory,
  429. X     called objdir, then we would write something like this.
  430. X
  431. X
  432. X
  433. X
  434. Version 3.70                    UW                             45
  435. X
  436. X
  437. X
  438. X
  439. DMAKE(p)             Unsupported Free Software            DMAKE(p)
  440. X
  441. X
  442. X
  443. X          SRC = a b
  444. X          OBJ = {$(SRC)}.o
  445. X
  446. X          prgm : $(OBJ)
  447. X               cc $< -o $@
  448. X
  449. X          $(OBJ) : g.h
  450. X          %.o : %.c
  451. X               $(CC) -c $(CFLAGS) -o $(@:f) $<
  452. X               mv $(@:f) objdir
  453. X
  454. X          .SOURCE.o : objdir       # tell make to look here for .o's
  455. X
  456. X     An example of building library members would go something
  457. X     like this: (NOTE:  The same rules as above will be used to
  458. X     produce .o's from .c's)
  459. X
  460. X          SRC  = a b
  461. X          LIB  = lib
  462. X          LIBm = { $(SRC) }.o
  463. X
  464. X          prgm: $(LIB)
  465. X               cc -o $@ $(LIB)
  466. X
  467. X          $(LIB) .LIBRARY : $(LIBm)
  468. X               ar rv $@ $<
  469. X               rm $<
  470. X
  471. X     Finally, suppose that each of the source files in the previ-
  472. X     ous example had the `:' character in their target name.
  473. X     Then we would write the above example as:
  474. X
  475. X          SRC  = f:a f:b
  476. X          LIB  = lib
  477. X          LIBm = "{ $(SRC) }.o"         # put quotes around each token
  478. X
  479. X          prgm: $(LIB)
  480. X               cc -o $@ $(LIB)
  481. X
  482. X          $(LIB) .LIBRARY : $(LIBm)
  483. X               ar rv $@ $<
  484. X               rm $<
  485. X
  486. CCOOMMPPAATTIIBBIILLIITTYY
  487. X     There are two notable differences between ddmmaakkee and the
  488. X     standard version of BSD UNIX 4.2/4.3 Make.
  489. X
  490. X          1. BSD UNIX 4.2/4.3 Make supports wild card filename
  491. X             expansion for prerequisite names.  Thus if a direc-
  492. X             tory contains a.h, b.h and c.h, then a line like
  493. X
  494. X                  target: *.h
  495. X
  496. X
  497. X
  498. Version 3.70                    UW                             46
  499. X
  500. X
  501. X
  502. X
  503. DMAKE(p)             Unsupported Free Software            DMAKE(p)
  504. X
  505. X
  506. X
  507. X             will cause UNIX make to expand the *.h into "a.h b.h
  508. X             c.h".  ddmmaakkee does not support this type of filename
  509. X             expansion.
  510. X
  511. X          2. Unlike UNIX make, touching a library member causes
  512. X             ddmmaakkee to search the library for the member name and
  513. X             to update the library time stamp.  This is only
  514. X             implemented in the UNIX version.  MSDOS and other
  515. X             versions may not have librarians that keep file time
  516. X             stamps, as a result ddmmaakkee touches the library file
  517. X             itself, and prints a warning.
  518. X
  519. X     ddmmaakkee is not compatible with GNU Make.  In particular it
  520. X     does not understand GNU Make's macro expansions that query
  521. X     the file system.
  522. X
  523. X     ddmmaakkee is fully compatible with SYSV AUGMAKE, and supports
  524. X     the following AUGMAKE features:
  525. X
  526. X          1. The word iinncclluuddee appearing at the start of a line
  527. X             can be used instead of the ".INCLUDE :" construct
  528. X             understood by ddmmaakkee.
  529. X
  530. X          2. The macro modifier expression $(macro:str=sub) is
  531. X             understood and is equivalent to the expression
  532. X             $(macro:s/str/sub), with the restriction that str
  533. X             must match the following regular expression:
  534. X
  535. X                  str[ |\t][ |\t]*
  536. X
  537. X             (ie. str only matches at the end of a token where
  538. X             str is a suffix and is terminated by a space, a tab,
  539. X             or end of line)
  540. X
  541. X          3. The macro % is defined to be $@ (ie. $% expands to
  542. X             the same value as $@).
  543. X
  544. X          4. The AUGMAKE notion of libraries is handled
  545. X             correctly.
  546. X
  547. X          5. When defining special targets for the inference
  548. X             rules and the AUGMAKE special target handling is
  549. X             enabled then the special target .X is equivalent to
  550. X             the %-rule "% : %.X".
  551. X
  552. X          6. Directories are always made if you specify --AA.  This
  553. X             is consistent with other UNIX versions of Make.
  554. X
  555. X          7. Makefiles that utilize virtual targets to force mak-
  556. X             ing of other targets work as expected if AUGMAKE
  557. X             special target handling is enabled.  For example:
  558. X
  559. X
  560. X
  561. X
  562. Version 3.70                    UW                             47
  563. X
  564. X
  565. X
  566. X
  567. DMAKE(p)             Unsupported Free Software            DMAKE(p)
  568. X
  569. X
  570. X
  571. X                  FRC:
  572. X                  myprog.o : myprog.c $(FRC) ; ...
  573. X
  574. X             Works as expected if you issue the command
  575. X
  576. X                  'ddmmaakkee -A FRC=FRC'
  577. X
  578. X             but fails with a 'don't know how to make FRC' error
  579. X             message if you do not specify AUGMAKE special target
  580. X             handling via the -A flag (or by setting AUGMAKE:=yes
  581. X             internally).
  582. X
  583. LLIIMMIITTSS
  584. X     In some environments the length of an argument string is
  585. X     restricted.  (e.g. MSDOS command line arguments cannot be
  586. X     longer than 128 bytes if you are using the standard
  587. X     command.com command interpreter as your shell, ddmmaakkee text
  588. X     diversions may help in these situations.)
  589. X
  590. PPOORRTTAABBIILLIITTYY
  591. X     To write makefiles that can be moved from one environment to
  592. X     another requires some forethought.  In particular you must
  593. X     define as macros all those things that may be different in
  594. X     the new environment.  ddmmaakkee has two facilities that help to
  595. X     support writing portable makefiles, recursive macros and
  596. X     conditional expressions.  The recursive macros, allow one to
  597. X     define environment configurations that allow different
  598. X     environments for similar types of operating systems.  For
  599. X     example the same make script can be used for SYSV and BSD
  600. X     but with different macro definitions.
  601. X
  602. X     To write a makefile that is portable between UNIX and MSDOS
  603. X     requires both features since in almost all cases you will
  604. X     need to define new recipes for making targets.  The recipes
  605. X     will probably be quite different since the capabilities of
  606. X     the tools on each machine are different.  Different macros
  607. X     will be needed to help handle the smaller differences in the
  608. X     two environments.
  609. X
  610. X     NOTE:  Unlike UNIX, MSDOS ddooeess maintain cd requests cross
  611. X     single recipe lines.  This is not portable, and your
  612. X     makefiles will not work the same way if you depend on it.
  613. X     Use the .IF ... .ELSE ... .END conditionals to supply dif-
  614. X     ferent make scripts as necessary.
  615. X
  616. FFIILLEESS
  617. X     Makefile, makefile, startup.mk (use dmake -V to tell you
  618. X     where the startup file is)
  619. X
  620. SSEEEE AALLSSOO
  621. X     sh(1), csh(1), touch(1), f77(1), pc(1), cc(1)
  622. X     S.I. Feldman  _M_a_k_e _- _A _P_r_o_g_r_a_m _f_o_r _M_a_i_n_t_a_i_n_i_n_g _C_o_m_p_u_t_e_r
  623. X
  624. X
  625. X
  626. Version 3.70                    UW                             48
  627. X
  628. X
  629. X
  630. X
  631. DMAKE(p)             Unsupported Free Software            DMAKE(p)
  632. X
  633. X
  634. X
  635. X     _P_r_o_g_r_a_m_s
  636. X
  637. AAUUTTHHOORR
  638. X     Dennis Vadura, CS Dept. University of Waterloo.
  639. X     dvadura@watdragon.uwaterloo.ca
  640. X     Many thanks to Carl Seger for his helpful suggestions, and
  641. X     to Trevor John Thompson for his many excellent ideas and
  642. X     informative bug reports.
  643. X
  644. BBUUGGSS
  645. X     Some system commands return non-zero status inappropriately.
  646. X     Use --ii (`-' within the makefile) to overcome the difficulty.
  647. X
  648. X     Some systems do not have easily accessible time stamps for
  649. X     library members (MSDOS, AMIGA, etc) for these ddmmaakkee uses the
  650. X     time stamp of the library instead and prints a warning the
  651. X     first time it does so.  This is almost always ok, except
  652. X     when multiple makefiles update a single library file.  In
  653. X     these instances it is possible to miss an update if one is
  654. X     not careful.
  655. X
  656. X     This man page is way too long.
  657. X
  658. X
  659. X
  660. X
  661. X
  662. X
  663. X
  664. X
  665. X
  666. X
  667. X
  668. X
  669. X
  670. X
  671. X
  672. X
  673. X
  674. X
  675. X
  676. X
  677. X
  678. X
  679. X
  680. X
  681. X
  682. X
  683. X
  684. X
  685. X
  686. X
  687. X
  688. X
  689. X
  690. Version 3.70                    UW                             49
  691. SHAR_EOF
  692. chmod 0640 dmake/man/dmake.p ||
  693. echo 'restore of dmake/man/dmake.p failed'
  694. Wc_c="`wc -c < 'dmake/man/dmake.p'`"
  695. test 125280 -eq "$Wc_c" ||
  696.     echo 'dmake/man/dmake.p: original size 125280, current size' "$Wc_c"
  697. rm -f _shar_wnt_.tmp
  698. fi
  699. # ============= dmake/man/dmake.tf ==============
  700. if test -f 'dmake/man/dmake.tf' -a X"$1" != X"-c"; then
  701.     echo 'x - skipping dmake/man/dmake.tf (File already exists)'
  702.     rm -f _shar_wnt_.tmp
  703. else
  704. > _shar_wnt_.tmp
  705. sed 's/^X//' << 'SHAR_EOF' > 'dmake/man/dmake.tf' &&
  706. .\" Copyright (c) 1990 Dennis Vadura, All rights reserved.
  707. .\"
  708. .ds TB "0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.5i +0.5i +2.0i
  709. .de Ip
  710. .fi
  711. .nr Ip \w'\\$1 'u
  712. .IP "\\$1" \\n(Ipu
  713. \\$2
  714. .nf
  715. ..
  716. .de Is
  717. .nr )I \w'\\$1'u
  718. ..
  719. .de Ii
  720. .in \\n()Ru
  721. .nr )E 1
  722. .ns
  723. .ne 1.1v
  724. .it 1 }N
  725. .di ]B
  726. \&\\$1
  727. ..
  728. .TH DMAKE p  "UW" "Version 3.70" "Unsupported Free Software"
  729. .SH NAME
  730. \fBdmake\fR \- maintain program groups, or interdependent files
  731. .SH SYNOPSIS
  732. .B dmake
  733. [-AceEhiknpqrsStTuVx] [-v{dfimt}] [-P#] [-{f|C|K} file]
  734. [macro[*][+][:]=\fIvalue\fP ...] [target ...]
  735. .SH DESCRIPTION
  736. .PP
  737. .B dmake
  738. executes commands found in an external file called a
  739. .I makefile
  740. to update one or more target names.
  741. Each target may depend on zero or more prerequisite targets.
  742. If any of the target's prerequisites is newer than the target or if the target
  743. itself does not exist, then
  744. .B dmake
  745. will attempt to make the target.
  746. .PP
  747. If no
  748. .B \-f
  749. command line option is present then
  750. .B dmake
  751. searches for an existing
  752. .I makefile
  753. from the list of prerequisites specified for the special target \fI.MAKEFILES\fR
  754. (see the STARTUP section for more details).
  755. If "-" is the name of the file specified to the
  756. .B -f
  757. flag then \fBdmake\fR uses standard input as the source of the makefile text.
  758. .PP
  759. Any macro definitions (arguments with embedded "="
  760. signs) that appear on the command line are processed first
  761. and supersede definitions for macros of the same name found
  762. within the makefile.  In general it is impossible for definitions found
  763. inside the makefile to redefine a macro defined on the command line, see the
  764. MACROS section for an exception.
  765. .PP
  766. If no
  767. .I target
  768. names are specified on the command line, then \fBdmake\fR uses the first
  769. non-special target found in the makefile as the default target.
  770. See the
  771. .B "SPECIAL TARGETS"
  772. section for the list of special targets and their function.
  773. \fBdmake\fR is a re-implementation of the UNIX Make utility with
  774. significant enhancements.  Makefiles written for most previous
  775. versions of
  776. .I Make
  777. will be handled correctly by 
  778. .B dmake.
  779. Known differences between \fBdmake\fR and other versions of make
  780. are discussed in the
  781. .B COMPATIBILITY
  782. section found at the end of this document.
  783. .SH OPTIONS
  784. .IP "\fB\-A\fR"
  785. Enable AUGMAKE special inference rule transformations
  786. (see the "PERCENT(%) RULES" section), these are set to off by default.
  787. .IP "\fB\-c\fR"
  788. Use non-standard comment stripping.  If you specify \fB-c\fP then
  789. .B dmake
  790. will treat any \fB#\fP character as a start of comment character wherever it
  791. may appear unless it is escaped by a \\.
  792. .IP "\fB\-C [+]file\fR"
  793. This option writes to \fIfile\fP a copy of standard output and
  794. standard error from any child processes and from the
  795. .B dmake
  796. process itself.  If you specify a \fB+\fP prior to the file name then
  797. the text is appended to the previous contents of \fIfile\fP.
  798. This option is active in the MSDOS implementation only and is ignored
  799. by non-MSDOS versions of
  800. .B dmake.
  801. .IP "\fB\-e\fR"
  802. Read the environment and define all strings of the
  803. form '\fBENV-VAR\fP=\fIevalue\fP'
  804. defined within as macros whose name is \fBENV-VAR\fP,
  805. and whose value is '\fIevalue\fP'.
  806. The environment is processed prior to processing the user
  807. specified makefile thereby allowing definitions in the makefile to override
  808. definitions in the environment.
  809. .IP "\fB\-E\fR"
  810. Same as -e, except that the environment is processed after the
  811. user specified makefile has been processed
  812. (thus definitions in the environment override definitions in the makefile).
  813. The -e and -E options are mutually exclusive.
  814. If both are given the latter takes effect.
  815. .IP "\fB\-f file\fR"
  816. Use \fBfile\fR as the source for the makefile text.
  817. Only one \fB\-f\fR option is allowed.
  818. .IP "\fB\-h\fR"
  819. Print the command summary for \fBdmake\fR.
  820. .IP "\fB\-i\fR"
  821. Tells \fBdmake\fR to ignore errors, and continue making other targets.
  822. This is equivalent to the .IGNORE attribute or macro.
  823. .IP "\fB\-K file\fR"
  824. Turns on \fB.KEEP_STATE\fP state tracking and tells \fBdmake\fP to use
  825. \fIfile\fP as the state file.
  826. .IP "\fB\-k\fR"
  827. Causes \fBdmake\fR to ignore errors caused by command execution and to make
  828. all targets not depending on targets that could not be made. 
  829. Ordinarily \fBdmake\fR stops after a command returns a non-zero status,
  830. specifying \fB\-k\fR causes \fBdmake\fR to ignore the error
  831. and continue to make as much as possible.
  832. .IP "\fB\-n\fR"
  833. Causes \fBdmake\fR to print out what it would have executed,
  834. but does not actually execute the commands.  A special check is made for
  835. the string "$(MAKE)" inside a recipe line, if found, the line is expanded
  836. and invoked, thereby enabling recursive makes to give a full
  837. description of all that they will do.
  838. The check for "$(MAKE)" is disabled inside group recipes.
  839. .IP "\fB\-p\fR"
  840. Print out a version of the digested makefile in human readable form.
  841. (useful for debugging, but cannot be re-read by \fBdmake\fP)
  842. .IP "\fB\-P#\fR"
  843. On systems that support multi-processing cause \fBdmake\fP to use \fI#\fP
  844. concurrent child processes to make targets.
  845. See the "MULTI PROCESSING" section for more information.
  846. .IP "\fB\-q\fR"
  847. Check and see if the target is up to date.  Exits with code 0 if up to date,
  848. 1 otherwise.
  849. .IP "\fB\-r\fR"
  850. Tells \fBdmake\fR not to read the initial startup makefile, see STARTUP
  851. section for more details.
  852. .IP "\fB\-s\fR"
  853. Tells \fBdmake\fR to do all its work silently and not echo the commands it is
  854. executing to stdout (also suppresses warnings).
  855. This  is equivalent to the .SILENT attribute or macro.
  856. .IP "\fB\-S\fR"
  857. Force sequential execution of recipes on architectures which support
  858. concurrent makes.  For backward compatibility with old makefiles that have
  859. nasty side-effect prerequisite dependencies.
  860. .IP "\fB\-t\fR"
  861. Causes \fBdmake\fR to touch the targets and bring them up to date
  862. without executing any commands.
  863. .IP "\fB\-T\fR"
  864. Tells \fBdmake\fP to not perform transitive closure on the inference graph.
  865. .IP "\fB\-u\fR"
  866. Force an unconditional update.  (ie. do everything that would
  867. be done if everything that a target depended on was out of date)
  868. .IP "\fB\-v[dfimt]\fR"
  869. Verbose flag, when making targets print to stdout what we are going to make
  870. and what we think its time stamp is.  The optional flags \fB[dfimt]\fP can be
  871. used to restrict the information that is displayed.  In the absence of any
  872. optional flags all are assumed to be given (ie. \fB\-v\fP is equivalent to
  873. \fB\-vdfimt\fP).  The meanings of the optional flags are:
  874. .RS
  875. .IP "\fBd\fP"
  876. Notify of change directory operations only.
  877. .IP "\fBf\fP"
  878. Notify of file I/O operations only.
  879. .IP "\fBi\fP"
  880. Notify of inference algorithm operation only.
  881. .IP "\fBm\fP"
  882. Notify of target update operations only.
  883. .IP "\fBt\fP"
  884. Keep any temporary files created; normally they are automatically deleted.
  885. .RE
  886. .IP "\fB\-V\fR"
  887. Print the version of \fBdmake\fR, and values of builtin macros.
  888. .IP "\fB\-x\fR"
  889. Upon processing the user makefile export all non-internally defined macros
  890. to the user's environment.  This option together with the -e option
  891. allows SYSV AUGMAKE recursive makes to function as expected.
  892. .SH INDEX
  893. Here is a list of the sections that follow and a short description of each.
  894. Perhaps you won't have to read the whole man page to find
  895. what you need.
  896. .IP \fBSTARTUP\fP 1.9i
  897. Describes \fBdmake\fP initialization.
  898. .IP \fBSYNTAX\fP 1.9i
  899. Describes the syntax of makefile expressions.
  900. .IP \fBATTRIBUTES\fP 1.9i
  901. Describes the notion of attributes and how they are used when
  902. making targets.
  903. .IP \fBMACROS\fP 1.9i
  904. Defining and expanding macros.
  905. .IP "\fBRULES AND TARGETS" 1.9i
  906. How to define targets and their prerequisites.
  907. .IP \fBRECIPES\fP 1.9i
  908. How to tell \fBdmake\fP how to make a target.
  909. .IP "\fBTEXT DIVERSIONS\fP" 1.9i
  910. How to use text diversions in recipes and macro expansions.
  911. .IP "\fBSPECIAL TARGETS\fP" 1.9i
  912. Some targets are special.
  913. .IP "\fBSPECIAL MACROS\fP" 1.9i
  914. Macros used by \fBdmake\fP to alter the processing of the makefile,
  915. and those defined by \fBdmake\fP for the user.
  916. .IP "\fBCONTROL MACROS\fP" 1.9i
  917. Itemized list of special control macros.
  918. .IP "\fBRUN-TIME MACROS\fP" 1.9i
  919. Discussion of special run-time macros such as $@ and $<.
  920. .IP "\fBFUNCTION MACROS\fP" 1.9i
  921. GNU style function macros, only $(mktmp ...) for now.
  922. .IP "\fBDYNAMIC PREREQUISITES\fP" 1.9i
  923. Processing of prerequisites which contain macro expansions in their name.
  924. .IP "\fBBINDING TARGETS\fP" 1.9i
  925. The rules that \fBdmake\fP uses to bind
  926. a target to an existing file in the file system.
  927. .IP "\fBPERCENT(%) RULES\fP" 1.9i
  928. Specification of recipes to be used by the inference algorithm.
  929. .IP "\fBMAKING INFERENCES\fP" 1.9i
  930. The rules that \fBdmake\fP uses when inferring how to make a target which
  931. has no explicit recipe.  This and the previous section are really a single
  932. section in the text.
  933. .IP "\fBMAKING TARGETS\fP" 1.9i
  934. How \fBdmake\fP makes targets other than libraries.
  935. .IP "\fBMAKING LIBRARIES\fP" 1.9i
  936. How \fBdmake\fP makes libraries.
  937. .IP "\fBKEEP STATE\fP" 1.9i
  938. A discussion of how .KEEP_STATE works.
  939. .IP "\fBMULTI PROCESSING\fP" 1.9i
  940. Discussion of \fBdmake's\fP parallel make facilities for architectures that
  941. support them.
  942. .IP "\fBCONDITIONALS\fP" 1.9i
  943. Conditional expressions which control the processing of the makefile.
  944. .IP "\fBEXAMPLES\fP" 1.9i
  945. Some hopefully useful examples.
  946. .IP "\fBCOMPATIBILITY\fP" 1.9i
  947. How \fBdmake\fP compares with previous versions of make.
  948. .IP "\fBLIMITS\fP" 1.9i
  949. Limitations of \fBdmake\fP.
  950. .IP \fBPORTABILITY\fP 1.9i
  951. Comments on writing portable makefiles.
  952. .IP \fBFILES\fP 1.9i
  953. Files used by \fBdmake\fP.
  954. .IP "\fBSEE ALSO\fP" 1.9i
  955. Other related programs, and man pages.
  956. .IP "\fBAUTHOR\fP" 1.9i
  957. The guy responsible for this thing.
  958. .IP \fBBUGS\fP 1.9i
  959. Hope not.
  960. .SH STARTUP
  961. When
  962. .B dmake
  963. begins execution it first processes the command line and then processes
  964. an initial startup-makefile.
  965. This is followed by an attempt to locate and process a user supplied makefile.
  966. The startup file defines the default values of all required control macros
  967. and the set of default rules for making targets and inferences.
  968. When searching for the startup makefile,
  969. .B dmake
  970. searches the following locations, in the order specified,
  971. until a startup file is located:
  972. .LP
  973. .RS
  974. .IP 1.
  975. The location given as the value of the macro
  976. MAKESTARTUP defined on the command line.
  977. .IP 2.
  978. The location given as the value of the environment variable MAKESTARTUP
  979. defined in the current environment.
  980. .IP 3.
  981. The location given as the value of the macro
  982. MAKESTARTUP defined internally within \fBdmake\fP.
  983. .RE
  984. .LP
  985. The above search is disabled by specifying the -r option on the command line.
  986. An error is issued if a startup makefile cannot be found and the -r
  987. option was not specified.
  988. A user may substitute a custom startup file by defining
  989. the MAKESTARTUP environment variable or by redefining the
  990. MAKESTARTUP macro on the command line.
  991. To determine where
  992. .B dmake
  993. looks for the default startup file, check your environment or issue the command
  994. \fI"dmake \-V"\fP.
  995. .PP
  996. A similar search is performed to locate a default user makefile when no
  997. \fB-f\fP command line option is specified.
  998. By default, the prerequisite list of the special target .MAKEFILES
  999. specifies the names of possible makefiles and the search order that
  1000. \fBdmake\fP should use to determine if one exists.
  1001. A typical definition for this target is:
  1002. .RS
  1003. .sp
  1004. \&.MAKEFILES : makefile.mk Makefile makefile
  1005. .sp
  1006. .RE
  1007. \fBdmake\fP will first look for makefile.mk and then the others.
  1008. If a prerequisite
  1009. cannot be found \fBdmake\fP will try to make it before going on to the next
  1010. prerequisite.  For example, makefile.mk can be checked out of an RCS file
  1011. if the proper rules for doing so are defined in the startup file.
  1012. .SH SYNTAX
  1013. This section is a summary of the syntax of makefile statements.
  1014. The description is given in a style similar to BNF, where { } enclose
  1015. items that may appear zero or more times, and [ ] enclose items that
  1016. are optional.  Alternative productions for a left hand side are indicated
  1017. by '\(->', and newlines are significant.  All symbols in \fBbold\fP type
  1018. are text or names representing text supplied by the user.
  1019. .sp 2
  1020. .RS
  1021. .Ip "Makefile" "\(-> { Statement }"
  1022. .Ip "Statement" "\(-> Macro-Definition"
  1023. \(-> Conditional
  1024. \(-> Rule-Definition
  1025. \(-> Attribute-Definition
  1026. .Ip "Macro-Definition" "\(-> \fBMACRO = LINE\fP"
  1027. \(-> \fBMACRO *= LINE\fP
  1028. \(-> \fBMACRO := LINE\fP
  1029. \(-> \fBMACRO *:= LINE\fP
  1030. \(-> \fBMACRO += LINE\fP
  1031. \(-> \fBMACRO +:= LINE\fP
  1032. .Ip "Conditional \(-> " "\fB\&.IF\fR expression"
  1033. X   Makefile
  1034. [ \fB.ELIF\fR expression
  1035. X   Makefile ]
  1036. [ \fB.ELSE\fR
  1037. X   Makefile ]
  1038. \fB\&.END\fR
  1039. .Ip expression    "\(-> \fBLINE\fR"
  1040. \(-> \fBSTRING == LINE\fR
  1041. \(-> \fBSTRING != LINE\fR
  1042. .sp
  1043. .Ip "Rule-Definition \(-> " "target-definition"
  1044. X   [ recipe ]
  1045. .PP
  1046. target-definition \(-> targets [attrs] op { \fBPREREQUISITE\fP } [\fB;\fR rcp-line]
  1047. .Ip "targets" "\(-> target { targets }"
  1048. \(-> \fB"\fRtarget\fB"\fR { targets }
  1049. .Ip "target" "\(-> special-target"
  1050. \(-> \fBTARGET\fR
  1051. .Ip "attrs" "\(-> attribute { attrs }"
  1052. \(-> \fB"\fRattribute\fB"\fR { attrs }
  1053. .Ip "op" "\(-> \fB:\fR { modifier }"
  1054. .Ip "modifier" "\(-> \fB:\fR"
  1055. \(-> \fB^\fR
  1056. \(-> \fB!\fR
  1057. \(-> \fB-\fR
  1058. .Ip "recipe" "\(-> { \fBTAB\fR rcp-line }"
  1059. \(-> [\fB@\fR][\fB%\fR][\fB-\fR] \fB[
  1060. .Is "recipe \(-> "
  1061. .Ii " "
  1062. X   \fR{ \fBLINE\fR }
  1063. .Ii " "
  1064. \fB]\fR
  1065. .Ip "rcp-line" "\(-> [\fB@\fR][\fB%\fR][\fB-\fR][\fB+\fR] \fBLINE\fR"
  1066. .sp
  1067. .Ip Attribute-Definition "\(-> attrs \fB:\fR targets"
  1068. .sp
  1069. .Ip "attribute"     "\(-> \fB.EPILOG\fR"
  1070. \(-> \fB.IGNORE\fR
  1071. \(-> \fB.LIBRARY\fR
  1072. \(-> \fB.MKSARGS\fR
  1073. \(-> \fB.NOINFER\fR
  1074. \(-> \fB.NOSTATE\fR
  1075. \(-> \fB.PHONY\fR
  1076. \(-> \fB.PRECIOUS\fR
  1077. \(-> \fB.PROLOG\fR
  1078. \(-> \fB.SETDIR=\fIpath\fP\fR
  1079. \(-> \fB.SILENT\fR
  1080. \(-> \fB.SEQUENTIAL\fR
  1081. \(-> \fB.SWAP\fR
  1082. \(-> \fB.USESHELL\fR
  1083. \(-> \fB.SYMBOL\fR
  1084. \(-> \fB.UPDATEALL\fR
  1085. .Ip "special-target" "\(-> \fB.ERROR\fR"
  1086. \(-> \fB.EXPORT\fR
  1087. \(-> \fB.GROUPEPILOG\fR
  1088. \(-> \fB.GROUPPROLOG\fR
  1089. \(-> \fB.IMPORT\fR
  1090. \(-> \fB.INCLUDE\fR
  1091. \(-> \fB.INCLUDEDIRS\fR
  1092. \(-> \fB.MAKEFILES\fR
  1093. \(-> \fB.REMOVE\fR
  1094. \(-> \fB.SOURCE\fR
  1095. \(-> \fB.SOURCE.\fIsuffix\fR
  1096. \(-> .\fIsuffix1\fR.\fIsuffix2\fR
  1097. .fi
  1098. .RE
  1099. .sp 1
  1100. .PP
  1101. Where, \fBTAB\fP represents a <tab> character, \fBSTRING\fP represents an
  1102. arbitrary sequence of characters, and
  1103. \fBLINE\fP represents a
  1104. possibly empty sequence of characters terminated by a non-escaped 
  1105. (not immediately preceded by a backslash '\\') new-line character.
  1106. \fBMACRO\fP, \fBPREREQUISITE\fP,
  1107. and \fBTARGET\fP each represent a string of characters not
  1108. including space or tab which respectively form the name of a macro,
  1109. prerequisite or target.
  1110. The name may itself be a macro expansion expression.
  1111. A \fBLINE\fP can be continued over several physical lines by terminating it with
  1112. a single backslash character.  Comments are initiated by the
  1113. pound \fB#\fR character and extend to the end of line.
  1114. All comment text is discarded, a '#' may be placed into the makefile text
  1115. by escaping it with '\\' (ie. \\# translates to # when it is parsed).
  1116. An exception to this occurs when a # is seen inside
  1117. a recipe line that begins with a <tab> or is inside a group recipe.
  1118. If you specify the \fB-c\fP command line switch then this behavior is
  1119. disabled and
  1120. .B dmake
  1121. will treat all # characters as start of comment indicators unless they
  1122. SHAR_EOF
  1123. true || echo 'restore of dmake/man/dmake.tf failed'
  1124. fi
  1125. echo 'End of part 18, continue with part 19'
  1126. echo 19 > _shar_seq_.tmp
  1127. exit 0
  1128.  
  1129. exit 0 # Just in case...
  1130. -- 
  1131. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  1132. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  1133. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  1134. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  1135.