home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume20 / dmake / patch02e < prev    next >
Text File  |  1991-06-29  |  39KB  |  1,016 lines

  1. Newsgroups: comp.sources.misc
  2. From: Dennis Vadura <dvadura@watdragon.waterloo.edu>
  3. Subject:  v20i080:  dmake - dmake version 3.7, Patch02e/12
  4. Message-ID: <1991Jun29.222605.4198@sparky.IMD.Sterling.COM>
  5. X-Md4-Signature: 2d08f812f474d89866fd2da9169b2d27
  6. Date: Sat, 29 Jun 1991 22:26:05 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: Dennis Vadura <dvadura@watdragon.waterloo.edu>
  10. Posting-number: Volume 20, Issue 80
  11. Archive-name: dmake/patch02e
  12. Patch-To: dmake: Volume 19, Issue 22-58
  13.  
  14. #!/bin/sh
  15. # this is dp2.04 (part 4 of a multipart archive)
  16. # do not concatenate these parts, unpack them in order with /bin/sh
  17. # file dm37p2 continued
  18. #
  19. if test ! -r _shar_seq_.tmp; then
  20.     echo 'Please unpack part 1 first!'
  21.     exit 1
  22. fi
  23. (read Scheck
  24.  if test "$Scheck" != 4; then
  25.     echo Please unpack part "$Scheck" next!
  26.     exit 1
  27.  else
  28.     exit 0
  29.  fi
  30. ) < _shar_seq_.tmp || exit 1
  31. if test ! -f _shar_wnt_.tmp; then
  32.     echo 'x - still skipping dm37p2'
  33. else
  34. echo 'x - continuing file dm37p2'
  35. sed 's/^X//' << 'SHAR_EOF' >> 'dm37p2' &&
  36. XX     quisite can be made.  Without _t_r_a_n_s_i_t_i_v_e _c_l_o_s_u_r_e on the
  37. XX     inference graph the above rule describes precisely when an
  38. XX     inference match terminates the search.  If transitive clo-
  39. XX     sure is enabled (the usual case), and a prerequisite does
  40. XX     not exist or cannot be made, then ddmmaakkee invokes the infer-
  41. XX     ence algorithm recursively on the prerequisite to see if
  42. XX     there is some way the prerequisite can be manufactured.
  43. XX     For, if the prerequisite can be made then the current target
  44. XX     can also be made using the current %-meta rule.  This means
  45. XX     that there is no longer a need to give a rule for making a
  46. XX     .o from a .y if you have already given a rule for making a
  47. XX     .o from a .c and a .c from a .y.  In such cases ddmmaakkee can
  48. XX     infer how to make the .o from the .y via the intermediary .c
  49. XX     and will remove the .c when the .o is made.  Transitive clo-
  50. XX     sure can be disabled by giving the -T switch on the command
  51. XX     line.
  52. XX
  53. XX     A word of caution.  ddmmaakkee bases its transitive closure on
  54. XX     the %-meta rule targets.  When it performs transitive clo-
  55. XX     sure it infers how to make a target from a prerequisite by
  56. XX     performing a pattern match as if the potential prerequisite
  57. XX     were a new target.  The set of rules:
  58. XX
  59. XX          %.o : %.c :; rule for making .o from .c
  60. XX
  61. XX
  62. XX
  63. XVersion 3.70                    UW                             38
  64. XX
  65. XX
  66. XX
  67. XX
  68. XDMAKE(p)             Unsupported Free Software            DMAKE(p)
  69. XX
  70. XX
  71. XX
  72. XX          %.c : %.y :; rule for making .c from .y
  73. XX          % : RCS/%,v :; check out of RCS file
  74. XX
  75. XX     will, by performing transitive closure, allow ddmmaakkee to infer
  76. XX     how to make a .o from a .y using a .c as an intermediate
  77. XX     temporary file.  Additionally it will be able to infer how
  78. XX     to make a .y from an RCS file, as long as that RCS file is
  79. XX     in the RCS directory and has a name which ends in .y,v.  The
  80. XX     transitivity computation is performed dynamically for each
  81. XX     target that does not have a recipe.  This has potential to
  82. XX     be costly if the %-meta rules are not carefully specified.
  83. XX     The .NOINFER attribute is used to mark a %-meta node as
  84. XX     being a final target during inference.  Any node with this
  85. XX     attribute set will not be used for subsequent inferences.
  86. XX     As an example the node RCS/%,v is marked as a final node
  87. XX     since we know that if the RCS file does not exist there
  88. XX     likely is no other way to make it.  Thus the standard
  89. XX     startup makefile contains an entry similar to:
  90. XX          .NOINFER : RCS/%,v
  91. XX     Thereby indicating that the RCS file is the end of the
  92. XX     inference chain.
  93. XX
  94. XX     Whenever the inference algorithm determines that a target
  95. XX     can be made from more than one prerequisite and the infer-
  96. XX     ence chains for the two methods are the same length the
  97. XX     algorithm reports an ambiguity and prints the ambiguous
  98. XX     inference chains.
  99. XX
  100. XX     ddmmaakkee tries to remove intermediate files resulting from
  101. XX     transitive closure if the file is not marked as being PRE-
  102. XX     CIOUS, or the --uu flag was not given on the command line, and
  103. XX     if the inferred intermediate did not previously exist.
  104. XX     Intermediate targets that existed prior to being made are
  105. XX     never removed.  This is in keeping with the philosophy that
  106. XX     ddmmaakkee should never remove things from the file system that
  107. XX     it did not add.  If the special target .REMOVE is defined
  108. XX     and has a recipe then ddmmaakkee constructs a list of the inter-
  109. XX     mediate files to be removed and makes them prerequisites of
  110. XX     .REMOVE.  It then makes .REMOVE thereby removing the prere-
  111. XX     quisites if the recipe of .REMOVE says to.  Typically
  112. XX     .REMOVE is defined in the startup file as:
  113. XX
  114. XX          .REMOVE :; $(RM) $<
  115. XX
  116. XMMAAKKIINNGG TTAARRGGEETTSS
  117. XX     In order to update a target ddmmaakkee must execute a recipe.
  118. XX     When a recipe needs to be executed it is first expanded so
  119. XX     that any macros in the recipe text are expanded, and it is
  120. XX     then either executed directly or passed to a shell.  ddmmaakkee
  121. XX     supports two types of recipes.  The regular recipes and
  122. XX     group recipes.
  123. XX
  124. XX
  125. XX
  126. XX
  127. XVersion 3.70                    UW                             39
  128. XX
  129. XX
  130. XX
  131. XX
  132. XDMAKE(p)             Unsupported Free Software            DMAKE(p)
  133. XX
  134. XX
  135. XX
  136. XX     When a regular recipe is invoked ddmmaakkee executes each line of
  137. XX     the recipe separately using a new copy of a shell if a shell
  138. XX     is required.  Thus effects of commands do not generally per-
  139. XX     sist across recipe lines.  (e.g. cd requests in a recipe
  140. XX     line do not carry over to the next recipe line) The decision
  141. XX     on whether a shell is required to execute a command is based
  142. XX     on the value of the macro SHELLMETAS or on the specification
  143. XX     of '+' or .USESHELL for the current recipe or target respec-
  144. XX     tively.  If any character in the value of SHELLMETAS is
  145. XX     found in the expanded recipe text-line or the use of a shell
  146. XX     is requested explicitly via '+' or .USESHELL then the com-
  147. XX     mand is executed using a shell, otherwise the command is
  148. XX     executed directly.  The shell that is used for execution is
  149. XX     given by the value of the macro SHELL.  The flags that are
  150. XX     passed to the shell are given by the value of SHELLFLAGS.
  151. XX     Thus ddmmaakkee constructs the command line:
  152. XX
  153. XX          $(SHELL) $(SHELLFLAGS) $(expanded_recipe_command)
  154. XX
  155. XX     Normally ddmmaakkee writes the command line that it is about to
  156. XX     invoke to standard output.  If the .SILENT attribute is set
  157. XX     for the target or for the recipe line (via @), then the
  158. XX     recipe line is not echoed.
  159. XX
  160. XX     Group recipe processing is similar to that of regular
  161. XX     recipes, except that a shell is always invoked.  The shell
  162. XX     that is invoked is given by the value of the macro GROUP-
  163. XX     SHELL, and its flags are taken from the value of the macro
  164. XX     GROUPFLAGS.  If a target has the .PROLOG attribute set then
  165. XX     ddmmaakkee prepends to the shell script the recipe associated
  166. XX     with the special target .GROUPPROLOG, and if the attribute
  167. XX     .EPILOG is set as well, then the recipe associated with the
  168. XX     special target .GROUPEPILOG is appended to the script file.
  169. XX     This facility can be used to always prepend a common header
  170. XX     and common trailer to group recipes.  Group recipes are
  171. XX     echoed to standard output just like standard recipes, but
  172. XX     are enclosed by lines beginning with [ and ].
  173. XX
  174. XX     The recipe flags [+,-,%,@] are recognized at the start of a
  175. XX     recipe line even if they appear in a macro.  For example:
  176. XX
  177. XX          SH = +
  178. XX          all:
  179. XX               $(SH)echo hi
  180. XX
  181. XX     is completely equivalent to writing
  182. XX
  183. XX          SH = +
  184. XX          all:
  185. XX               +echo hi
  186. XX
  187. XX
  188. XX
  189. XX
  190. XX
  191. XVersion 3.70                    UW                             40
  192. XX
  193. XX
  194. XX
  195. XX
  196. XDMAKE(p)             Unsupported Free Software            DMAKE(p)
  197. XX
  198. XX
  199. XX
  200. XX     The last step performed by ddmmaakkee prior to running a recipe
  201. XX     is to set the macro CMNDNAME to the name of the command to
  202. XX     execute (determined by finding the first white-space ending
  203. XX     token in the command line).  It then sets the macro CMNDARGS
  204. XX     to be the remainder of the line.  ddmmaakkee then expands the
  205. XX     macro COMMAND which by default is set to
  206. XX
  207. XX          COMMAND = $(CMNDNAME) $(CMNDARGS)
  208. XX
  209. XX     The result of this final expansion is the command that will
  210. XX     be executed.  The reason for this expansion is to allow for
  211. XX     a different interface to the argument passing facilities
  212. XX     (esp. under DOS) than that provided by ddmmaakkee. You can for
  213. XX     example define COMMAND to be
  214. XX
  215. XX          COMMAND = $(CMNDNAME) @$(mktmp $(CMNDARGS))
  216. XX
  217. XX     which dumps the arguments into a temporary file and runs the
  218. XX     command
  219. XX
  220. XX          $(CMNDNAME) @/tmp/ASAD23043
  221. XX
  222. XX     which has a much shorter argument list.  It is now up to the
  223. XX     command to use the supplied argument as the source for all
  224. XX     other arguments.  As an optimization, if COMMAND is not
  225. XX     defined ddmmaakkee does not perform the above expansion.  On sys-
  226. XX     tems, such as UNIX, that handle long command lines this pro-
  227. XX     vides a slight saving in processing the makefiles.
  228. XX
  229. XMMAAKKIINNGG LLIIBBRRAARRIIEESS
  230. XX     Libraries are easy to maintain using ddmmaakkee.  A library is a
  231. XX     file containing a collection of object files.  Thus to make
  232. XX     a library you simply specify it as a target with the
  233. XX     .LIBRARY attribute set and specify its list of prere-
  234. XX     quisites.  The prerequisites should be the object members
  235. XX     that are to go into the library.  When ddmmaakkee makes the
  236. XX     library target it uses the .LIBRARY attribute to pass to the
  237. XX     prerequisites the .LIBMEMBER attribute and the name of the
  238. XX     library.  This enables the file binding mechanism to look
  239. XX     for the member in the library if an appropriate object file
  240. XX     cannot be found. A small example best illustrates this.
  241. XX
  242. XX          mylib.a .LIBRARY : mem1.o mem2.o mem3.o
  243. XX               rules for making library...
  244. XX               # remember to remove .o's when lib is made
  245. XX
  246. XX          # equivalent to:  '%.o : %.c ; ...'
  247. XX          .c.o :; rules for making .o from .c say
  248. XX
  249. XX     ddmmaakkee will use the .c.o rule for making the library members
  250. XX     if appropriate .c files can be found using the search rules.
  251. XX     NOTE:  this is not specific in any way to C programs, they
  252. XX
  253. XX
  254. XX
  255. XVersion 3.70                    UW                             41
  256. XX
  257. XX
  258. XX
  259. XX
  260. XDMAKE(p)             Unsupported Free Software            DMAKE(p)
  261. XX
  262. XX
  263. XX
  264. XX     are simply used as an example.
  265. XX
  266. XX     ddmmaakkee tries to handle the old library construct format in a
  267. XX     sensible way.  The construct _l_i_b_(_m_e_m_b_e_r_._o_) is separated and
  268. XX     the _l_i_b portion is declared as a library target.  The new
  269. XX     target is defined with the .LIBRARY attribute set and the
  270. XX     _m_e_m_b_e_r_._o portion of the construct is declared as a prere-
  271. XX     quisite of the lib target.  If the construct _l_i_b_(_m_e_m_b_e_r_._o_)
  272. XX     appears as a prerequisite of a target in the makefile, that
  273. XX     target has the new name of the lib assigned as its prere-
  274. XX     quisite.  Thus the following example:
  275. XX
  276. XX          a.out : ml.a(a.o) ml.a(b.o); $(CC) -o $@  $<
  277. XX
  278. XX          .c.o :; $(CC) -c $(CFLAGS) -o $@  $<
  279. XX          %.a:
  280. XX               ar rv $@ $<
  281. XX               ranlib $@
  282. XX               rm -rf $<
  283. XX
  284. XX     constructs the following dependency graph.
  285. XX
  286. XX          a.out : ml.a; $(CC) -o $@  $<
  287. XX          ml.a .LIBRARY : a.o b.o
  288. XX
  289. XX          %.o : %.c ; $(CC) -c $(CFLAGS) -o $@  $<
  290. XX          %.a :
  291. XX               ar rv $@ $<
  292. XX               ranlib $@
  293. XX               rm -rf $<
  294. XX
  295. XX     and making a.out then works as expected.
  296. XX
  297. XX     The same thing happens for any target of the form
  298. XX     _l_i_b_(_(_e_n_t_r_y_)_).  These targets have an additional feature in
  299. XX     that the _e_n_t_r_y target has the .SYMBOL attribute set automat-
  300. XX     ically.
  301. XX
  302. XX     NOTE:  If the notion of entry points is supported by the
  303. XX     archive and by ddmmaakkee (currently not the case) then ddmmaakkee
  304. XX     will search the archive for the entry point and return not
  305. XX     only the modification time of the member which defines the
  306. XX     entry but also the name of the member file.  This name will
  307. XX     then replace _e_n_t_r_y and will be used for making the member
  308. XX     file.  Once bound to an archive member the .SYMBOL attribute
  309. XX     is removed from the target.  This feature is presently dis-
  310. XX     abled as there is little standardization among archive for-
  311. XX     mats, and we have yet to find a makefile utilizing this
  312. XX     feature (possibly due to the fact that it is unimplemented
  313. XX     in most versions of UNIX Make).
  314. XX
  315. XX
  316. XX
  317. XX
  318. XX
  319. XVersion 3.70                    UW                             42
  320. XX
  321. XX
  322. XX
  323. XX
  324. XDMAKE(p)             Unsupported Free Software            DMAKE(p)
  325. XX
  326. XX
  327. XX
  328. XX     Finally, when ddmmaakkee looks for a library member it must first
  329. XX     locate the library file.  It does so by first looking for
  330. XX     the library relative to the current directory and if it is
  331. XX     not found it then looks relative to the current value of
  332. XX     $(TMD).  This allows commonly used libraries to be kept near
  333. XX     the root of a source tree and to be easily found by ddmmaakkee.
  334. XX
  335. XKKEEEEPP SSTTAATTEE
  336. XX     ddmmaakkee supports the keeping of state information for targets
  337. XX     that it makes whenever the macro .KEEP_STATE is assigned a
  338. XX     value.  The value of the macro should be the name of a state
  339. XX     file that will contain the state information.  If state
  340. XX     keeping is enabled then each target that does not poses the
  341. XX     .NOSTATE attribute will have a record written into the state
  342. XX     file indicating the target's name, the current directory,
  343. XX     the command used to update the target, and which, if any, ::
  344. XX     rule is being used.  When you make this target again if any
  345. XX     of this information does not match the previous settings and
  346. XX     the target is not out dated it will still be re-made.  The
  347. XX     assumption is that one of the conditions above has changed
  348. XX     and that we wish to remake the target.  For example, state
  349. XX     keeping is used in the maintenance of ddmmaakkee to test compile
  350. XX     different versions of the source using different compilers.
  351. XX     Changing the compiler causes the compilation flags to be
  352. XX     modified and hence all sources to be recompiled.
  353. XX
  354. XX     The state file is an ascii file and is portable, however it
  355. XX     is not in human readable form as the entries represent hash
  356. XX     keys of the above information.
  357. XX
  358. XX     The Sun Microsystem's Make construct
  359. XX
  360. XX          .KEEP_STATE :
  361. XX
  362. XX     is recognized and is mapped to ..KKEEEEPP__SSTTAATTEE::==__ssttaattee..mmkk.  The
  363. XX     ddmmaakkee version of state keeping does not include scanning C
  364. XX     source files for dependencies like Sun Make.  This is
  365. XX     specific to C programs and it was felt that it does not
  366. XX     belong in make.  ddmmaakkee instead provides the tool, ccddeeppeenndd,
  367. XX     to scan C source files and to produce depedency information.
  368. XX     Users are free to modify cdepend to produce other dependency
  369. XX     files.  (NOTE: ccddeeppeenndd does not come with the distribution
  370. XX     at this time, but will be available in a patch in the near
  371. XX     future)
  372. XX
  373. XMMUULLTTII PPRROOCCEESSSSIINNGG
  374. XX     If the architecture supports it then ddmmaakkee is capable of
  375. XX     making a target's prerequisites in parallel.  ddmmaakkee will
  376. XX     make as much in parallel as it can and use a number of child
  377. XX     processes up to the maximum specified by MAXPROCESS or by
  378. XX     the value supplied to the -P command line flag.  A parallel
  379. XX     make is enabled by setting the value of MAXPROCESS (either
  380. XX
  381. XX
  382. XX
  383. XVersion 3.70                    UW                             43
  384. XX
  385. XX
  386. XX
  387. XX
  388. XDMAKE(p)             Unsupported Free Software            DMAKE(p)
  389. XX
  390. XX
  391. XX
  392. XX     directly or via -P option) to a value which is > 1.  ddmmaakkee
  393. XX     guarantees that all dependencies as specified in the
  394. XX     makefile are honored.  A target will not be made until all
  395. XX     of its prerequisites have been made.  If a parallel make is
  396. XX     being performed then the following restrictions on parallel-
  397. XX     ism are enforced.
  398. XX
  399. XX          1.   Individual recipe lines in a non-group recipe are
  400. XX               performed sequentially in the order in which they
  401. XX               are specified within the makefile and in parallel
  402. XX               with the recipes of other targets.
  403. XX
  404. XX          2.   If a target contains multiple recipe definitions
  405. XX               (cf. :: rules) then these are performed sequen-
  406. XX               tially in the order in which the :: rules are
  407. XX               specified within the makefile and in parallel with
  408. XX               the recipes of other targets.
  409. XX
  410. XX          3.   If a target rule contains the `!' modifier, then
  411. XX               the recipe is performed sequentially for the list
  412. XX               of outdated prerequisites and in parallel with the
  413. XX               recipes of other targets.
  414. XX
  415. XX          4.   If a target has the .SEQUENTIAL attribute set then
  416. XX               all of its prerequisites are made sequentially
  417. XX               relative to one another (as if MAXPROCESS=1), but
  418. XX               in parallel with other targets in the makefile.
  419. XX
  420. XX     Note:  If you specify a parallel make then the order of tar-
  421. XX     get update and the order in which the associated recipes are
  422. XX     invoked will not correspond to that displayed by the -n
  423. XX     flag.
  424. XX
  425. XCCOONNDDIITTIIOONNAALLSS
  426. XX     ddmmaakkee supports a makefile construct called a _c_o_n_d_i_t_i_o_n_a_l.
  427. XX     It allows the user to conditionally select portions of
  428. XX     makefile text for input processing and to discard other por-
  429. XX     tions.  This becomes useful for writing makefiles that are
  430. XX     intended to function for more than one target host and
  431. XX     environment.  The conditional expression is specified as
  432. XX     follows:
  433. XX
  434. XX          .IF  _e_x_p_r_e_s_s_i_o_n
  435. XX             ... if text ...
  436. XX          .ELIF  _e_x_p_r_e_s_s_i_o_n
  437. XX             ... if text ...
  438. XX          .ELSE
  439. XX             ... else text ...
  440. XX          .END
  441. XX
  442. XX     The .ELSE and .ELIF portions are optional, and the condi-
  443. XX     tionals may be nested (ie.  the text may contain another
  444. XX
  445. XX
  446. XX
  447. XVersion 3.70                    UW                             44
  448. XX
  449. XX
  450. XX
  451. XX
  452. XDMAKE(p)             Unsupported Free Software            DMAKE(p)
  453. XX
  454. XX
  455. XX
  456. XX     conditional).  .IF, .ELSE, and .END may appear anywhere in
  457. XX     the makefile, but a single conditional expression may not
  458. XX     span multiple makefiles.
  459. XX
  460. XX     _e_x_p_r_e_s_s_i_o_n can be one of the following three forms:
  461. XX
  462. XX          <text> | <text> == <text> | <text> != <text>
  463. XX
  464. XX     where _t_e_x_t is either text or a macro expression.  In any
  465. XX     case, before the comparison is made, the expression is
  466. XX     expanded.  The text portions are then selected and compared.
  467. XX     White space at the start and end of the text portion is dis-
  468. XX     carded before the comparison.  This means that a macro that
  469. XX     evaluates to nothing but white space is considered a NULL
  470. XX     value for the purpose of the comparison.  In the first case
  471. XX     the expression evaluates TRUE if the text is not NULL other-
  472. XX     wise it evaluates FALSE.  The remaining two cases both
  473. XX     evaluate the expression on the basis of a string comparison.
  474. XX     If a macro expression needs to be equated to a NULL string
  475. XX     then compare it to the value of the macro $(NULL).  You can
  476. XX     use the $(shell ...) macro to construct more complex test
  477. XX     expressions.
  478. XX
  479. XEEXXAAMMPPLLEESS
  480. XX          # A simple example showing how to use make
  481. XX          #
  482. XX          prgm : a.o b.o
  483. XX               cc a.o b.o -o prgm
  484. XX          a.o : a.c g.h
  485. XX               cc a.c -o $@
  486. XX          b.o : b.c g.h
  487. XX               cc b.c -o $@
  488. XX
  489. XX     In the previous example prgm is remade only if a.o and/or
  490. XX     b.o is out of date with respect to prgm.  These dependencies
  491. XX     can be stated more concisely by using the inference rules
  492. XX     defined in the standard startup file.  The default rule for
  493. XX     making .o's from .c's looks something like this:
  494. XX
  495. XX          %.o : %.c; cc -c $(CFLAGS) -o $@ $<
  496. XX
  497. XX     Since there exists a rule (defined in the startup file) for
  498. XX     making .o's from .c's ddmmaakkee will use that rule for manufac-
  499. XX     turing a .o from a .c and we can specify our dependencies
  500. XX     more concisely.
  501. XX
  502. XX          prgm : a.o b.o
  503. XX               cc -o prgm $<
  504. XX          a.o b.o : g.h
  505. XX
  506. XX     A more general way to say the above using the new macro
  507. XX     expansions would be:
  508. XX
  509. XX
  510. XX
  511. XVersion 3.70                    UW                             45
  512. XX
  513. XX
  514. XX
  515. XX
  516. XDMAKE(p)             Unsupported Free Software            DMAKE(p)
  517. XX
  518. XX
  519. XX
  520. XX          SRC = a b
  521. XX          OBJ = {$(SRC)}.o
  522. XX
  523. XX          prgm : $(OBJ)
  524. XX               cc -o $@ $<
  525. XX
  526. XX          $(OBJ) : g.h
  527. XX
  528. XX     If we want to keep the objects in a separate directory,
  529. XX     called objdir, then we would write something like this.
  530. XX
  531. XX          SRC = a b
  532. XX          OBJ = {$(SRC)}.o
  533. XX
  534. XX          prgm : $(OBJ)
  535. XX               cc $< -o $@
  536. XX
  537. XX          $(OBJ) : g.h
  538. XX          %.o : %.c
  539. XX               $(CC) -c $(CFLAGS) -o $(@:f) $<
  540. XX               mv $(@:f) objdir
  541. XX
  542. XX          .SOURCE.o : objdir       # tell make to look here for .o's
  543. XX
  544. XX     An example of building library members would go something
  545. XX     like this: (NOTE:  The same rules as above will be used to
  546. XX     produce .o's from .c's)
  547. XX
  548. XX          SRC  = a b
  549. XX          LIB  = lib
  550. XX          LIBm = { $(SRC) }.o
  551. XX
  552. XX          prgm: $(LIB)
  553. XX               cc -o $@ $(LIB)
  554. XX
  555. XX          $(LIB) .LIBRARY : $(LIBm)
  556. XX               ar rv $@ $<
  557. XX               rm $<
  558. XX
  559. XX     Finally, suppose that each of the source files in the previ-
  560. XX     ous example had the `:' character in their target name.
  561. XX     Then we would write the above example as:
  562. XX
  563. XX          SRC  = f:a f:b
  564. XX          LIB  = lib
  565. XX          LIBm = "{ $(SRC) }.o"         # put quotes around each token
  566. XX
  567. XX          prgm: $(LIB)
  568. XX               cc -o $@ $(LIB)
  569. XX
  570. XX          $(LIB) .LIBRARY : $(LIBm)
  571. XX               ar rv $@ $<
  572. XX
  573. XX
  574. XX
  575. XVersion 3.70                    UW                             46
  576. XX
  577. XX
  578. XX
  579. XX
  580. XDMAKE(p)             Unsupported Free Software            DMAKE(p)
  581. XX
  582. XX
  583. XX
  584. XX               rm $<
  585. XX
  586. XCCOOMMPPAATTIIBBIILLIITTYY
  587. XX     There are two notable differences between ddmmaakkee and the
  588. XX     standard version of BSD UNIX 4.2/4.3 Make.
  589. XX
  590. XX          1. BSD UNIX 4.2/4.3 Make supports wild card filename
  591. XX             expansion for prerequisite names.  Thus if a direc-
  592. XX             tory contains a.h, b.h and c.h, then a line like
  593. XX
  594. XX                  target: *.h
  595. XX
  596. XX             will cause UNIX make to expand the *.h into "a.h b.h
  597. XX             c.h".  ddmmaakkee does not support this type of filename
  598. XX             expansion.
  599. XX
  600. XX          2. Unlike UNIX make, touching a library member causes
  601. XX             ddmmaakkee to search the library for the member name and
  602. XX             to update the library time stamp.  This is only
  603. XX             implemented in the UNIX version.  MSDOS and other
  604. XX             versions may not have librarians that keep file time
  605. XX             stamps, as a result ddmmaakkee touches the library file
  606. XX             itself, and prints a warning.
  607. XX
  608. XX     ddmmaakkee is not compatible with GNU Make.  In particular it
  609. XX     does not understand GNU Make's macro expansions that query
  610. XX     the file system.
  611. XX
  612. XX     ddmmaakkee is fully compatible with SYSV AUGMAKE, and supports
  613. XX     the following AUGMAKE features:
  614. XX
  615. XX          1. The word iinncclluuddee appearing at the start of a line
  616. XX             can be used instead of the ".INCLUDE :" construct
  617. XX             understood by ddmmaakkee.
  618. XX
  619. XX          2. The macro modifier expression $(macro:str=sub) is
  620. XX             understood and is equivalent to the expression
  621. XX             $(macro:s/str/sub), with the restriction that str
  622. XX             must match the following regular expression:
  623. XX
  624. XX                  str[ |\t][ |\t]*
  625. XX
  626. XX             (ie. str only matches at the end of a token where
  627. XX             str is a suffix and is terminated by a space, a tab,
  628. XX             or end of line)
  629. XX
  630. XX          3. The macro % is defined to be $@ (ie. $% expands to
  631. XX             the same value as $@).
  632. XX
  633. XX          4. The AUGMAKE notion of libraries is handled
  634. XX             correctly.
  635. XX
  636. XX
  637. XX
  638. XX
  639. XVersion 3.70                    UW                             47
  640. XX
  641. XX
  642. XX
  643. XX
  644. XDMAKE(p)             Unsupported Free Software            DMAKE(p)
  645. XX
  646. XX
  647. XX
  648. XX          5. When defining special targets for the inference
  649. XX             rules and the AUGMAKE special target handling is
  650. XX             enabled then the special target .X is equivalent to
  651. XX             the %-rule "% : %.X".
  652. XX
  653. XX          6. Directories are always made if you specify --AA.  This
  654. XX             is consistent with other UNIX versions of Make.
  655. XX
  656. XX          7. Makefiles that utilize virtual targets to force mak-
  657. XX             ing of other targets work as expected if AUGMAKE
  658. XX             special target handling is enabled.  For example:
  659. XX
  660. XX                  FRC:
  661. XX                  myprog.o : myprog.c $(FRC) ; ...
  662. XX
  663. XX             Works as expected if you issue the command
  664. XX
  665. XX                  'ddmmaakkee -A FRC=FRC'
  666. XX
  667. XX             but fails with a 'don't know how to make FRC' error
  668. XX             message if you do not specify AUGMAKE special target
  669. XX             handling via the -A flag (or by setting AUGMAKE:=yes
  670. XX             internally).
  671. XX
  672. XLLIIMMIITTSS
  673. XX     In some environments the length of an argument string is
  674. XX     restricted.  (e.g. MSDOS command line arguments cannot be
  675. XX     longer than 128 bytes if you are using the standard
  676. XX     command.com command interpreter as your shell, ddmmaakkee text
  677. XX     diversions may help in these situations.)
  678. XX
  679. XPPOORRTTAABBIILLIITTYY
  680. XX     To write makefiles that can be moved from one environment to
  681. XX     another requires some forethought.  In particular you must
  682. XX     define as macros all those things that may be different in
  683. XX     the new environment.  ddmmaakkee has two facilities that help to
  684. XX     support writing portable makefiles, recursive macros and
  685. XX     conditional expressions.  The recursive macros, allow one to
  686. XX     define environment configurations that allow different
  687. XX     environments for similar types of operating systems.  For
  688. XX     example the same make script can be used for SYSV and BSD
  689. XX     but with different macro definitions.
  690. XX
  691. XX     To write a makefile that is portable between UNIX and MSDOS
  692. XX     requires both features since in almost all cases you will
  693. XX     need to define new recipes for making targets.  The recipes
  694. XX     will probably be quite different since the capabilities of
  695. XX     the tools on each machine are different.  Different macros
  696. XX     will be needed to help handle the smaller differences in the
  697. XX     two environments.
  698. XX
  699. XX
  700. XX
  701. XX
  702. XX
  703. XVersion 3.70                    UW                             48
  704. XX
  705. XX
  706. XX
  707. XX
  708. XDMAKE(p)             Unsupported Free Software            DMAKE(p)
  709. XX
  710. XX
  711. XX
  712. XFFIILLEESS
  713. XX     Makefile, makefile, startup.mk (use dmake -V to tell you
  714. XX     where the startup file is)
  715. XX
  716. XSSEEEE AALLSSOO
  717. XX     sh(1), csh(1), touch(1), f77(1), pc(1), cc(1)
  718. XX     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 _P_r_o_-
  719. XX     _g_r_a_m_s
  720. XX
  721. XAAUUTTHHOORR
  722. XX     Dennis Vadura, CS Dept. University of Waterloo.
  723. XX     dvadura@watdragon.uwaterloo.ca
  724. XX     Many thanks to Carl Seger for his helpful suggestions, and
  725. XX     to Trevor John Thompson for his many excellent ideas and
  726. XX     informative bug reports.
  727. XX
  728. XBBUUGGSS
  729. XX     Some system commands return non-zero status inappropriately.
  730. XX     Use --ii (`-' within the makefile) to overcome the difficulty.
  731. XX
  732. XX     Some systems do not have easily accessible time stamps for
  733. XX     library members (MSDOS, AMIGA, etc) for these ddmmaakkee uses the
  734. XX     time stamp of the library instead and prints a warning the
  735. XX     first time it does so.  This is almost always ok, except
  736. XX     when multiple makefiles update a single library file.  In
  737. XX     these instances it is possible to miss an update if one is
  738. XX     not careful.
  739. XX
  740. XX     This man page is way too long.
  741. XX
  742. XX
  743. XX
  744. XX
  745. XX
  746. XX
  747. XX
  748. XX
  749. XX
  750. XX
  751. XX
  752. XX
  753. XX
  754. XX
  755. XX
  756. XX
  757. XX
  758. XX
  759. XX
  760. XX
  761. XX
  762. XX
  763. XX
  764. XX
  765. XX
  766. XX
  767. XVersion 3.70                    UW                             49
  768. XSHAR_EOF
  769. Xchmod 0640 man/dmake.p ||
  770. Xecho 'restore of man/dmake.p failed'
  771. XWc_c="`wc -c < 'man/dmake.p'`"
  772. Xtest 125864 -eq "$Wc_c" ||
  773. X    echo 'man/dmake.p: original size 125864, current size' "$Wc_c"
  774. Xfi
  775. X# ============= man/dmake.tf ==============
  776. Xif test -f 'man/dmake.tf' -a X != X; then
  777. X    echo 'x - skipping man/dmake.tf (File already exists)'
  778. Xelse
  779. Xecho 'x - extracting man/dmake.tf (Text)'
  780. Xsed 's/^X//' << 'SHAR_EOF' > 'man/dmake.tf' &&
  781. X.\" Copyright (c) 1990 Dennis Vadura, All rights reserved.
  782. X.\"
  783. X.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
  784. X.de Ip
  785. X.fi
  786. X.nr Ip \w'\\$1 'u
  787. X.IP "\\$1" \\n(Ipu
  788. X\\$2
  789. X.nf
  790. X..
  791. X.de Is
  792. X.nr )I \w'\\$1'u
  793. X..
  794. X.de Ii
  795. X.in \\n()Ru
  796. X.nr )E 1
  797. X.ns
  798. X.ne 1.1v
  799. X.it 1 }N
  800. X.di ]B
  801. X\&\\$1
  802. X..
  803. X.TH DMAKE p  "UW" "Version 3.70" "Unsupported Free Software"
  804. X.SH NAME
  805. X\fBdmake\fR \- maintain program groups, or interdependent files
  806. X.SH SYNOPSIS
  807. X.B dmake
  808. X[\-ABceEhiknpqrsStTuVx] [\-v{dfimt}] [\-P#] [\-{f|C|K} file]
  809. X[macro[*][+][:]=\fIvalue\fP ...] [target ...]
  810. X.SH DESCRIPTION
  811. X.PP
  812. X.B dmake
  813. Xexecutes commands found in an external file called a
  814. X.I makefile
  815. Xto update one or more target names.
  816. XEach target may depend on zero or more prerequisite targets.
  817. XIf any of the target's prerequisites is newer than the target or if the target
  818. Xitself does not exist, then
  819. X.B dmake
  820. Xwill attempt to make the target.
  821. X.PP
  822. XIf no
  823. X.B \-f
  824. Xcommand line option is present then
  825. X.B dmake
  826. Xsearches for an existing
  827. X.I makefile
  828. Xfrom the list of prerequisites specified for the special target \fI.MAKEFILES\fR
  829. X(see the STARTUP section for more details).
  830. XIf "\-" is the name of the file specified to the
  831. X.B \-f
  832. Xflag then \fBdmake\fR uses standard input as the source of the makefile text.
  833. X.PP
  834. XAny macro definitions (arguments with embedded "="
  835. Xsigns) that appear on the command line are processed first
  836. Xand supersede definitions for macros of the same name found
  837. Xwithin the makefile.  In general it is impossible for definitions found
  838. Xinside the makefile to redefine a macro defined on the command line, see the
  839. XMACROS section for an exception.
  840. X.PP
  841. XIf no
  842. X.I target
  843. Xnames are specified on the command line, then \fBdmake\fR uses the first
  844. Xnon-special target found in the makefile as the default target.
  845. XSee the
  846. X.B "SPECIAL TARGETS"
  847. Xsection for the list of special targets and their function.
  848. X\fBdmake\fR is a re-implementation of the UNIX Make utility with
  849. Xsignificant enhancements.  Makefiles written for most previous
  850. Xversions of
  851. X.I Make
  852. Xwill be handled correctly by 
  853. X.B dmake.
  854. XKnown differences between \fBdmake\fR and other versions of make
  855. Xare discussed in the
  856. X.B COMPATIBILITY
  857. Xsection found at the end of this document.
  858. X.SH OPTIONS
  859. X.IP "\fB\-A\fR"
  860. XEnable AUGMAKE special inference rule transformations
  861. X(see the "PERCENT(%) RULES" section), these are set to off by default.
  862. X.IP "\fB\-B\fR"
  863. XEnable the use of spaces instead of <tabs> to begin recipe lines.
  864. XThis flag equivalent to the .NOTABS special macro and is further described
  865. Xbelow.
  866. X.IP "\fB\-c\fR"
  867. XUse non-standard comment stripping.  If you specify \fB\-c\fP then
  868. X.B dmake
  869. Xwill treat any \fB#\fP character as a start of comment character wherever it
  870. Xmay appear unless it is escaped by a \e.
  871. X.IP "\fB\-C [+]file\fR"
  872. XThis option writes to \fIfile\fP a copy of standard output and
  873. Xstandard error from any child processes and from the
  874. X.B dmake
  875. Xprocess itself.  If you specify a \fB+\fP prior to the file name then
  876. Xthe text is appended to the previous contents of \fIfile\fP.
  877. XThis option is active in the MSDOS implementation only and is ignored
  878. Xby non-MSDOS versions of
  879. X.B dmake.
  880. X.IP "\fB\-e\fR"
  881. XRead the environment and define all strings of the
  882. Xform '\fBENV\-VAR\fP=\fIevalue\fP'
  883. Xdefined within as macros whose name is \fBENV\-VAR\fP,
  884. Xand whose value is '\fIevalue\fP'.
  885. XThe environment is processed prior to processing the user
  886. Xspecified makefile thereby allowing definitions in the makefile to override
  887. Xdefinitions in the environment.
  888. X.IP "\fB\-E\fR"
  889. XSame as \-e, except that the environment is processed after the
  890. Xuser specified makefile has been processed
  891. X(thus definitions in the environment override definitions in the makefile).
  892. XThe \-e and \-E options are mutually exclusive.
  893. XIf both are given the latter takes effect.
  894. X.IP "\fB\-f file\fR"
  895. XUse \fBfile\fR as the source for the makefile text.
  896. XOnly one \fB\-f\fR option is allowed.
  897. X.IP "\fB\-h\fR"
  898. XPrint the command summary for \fBdmake\fR.
  899. X.IP "\fB\-i\fR"
  900. XTells \fBdmake\fR to ignore errors, and continue making other targets.
  901. XThis is equivalent to the .IGNORE attribute or macro.
  902. X.IP "\fB\-K file\fR"
  903. XTurns on \fB.KEEP_STATE\fP state tracking and tells \fBdmake\fP to use
  904. X\fIfile\fP as the state file.
  905. X.IP "\fB\-k\fR"
  906. XCauses \fBdmake\fR to ignore errors caused by command execution and to make
  907. Xall targets not depending on targets that could not be made. 
  908. XOrdinarily \fBdmake\fR stops after a command returns a non-zero status,
  909. Xspecifying \fB\-k\fR causes \fBdmake\fR to ignore the error
  910. Xand continue to make as much as possible.
  911. X.IP "\fB\-n\fR"
  912. XCauses \fBdmake\fR to print out what it would have executed,
  913. Xbut does not actually execute the commands.  A special check is made for
  914. Xthe string "$(MAKE)" inside a recipe line, if found, the line is expanded
  915. Xand invoked, thereby enabling recursive makes to give a full
  916. Xdescription of all that they will do.
  917. XThe check for "$(MAKE)" is disabled inside group recipes.
  918. X.IP "\fB\-p\fR"
  919. XPrint out a version of the digested makefile in human readable form.
  920. X(useful for debugging, but cannot be re-read by \fBdmake\fP)
  921. X.IP "\fB\-P#\fR"
  922. XOn systems that support multi-processing cause \fBdmake\fP to use \fI#\fP
  923. Xconcurrent child processes to make targets.
  924. XSee the "MULTI PROCESSING" section for more information.
  925. X.IP "\fB\-q\fR"
  926. XCheck and see if the target is up to date.  Exits with code 0 if up to date,
  927. X1 otherwise.
  928. X.IP "\fB\-r\fR"
  929. XTells \fBdmake\fR not to read the initial startup makefile, see STARTUP
  930. Xsection for more details.
  931. X.IP "\fB\-s\fR"
  932. XTells \fBdmake\fR to do all its work silently and not echo the commands it is
  933. Xexecuting to stdout (also suppresses warnings).
  934. XThis  is equivalent to the .SILENT attribute or macro.
  935. X.IP "\fB\-S\fR"
  936. XForce sequential execution of recipes on architectures which support
  937. Xconcurrent makes.  For backward compatibility with old makefiles that have
  938. Xnasty side-effect prerequisite dependencies.
  939. X.IP "\fB\-t\fR"
  940. XCauses \fBdmake\fR to touch the targets and bring them up to date
  941. Xwithout executing any commands.
  942. X.IP "\fB\-T\fR"
  943. XTells \fBdmake\fP to not perform transitive closure on the inference graph.
  944. X.IP "\fB\-u\fR"
  945. XForce an unconditional update.  (ie. do everything that would
  946. Xbe done if everything that a target depended on was out of date)
  947. X.IP "\fB\-v[dfimt]\fR"
  948. XVerbose flag, when making targets print to stdout what we are going to make
  949. Xand what we think its time stamp is.  The optional flags \fB[dfimt]\fP can be
  950. Xused to restrict the information that is displayed.  In the absence of any
  951. Xoptional flags all are assumed to be given (ie. \fB\-v\fP is equivalent to
  952. X\fB\-vdfimt\fP).  The meanings of the optional flags are:
  953. X.RS
  954. X.IP "\fBd\fP"
  955. XNotify of change directory operations only.
  956. X.IP "\fBf\fP"
  957. XNotify of file I/O operations only.
  958. X.IP "\fBi\fP"
  959. XNotify of inference algorithm operation only.
  960. X.IP "\fBm\fP"
  961. XNotify of target update operations only.
  962. X.IP "\fBt\fP"
  963. XKeep any temporary files created; normally they are automatically deleted.
  964. X.RE
  965. X.IP "\fB\-V\fR"
  966. XPrint the version of \fBdmake\fR, and values of builtin macros.
  967. X.IP "\fB\-x\fR"
  968. XUpon processing the user makefile export all non-internally defined macros
  969. Xto the user's environment.  This option together with the \-e option
  970. Xallows SYSV AUGMAKE recursive makes to function as expected.
  971. X.SH INDEX
  972. XHere is a list of the sections that follow and a short description of each.
  973. XPerhaps you won't have to read the whole man page to find
  974. Xwhat you need.
  975. X.IP \fBSTARTUP\fP 1.9i
  976. XDescribes \fBdmake\fP initialization.
  977. X.IP \fBSYNTAX\fP 1.9i
  978. XDescribes the syntax of makefile expressions.
  979. X.IP \fBATTRIBUTES\fP 1.9i
  980. XDescribes the notion of attributes and how they are used when
  981. Xmaking targets.
  982. X.IP \fBMACROS\fP 1.9i
  983. XDefining and expanding macros.
  984. X.IP "\fBRULES AND TARGETS" 1.9i
  985. XHow to define targets and their prerequisites.
  986. X.IP \fBRECIPES\fP 1.9i
  987. XHow to tell \fBdmake\fP how to make a target.
  988. X.IP "\fBTEXT DIVERSIONS\fP" 1.9i
  989. XHow to use text diversions in recipes and macro expansions.
  990. X.IP "\fBSPECIAL TARGETS\fP" 1.9i
  991. XSome targets are special.
  992. X.IP "\fBSPECIAL MACROS\fP" 1.9i
  993. XMacros used by \fBdmake\fP to alter the processing of the makefile,
  994. Xand those defined by \fBdmake\fP for the user.
  995. X.IP "\fBCONTROL MACROS\fP" 1.9i
  996. XItemized list of special control macros.
  997. X.IP "\fBRUN-TIME MACROS\fP" 1.9i
  998. XDiscussion of special run-time macros such as $@ and $<.
  999. X.IP "\fBFUNCTION MACROS\fP" 1.9i
  1000. XGNU style function macros, only $(mktmp ...) for now.
  1001. X.IP "\fBDYNAMIC PREREQUISITES\fP" 1.9i
  1002. SHAR_EOF
  1003. true || echo 'restore of dm37p2 failed'
  1004. fi
  1005. echo 'End of  part 4'
  1006. echo 'File dm37p2 is continued in part 5'
  1007. echo 5 > _shar_seq_.tmp
  1008. exit 0
  1009.  
  1010. exit 0 # Just in case...
  1011. -- 
  1012. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  1013. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  1014. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  1015. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  1016.