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

  1. Newsgroups: comp.sources.misc
  2. From: Dennis Vadura <dvadura@watdragon.waterloo.edu>
  3. Subject:  v20i079:  dmake - dmake version 3.7, Patch02d/12
  4. Message-ID: <1991Jun29.222548.4133@sparky.IMD.Sterling.COM>
  5. X-Md4-Signature: 59f43ced5f11cf90ee24d5500d25aa86
  6. Date: Sat, 29 Jun 1991 22:25:48 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: Dennis Vadura <dvadura@watdragon.waterloo.edu>
  10. Posting-number: Volume 20, Issue 79
  11. Archive-name: dmake/patch02d
  12. Patch-To: dmake: Volume 19, Issue 22-58
  13.  
  14. #!/bin/sh
  15. # this is dp2.03 (part 3 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" != 3; 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     ddmmaakkee defines a number of special macros.  They are divided
  37. XX     into three classes: control macros, run-time macros, and
  38. XX     function macros.  The control macros are used by ddmmaakkee to
  39. XX     configure its actions, and are the preferred method of doing
  40. XX     so.  In the case when a control macro has the same function
  41. XX     as a special target or attribute they share the same name as
  42. XX     the special target or attribute.  The run-time macros are
  43. XX     defined when ddmmaakkee makes targets and may be used by the user
  44. XX     inside recipes.  The function macros provide higher level
  45. XX     functions dealing with macro expansion and diversion file
  46. XX     processing.
  47. XX
  48. XCCOONNTTRROOLL MMAACCRROOSS
  49. XX     To use the control macros simply assign them a value just
  50. XX     like any other macro.  The control macros are divided into
  51. XX     three groups: string valued macros, character valued macros,
  52. XX     and boolean valued macros.
  53. XX
  54. XX     The following are all of the string valued macros.  This
  55. XX     list is divided into two groups.  The first group gives the
  56. XX     string valued macros that are defined internally and cannot
  57. XX     be directly set by the user.
  58. XX
  59. XX     DDIIRRBBRRKKSSTTRR     Contains the string of chars used to terminate
  60. XX                   the name of a directory in a pathname.  Under
  61. XX                   UNIX its value is "/", under MSDOS its value
  62. XX                   is "/\:".
  63. XX
  64. XX     IINNCCDDEEPPTTHH      This macro's value is a string of digits
  65. XX                   representing the current depth of makefile
  66. XX                   inclusion.  In the first makefile level this
  67. XX                   value is zero.
  68. XX
  69. XX     MMFFLLAAGGSS        Is the list of flags that were given on the
  70. XX                   command line including a leading switch char-
  71. XX                   acter.  The -f flag is not included in this
  72. XX                   list.
  73. XX
  74. XX     MMAAKKEECCMMDD       Is the name with which ddmmaakkee was invoked.
  75. XX
  76. XX     MMAAKKEEDDIIRR       Is the full path to the initial directory in
  77. XX                   which ddmmaakkee was invoked.
  78. XX
  79. XX     MMAAKKEEFFIILLEE      Contains the string "-f _m_a_k_e_f_i_l_e" where,
  80. XX                   _m_a_k_e_f_i_l_e is the name of initial user makefile
  81. XX                   that was first read.
  82. XX
  83. XX
  84. XX
  85. XVersion 3.70                    UW                             25
  86. XX
  87. XX
  88. XX
  89. XX
  90. XDMAKE(p)             Unsupported Free Software            DMAKE(p)
  91. XX
  92. XX
  93. XX
  94. XX     MMAAKKEEFFLLAAGGSS     Is the same as $(MFLAGS) but has no leading
  95. XX                   switch character. (ie. MFLAGS = -$(MAKEFLAGS))
  96. XX
  97. XX     MMAAKKEEMMAACCRROOSS    Contains the complete list of macro expres-
  98. XX                   sions that were specified on the command line.
  99. XX
  100. XX     MMAAKKEETTAARRGGEETTSS   Contains the name(s) of the target(s), if any,
  101. XX                   that were specified on the command line.
  102. XX
  103. XX     MMAAXXPPRROOCCEESSSSLLIIMMIITT
  104. XX                   Is a numeric string representing the maximum
  105. XX                   number of processes that ddmmaakkee can use when
  106. XX                   making targets using parallel mode.
  107. XX
  108. XX     NNUULLLL          Is permanently defined to be the NULL string.
  109. XX                   This is useful when comparing a conditional
  110. XX                   expression to an NULL value.
  111. XX
  112. XX     PPWWDD           Is the full path to the current directory in
  113. XX                   which make is executing.
  114. XX
  115. XX     TTMMPPFFIILLEE       Is set to the name of the most recent tem-
  116. XX                   porary file opened by ddmmaakkee.  Temporary files
  117. XX                   are used for text diversions and for group
  118. XX                   recipe processing.
  119. XX
  120. XX     TTMMDD           Stands for "To Make Dir", and is the path from
  121. XX                   the present directory (value of $(PWD)) to the
  122. XX                   directory that ddmmaakkee was started up in (value
  123. XX                   of $(MAKEDIR)).  This macro is modified when
  124. XX                   .SETDIR attributes are processed.
  125. XX
  126. XX     UUSSEESSHHEELLLL      The value of this macro is set to "yes" if the
  127. XX                   current recipe is forced to use a shell for
  128. XX                   its execution via the .USESHELL or '+' direc-
  129. XX                   tives, its value is "no" otherwise.
  130. XX
  131. XX
  132. XX     The second group of string valued macros control ddmmaakkee
  133. XX     behavior and may be set by the user.
  134. XX
  135. XX     ..NNOOTTAABBSS         When set to non-NULL enables the use of
  136. XX                     spaces as well as <tabs> to begin recipe
  137. XX                     lines.  By default a non-group recipe is
  138. XX                     terminated by a line without any leading
  139. XX                     white-space or by a line not beggining with
  140. XX                     a <tab> character.  Enabling this mode modi-
  141. XX                     fies the first condition of the above termi-
  142. XX                     nation rule to terminate a non-group recipe
  143. XX                     with a line that contains only white-space.
  144. XX                     This mode does not effect the parsing of
  145. XX                     group recipes bracketed by [].
  146. XX
  147. XX
  148. XX
  149. XVersion 3.70                    UW                             26
  150. XX
  151. XX
  152. XX
  153. XX
  154. XDMAKE(p)             Unsupported Free Software            DMAKE(p)
  155. XX
  156. XX
  157. XX
  158. XX     ..SSEETTDDIIRR         If this macro is assigned a value then ddmmaakkee
  159. XX                     will change to the directory given by that
  160. XX                     value before making any targets.
  161. XX
  162. XX     AAUUGGMMAAKKEE         If set to a non NULL value will enable the
  163. XX                     transformation of special meta targets to
  164. XX                     support special AUGMAKE inferences (See the
  165. XX                     COMPATIBILITY section).
  166. XX
  167. XX     DDIIRRSSEEPPSSTTRR       Contains the string that is used to separate
  168. XX                     directory components when path names are
  169. XX                     constructed.  It is defined with a default
  170. XX                     value at startup.
  171. XX
  172. XX     DDIIVVFFIILLEE         Is defined in the startup file and gives the
  173. XX                     name that should be returned for the diver-
  174. XX                     sion file name when used in $(mktmp ...)
  175. XX                     expansions, see the TEXT DIVERSION section
  176. XX                     for details.
  177. XX
  178. XX     ..KKEEEEPP__SSTTAATTEE     Assigning this macro a value tells ddmmaakkee the
  179. XX                     name of the state file to use and turns on
  180. XX                     the keeping of state information for any
  181. XX                     targets that are brought up to date by the
  182. XX                     make.
  183. XX
  184. XX     GGRROOUUPPFFLLAAGGSS      This macro gives the set of flags to pass to
  185. XX                     the shell when invoking it to execute a
  186. XX                     group recipe.  The value of the macro is the
  187. XX                     list of flags with a leading switch indica-
  188. XX                     tor.  (ie. `-' under UNIX)
  189. XX
  190. XX     GGRROOUUPPSSHHEELLLL      This macro defines the full path to the exe-
  191. XX                     cutable image to be used as the shell when
  192. XX                     processing group recipes.  This macro must
  193. XX                     be defined if group recipes are used.  It is
  194. XX                     assigned a default value in the startup
  195. XX                     makefile.  Under UNIX this value is /bin/sh.
  196. XX
  197. XX     GGRROOUUPPSSUUFFFFIIXX     If defined, this macro gives the string to
  198. XX                     use as a suffix when creating group recipe
  199. XX                     files to be handed to the command inter-
  200. XX                     preter.  For example, if it is defined as
  201. XX                     .sh, then all temporary files created by
  202. XX                     ddmmaakkee will end in the suffix .sh.  Under
  203. XX                     MSDOS if you are using command.com as your
  204. XX                     GROUPSHELL, then this suffix must be set to
  205. XX                     .bat in order for group recipes to function
  206. XX                     correctly.  The setting of GROUPSUFFIX and
  207. XX                     GROUPSHELL is done automatically for
  208. XX                     command.com in the startup.mk files.
  209. XX
  210. XX
  211. XX
  212. XX
  213. XVersion 3.70                    UW                             27
  214. XX
  215. XX
  216. XX
  217. XX
  218. XDMAKE(p)             Unsupported Free Software            DMAKE(p)
  219. XX
  220. XX
  221. XX
  222. XX     MMAAKKEE            Is defined in the startup file by default.
  223. XX                     The string $(MAKE) is recognized when using
  224. XX                     the -n option for single line recipes.  Ini-
  225. XX                     tially this macro is defined to have the
  226. XX                     value "$(MAKECMD) $(MFLAGS)".
  227. XX
  228. XX     MMAAKKEESSTTAARRTTUUPP     This macro defines the full path to the ini-
  229. XX                     tial startup makefile.  Use the --VV command
  230. XX                     line option to discover its initial value.
  231. XX
  232. XX     MMAAXXLLIINNEELLEENNGGTTHH   This macro defines the maximum size of a
  233. XX                     single line of makefile input text.  The
  234. XX                     size is specified as a number, the default
  235. XX                     value is defined internally and is shown via
  236. XX                     the --VV option.  A buffer of this size plus 2
  237. XX                     is allocated for reading makefile text.  The
  238. XX                     buffer is freed before any targets are made,
  239. XX                     thereby allowing files containing long input
  240. XX                     lines to be processed without consuming
  241. XX                     memory during the actual make.
  242. XX
  243. XX     MMAAXXPPRROOCCEESSSS      Specify the maximum number of child
  244. XX                     processes to use when making targets.  The
  245. XX                     default value of this macro is "1" and its
  246. XX                     value cannot exceed the value of the macro
  247. XX                     MAXPROCESSLIMIT.  Setting the value of MAX-
  248. XX                     PROCESS on the command line or in the
  249. XX                     makefile is equivalent to supplying a
  250. XX                     corresponding value to the -P flag on the
  251. XX                     command line.
  252. XX
  253. XX     PPRREEPP            This macro defines the number of iterations
  254. XX                     to be expanded automatically when processing
  255. XX                     % rule definitions of the form:
  256. XX
  257. XX                     % : %.suff
  258. XX
  259. XX                     See the sections on PERCENT(%) RULES for
  260. XX                     details on how PREP is used.
  261. XX
  262. XX     SSHHEELLLL           This macro defines the full path to the exe-
  263. XX                     cutable image to be used as the shell when
  264. XX                     processing single line recipes.  This macro
  265. XX                     must be defined if recipes requiring the
  266. XX                     shell for execution are to be used.  It is
  267. XX                     assigned a default value in the startup
  268. XX                     makefile.  Under UNIX this value is /bin/sh.
  269. XX
  270. XX     SSHHEELLLLFFLLAAGGSS      This macro gives the set of flags to pass to
  271. XX                     the shell when invoking it to execute a sin-
  272. XX                     gle line recipe.  The value of the macro is
  273. XX                     the list of flags with a leading switch
  274. XX
  275. XX
  276. XX
  277. XVersion 3.70                    UW                             28
  278. XX
  279. XX
  280. XX
  281. XX
  282. XDMAKE(p)             Unsupported Free Software            DMAKE(p)
  283. XX
  284. XX
  285. XX
  286. XX                     indicator.  (ie. `-' under UNIX)
  287. XX
  288. XX     SSHHEELLLLMMEETTAASS      Each time ddmmaakkee executes a single recipe
  289. XX                     line (not a group recipe) the line is
  290. XX                     searched for any occurrence of a character
  291. XX                     defined in the value of SHELLMETAS.  If such
  292. XX                     a character is found the recipe line is
  293. XX                     defined to require a shell to ensure its
  294. XX                     correct execution.  In such instances a
  295. XX                     shell is used to invoke the recipe line.  If
  296. XX                     no match is found the recipe line is exe-
  297. XX                     cuted without the use of a shell.
  298. XX
  299. XX
  300. XX     There is only one character valued macro defined by ddmmaakkee:
  301. XX     SSWWIITTCCHHAARR contains the switch character used to introduce
  302. XX     options on command lines.  For UNIX its value is `-', and
  303. XX     for MSDOS its value may be `/' or `-'.  The macro is inter-
  304. XX     nally defined and is not user setable.  The MSDOS version of
  305. XX     ddmmaakkee attempts to first extract SWITCHAR from an environment
  306. XX     variable of the same name.  If that fails it then attempts
  307. XX     to use the undocumented getswitchar system call, and returns
  308. XX     the result of that.  Under MSDOS version 4.0 you must set
  309. XX     the value of the environment macro SWITCHAR to '/' to obtain
  310. XX     predictable behavior.
  311. XX
  312. XX     All boolean macros currently understood by ddmmaakkee correspond
  313. XX     directly to the previously defined attributes.  These macros
  314. XX     provide a second way to apply global attributes, and
  315. XX     represent the preferred method of doing so.  They are used
  316. XX     by assigning them a value.  If the value is not a NULL
  317. XX     string then the boolean condition is set to on.  If the
  318. XX     value is a NULL string then the condition is set to off.
  319. XX     There are five conditions defined and they correspond
  320. XX     directly to the attributes of the same name.  Their meanings
  321. XX     are defined in the ATTRIBUTES section above.  The macros
  322. XX     are: ..EEPPIILLOOGG, ..IIGGNNOORREE, ..MMKKSSAARRGGSS, ..NNOOIINNFFEERR, ..PPRREECCIIOOUUSS, ..PPRROO----
  323. XX     LLOOGG, ..SSEEQQUUEENNTTIIAALL, ..SSIILLEENNTT, ..SSWWAAPP, and ..UUSSEESSHHEELLLL.  Assigning
  324. XX     any of these a non NULL value will globally set the
  325. XX     corresponding attribute to on.
  326. XX
  327. XRRUUNN__TTIIMMEE MMAACCRROOSS
  328. XX     These macros are defined when ddmmaakkee is making targets, and
  329. XX     may take on different values for each target.  $$@@ is defined
  330. XX     to be the full target name, $$?? is the list of all out of
  331. XX     date prerequisites, $$&& is the list of all prerequisites, $$>>
  332. XX     is the name of the library if the current target is a
  333. XX     library member, and $$<< is the list of prerequisites speci-
  334. XX     fied in the current rule.  If the current target had a
  335. XX     recipe inferred then $$<< is the name of the inferred prere-
  336. XX     quisite even if the target had a list of prerequisites sup-
  337. XX     plied using an explicit rule that did not provide a recipe.
  338. XX
  339. XX
  340. XX
  341. XVersion 3.70                    UW                             29
  342. XX
  343. XX
  344. XX
  345. XX
  346. XDMAKE(p)             Unsupported Free Software            DMAKE(p)
  347. XX
  348. XX
  349. XX
  350. XX     In such situations $$&& gives the full list of prerequisites.
  351. XX
  352. XX     $$** is defined as $$((@@::ddbb)) when making targets with explicit
  353. XX     recipes and is defined as the value of % when making targets
  354. XX     whose recipe is the result of an inference.  In the first
  355. XX     case $$** is the target name with no suffix, and in the second
  356. XX     case, is the value of the matched % pattern from the associ-
  357. XX     ated %-rule.  $$^^ expands to the set of out of date prere-
  358. XX     quisites taken from the current value of $$<<.  In addition to
  359. XX     these, $$$$ expands to $, {{{{ expands to {, }}}} expands to },
  360. XX     and the strings <<++ and ++>> are recognized as respectively
  361. XX     starting and terminating a text diversion when they appear
  362. XX     literally together in the same input line.
  363. XX
  364. XX     The difference between $? and $^ can best be illustrated by
  365. XX     an example, consider:
  366. XX
  367. XX          fred.out : joe amy hello
  368. XX               rules for making fred
  369. XX
  370. XX          fred.out : my.c your.h his.h her.h   # more prerequisites
  371. XX
  372. XX     Assume joe, amy, and my.c are newer then fred.out.  When
  373. XX     ddmmaakkee executes the recipe for making fred.out the values of
  374. XX     the following macros will be:
  375. XX
  376. XX          $@ --> fred.out
  377. XX          $* --> fred
  378. XX          $? --> joe amy my.c  # note the difference between $? and $^
  379. XX          $^ --> joe amy
  380. XX          $< --> joe amy hello
  381. XX          $& --> joe amy hello my.c your.h his.h her.h
  382. XX
  383. XX
  384. XFFUUNNCCTTIIOONN MMAACCRROOSS
  385. XX     ddmmaakkee supports a full set of functional macros.  One of
  386. XX     these, the $(mktmp ...) macro, is discussed in detail in the
  387. XX     TEXT DIVERSION section and is not covered here.
  388. XX
  389. XX
  390. XX          $(nnuullll,_t_e_x_t ttrruuee ffaallssee)
  391. XX               expands the value of _t_e_x_t_. If it is NULL then the
  392. XX               macro returns the value of the expansion of ttrruuee
  393. XX               and the expansion of ffaallssee otherwise.  The terms
  394. XX               ttrruuee, and ffaallssee must be strings containing no
  395. XX               white-space.
  396. XX
  397. XX          $(!!nnuullll,_t_e_x_t ttrruuee ffaallssee)
  398. XX               Behaves identically to the previous macro except
  399. XX               that the ttrruuee string is chosen if the expansion of
  400. XX               _t_e_x_t is not NULL.
  401. XX
  402. XX
  403. XX
  404. XX
  405. XVersion 3.70                    UW                             30
  406. XX
  407. XX
  408. XX
  409. XX
  410. XDMAKE(p)             Unsupported Free Software            DMAKE(p)
  411. XX
  412. XX
  413. XX
  414. XX          $(eeqq,_t_e_x_t___a,_t_e_x_t___b ttrruuee ffaallssee)
  415. XX               expands _t_e_x_t___a and _t_e_x_t___b and compares their
  416. XX               results.  If equal it returns the result of the
  417. XX               expansion of the ttrruuee term, otherwise it returns
  418. XX               the expansion of the ffaallssee term.
  419. XX
  420. XX          $(!!eeqq,_t_e_x_t___a,_t_e_x_t___b ttrruuee ffaallssee)
  421. XX               Behaves identically to the previous macro except
  422. XX               that the ttrruuee string is chosen if the expansions
  423. XX               of the two strings are not equal
  424. XX
  425. XX          $(sshheellll ccoommmmaanndd)
  426. XX               Runs _c_o_m_m_a_n_d as if it were part of a recipe and
  427. XX               returns, separated by a single space, all the
  428. XX               non-white space terms written to stdout by the
  429. XX               command.  For example:
  430. XX
  431. XX                    $(shell ls *.c)
  432. XX
  433. XX               will return _"_a_._c _b_._c _c_._c _d_._c_" if the files exist
  434. XX               in the current directory.  The recipe modification
  435. XX               flags [[++@@%%--]] are honored if they appear as the
  436. XX               first characters in the command.  For example:
  437. XX
  438. XX                    $(shell +ls *.c)
  439. XX
  440. XX               will run the command using the current shell.
  441. XX
  442. XX          $(ssoorrtt lliisstt)
  443. XX               Will take all white-space separated tokens in _l_i_s_t
  444. XX               and will return their sorted equivalent list.
  445. XX
  446. XX          $(ssttrriipp ddaattaa)
  447. XX               Will replace all strings of white-space in data by
  448. XX               a single space.
  449. XX
  450. XX          $(ssuubbsstt,_p_a_t,_r_e_p_l_a_c_e_m_e_n_t ddaattaa)
  451. XX               Will search for _p_a_t in ddaattaa and will replace any
  452. XX               occurrence of _p_a_t with the _r_e_p_l_a_c_e_m_e_n_t string.
  453. XX               The expansion
  454. XX
  455. XX                    $(subst,.o,.c $(OBJECTS))
  456. XX
  457. XX               is equivalent to:
  458. XX
  459. XX                    $(OBJECTS:s/.o/.c/)
  460. XX
  461. XX
  462. XDDYYNNAAMMIICC PPRREERREEQQUUIISSIITTEESS
  463. XX     ddmmaakkee looks for prerequisites whose names contain macro
  464. XX     expansions during target processing.  Any such prerequisites
  465. XX     are expanded and the result of the expansion is used as the
  466. XX
  467. XX
  468. XX
  469. XVersion 3.70                    UW                             31
  470. XX
  471. XX
  472. XX
  473. XX
  474. XDMAKE(p)             Unsupported Free Software            DMAKE(p)
  475. XX
  476. XX
  477. XX
  478. XX     prerequisite name.  As an example the line:
  479. XX
  480. XX          fred : $$@.c
  481. XX
  482. XX     causes the $$@ to be expanded when ddmmaakkee is making fred, and
  483. XX     it resolves to the target _f_r_e_d.  This enables dynamic prere-
  484. XX     quisites to be generated.  The value of @ may be modified by
  485. XX     any of the valid macro modifiers.  So you can say for exam-
  486. XX     ple:
  487. XX
  488. XX          fred.out : $$(@:b).c
  489. XX
  490. XX     where the $$(@:b) expands to _f_r_e_d.  Note the use of $$
  491. XX     instead of $ to indicate the dynamic expansion, this is due
  492. XX     to the fact that the rule line is expanded when it is ini-
  493. XX     tially parsed, and $$ then returns $ which later triggers
  494. XX     the dynamic prerequisite expansion.  If you really want a $
  495. XX     to be part of a prerequisite name you must use $$$$.
  496. XX     Dynamic macro expansion is performed in all user defined
  497. XX     rules, and the special targets .SOURCE*, and .INCLUDEDIRS.
  498. XX
  499. XBBIINNDDIINNGG TTAARRGGEETTSS
  500. XX     This operation takes a target name and binds it to an exist-
  501. XX     ing file, if possible.  ddmmaakkee makes a distinction between
  502. XX     the internal target name of a target and its associated
  503. XX     external file name.  Thus it is possible for a target's
  504. XX     internal name and its external file name to differ.  To per-
  505. XX     form the binding, the following set of rules is used.
  506. XX     Assume that we are trying to bind a target whose name is of
  507. XX     the form _X_._s_u_f_f, where _._s_u_f_f is the suffix and _X is the stem
  508. XX     portion (ie. that part which contains the directory and the
  509. XX     basename).  ddmmaakkee takes this target name and performs a
  510. XX     series of search operations that try to find a suitably
  511. XX     named file in the external file system.  The search opera-
  512. XX     tion is user controlled via the settings of the various
  513. XX     .SOURCE targets.
  514. XX
  515. XX          1.   If target has the .SYMBOL attribute set then look
  516. XX               for it in the library.  If found, replace the tar-
  517. XX               get name with the library member name and continue
  518. XX               with step 2.  If the name is not found then
  519. XX               return.
  520. XX
  521. XX          2.   Extract the suffix portion (that following the
  522. XX               `.') of the target name.  If the suffix is not
  523. XX               null, look up the special target .SOURCE.<suff>
  524. XX               (<suff> is the suffix). If the special target
  525. XX               exists then search each directory given in the
  526. XX               .SOURCE.<suff> prerequisite list for the target.
  527. XX               If the target's suffix was null (ie. _._s_u_f_f was
  528. XX               empty) then perform the above search but use the
  529. XX               special target .SOURCE.NULL instead.  If at any
  530. XX
  531. XX
  532. XX
  533. XVersion 3.70                    UW                             32
  534. XX
  535. XX
  536. XX
  537. XX
  538. XDMAKE(p)             Unsupported Free Software            DMAKE(p)
  539. XX
  540. XX
  541. XX
  542. XX               point a match is found then terminate the search.
  543. XX               If a directory in the prerequisite list is the
  544. XX               special name `.NULL ' perform a search for the
  545. XX               full target name without prepending any directory
  546. XX               portion (ie. prepend the NULL directory).  (a
  547. XX               default target of '.SOURCE : .NULL' is defined by
  548. XX               ddmmaakkee at startup, and is user redefinable)
  549. XX
  550. XX          3.   The search in step 2. failed.  Repeat the same
  551. XX               search but this time use the special target
  552. XX               .SOURCE.
  553. XX
  554. XX          4.   The search in step 3. failed.  If the target has
  555. XX               the library member attribute (.LIBMEMBER) set then
  556. XX               try to find the target in the library which was
  557. XX               passed along with the .LIBMEMBER attribute (see
  558. XX               the MAKING LIBRARIES section).  The bound file
  559. XX               name assigned to a target which is successfully
  560. XX               located in a library is the same name that would
  561. XX               be assigned had the search failed (see 5.).
  562. XX
  563. XX          5.   The search failed.  Either the target was not
  564. XX               found in any of the search directories or no
  565. XX               applicable .SOURCE special targets exist.  If
  566. XX               applicable .SOURCE special targets exist, but the
  567. XX               target was not found, then ddmmaakkee assigns the first
  568. XX               name searched as the bound file name.  If no
  569. XX               applicable .SOURCE special targets exist, then the
  570. XX               full original target name becomes the bound file
  571. XX               name.
  572. XX
  573. XX     There is potential here for a lot of search operations.  The
  574. XX     trick is to define .SOURCE.x special targets with short
  575. XX     search lists and leave .SOURCE as short as possible.  The
  576. XX     search algorithm has the following useful side effect.  When
  577. XX     a target having the .LIBMEMBER (library member) attribute is
  578. XX     searched for, it is first searched for as an ordinary file.
  579. XX     When a number of library members require updating it is
  580. XX     desirable to compile all of them first and to update the
  581. XX     library at the end in a single operation.  If one of the
  582. XX     members does not compile and ddmmaakkee stops, then the user may
  583. XX     fix the error and make again.  ddmmaakkee will not remake any of
  584. XX     the targets whose object files have already been generated
  585. XX     as long as none of their prerequisite files have been modi-
  586. XX     fied as a result of the fix.
  587. XX
  588. XX     When defining .SOURCE and .SOURCE.x targets the construct
  589. XX
  590. XX          .SOURCE :
  591. XX          .SOURCE : fred gery
  592. XX
  593. XX     is equivalent to
  594. XX
  595. XX
  596. XX
  597. XVersion 3.70                    UW                             33
  598. XX
  599. XX
  600. XX
  601. XX
  602. XDMAKE(p)             Unsupported Free Software            DMAKE(p)
  603. XX
  604. XX
  605. XX
  606. XX          .SOURCE :- fred gery
  607. XX
  608. XX     ddmmaakkee correctly handles the UNIX Make variable VPATH.  By
  609. XX     definition VPATH contains a list of ':' separated direc-
  610. XX     tories to search when looking for a target.  ddmmaakkee maps
  611. XX     VPATH to the following special rule:
  612. XX
  613. XX          .SOURCE :^ $(VPATH:s/:/ /)
  614. XX
  615. XX     Which takes the value of VPATH and sets .SOURCE to the same
  616. XX     set of directories as specified in VPATH.
  617. XX
  618. XPPEERRCCEENNTT((%%)) RRUULLEESS AANNDD MMAAKKIINNGG IINNFFEERREENNCCEESS
  619. XX     When ddmmaakkee makes a target, the target's set of prerequisites
  620. XX     (if any) must exist and the target must have a recipe which
  621. XX     ddmmaakkee can use to make it.  If the makefile does not specify
  622. XX     an explicit recipe for the target then ddmmaakkee uses special
  623. XX     rules to try to infer a recipe which it can use to make the
  624. XX     target.  Previous versions of Make perform this task by
  625. XX     using rules that are defined by targets of the form
  626. XX     .<suffix>.<suffix> and by using the .SUFFIXES list of suf-
  627. XX     fixes.  The exact workings of this mechanism were sometimes
  628. XX     difficult to understand and often limiting in their useful-
  629. XX     ness.  Instead, ddmmaakkee supports the concept of _%_-_m_e_t_a rules.
  630. XX     The syntax and semantics of these rules differ from standard
  631. XX     rule lines as follows:
  632. XX
  633. XX          _<_%_-_t_a_r_g_e_t_> [_<_a_t_t_r_i_b_u_t_e_s_>] _<_r_u_l_e_o_p_> [_<_%_-_p_r_e_r_e_q_u_i_s_i_t_e_s_>] [;_<_r_e_c_i_p_e_>]
  634. XX
  635. XX     where _%_-_t_a_r_g_e_t is a target containing exactly a single `%'
  636. XX     sign, _a_t_t_r_i_b_u_t_e_s is a list (possibly empty) of attributes,
  637. XX     _r_u_l_e_o_p is the standard set of rule operators, _%_-_p_r_e_r_e_-
  638. XX     _q_u_i_s_i_t_e_s , if present, is a list of prerequisites containing
  639. XX     zero or more `%' signs, and _r_e_c_i_p_e_, if present, is the first
  640. XX     line of the recipe.
  641. XX
  642. XX     The _%_-_t_a_r_g_e_t defines a pattern against which a target whose
  643. XX     recipe is being inferred gets matched.  The pattern match
  644. XX     goes as follows:  all chars are matched exactly from left to
  645. XX     right up to but not including the % sign in the pattern, %
  646. XX     then matches the longest string from the actual target name
  647. XX     not ending in the suffix given after the % sign in the pat-
  648. XX     tern.  Consider the following examples:
  649. XX
  650. XX          %.c       matches fred.c but not joe.c.Z
  651. XX          dir/%.c   matches dir/fred.c but not dd/fred.c
  652. XX          fred/%    matches fred/joe.c but not f/joe.c
  653. XX          %         matches anything
  654. XX
  655. XX     In each case the part of the target name that matched the %
  656. XX     sign is retained and is substituted for any % signs in the
  657. XX     prerequisite list of the %-meta rule when the rule is
  658. XX
  659. XX
  660. XX
  661. XVersion 3.70                    UW                             34
  662. XX
  663. XX
  664. XX
  665. XX
  666. XDMAKE(p)             Unsupported Free Software            DMAKE(p)
  667. XX
  668. XX
  669. XX
  670. XX     selected during inference and ddmmaakkee constructs the new
  671. XX     dependency.  As an example the following %-meta rules
  672. XX     describe the following:
  673. XX
  674. XX          %.c : %.y ; recipe...
  675. XX
  676. XX     describes how to make any file ending in .c if a correspond-
  677. XX     ing file ending in .y can be found.
  678. XX
  679. XX          foo%.o : fee%.k ; recipe...
  680. XX
  681. XX     is used to describe how to make fooxxxx.o from feexxxx.k.
  682. XX
  683. XX          %.a :; recipe...
  684. XX
  685. XX     describes how to make a file whose suffix is .a without
  686. XX     inferring any prerequisites.
  687. XX
  688. XX          %.c : %.y yaccsrc/%.y ; recipe...
  689. XX
  690. XX     is a short form for the construct:
  691. XX
  692. XX          %.c : %.y ; recipe...
  693. XX          %.c : yaccsrc/%.y ; recipe...
  694. XX
  695. XX     ie. It is possible to specify the same recipe for two
  696. XX     %-rules by giving more than one prerequisite in the prere-
  697. XX     quisite list.  A more interesting example is:
  698. XX
  699. XX          % : RCS/%,v ; co $@
  700. XX
  701. XX     which describes how to take any target and check it out of
  702. XX     the RCS directory if the corresponding file exists in the
  703. XX     RCS directory.  The equivalent SCCS rule would be:
  704. XX
  705. XX          % : s.% ; get $@
  706. XX
  707. XX
  708. XX     The previous RCS example defines an infinite rule, because
  709. XX     it says how to make _a_n_y_t_h_i_n_g from RCS/%,v, and _a_n_y_t_h_i_n_g also
  710. XX     includes RCS/fred.c,v.  To limit the size of the graph that
  711. XX     results from such rules ddmmaakkee uses the macro variable PREP
  712. XX     (stands for % repetition).  By default the value of this
  713. XX     variable is 0, which says that no repetitions of a %-rule
  714. XX     are to be generated.  If it is set to something greater than
  715. XX     0, then that many repetitions of any infinite %-rule are
  716. XX     allowed.  If in the above example PREP was set to 1, then
  717. XX     ddmmaakkee would generate the dependency graph:
  718. XX
  719. XX          % --> RCS/%,v --> RCS/RCS/%,v,v
  720. XX
  721. XX     Where each link is assigned the same recipe as the first
  722. XX
  723. XX
  724. XX
  725. XVersion 3.70                    UW                             35
  726. XX
  727. XX
  728. XX
  729. XX
  730. XDMAKE(p)             Unsupported Free Software            DMAKE(p)
  731. XX
  732. XX
  733. XX
  734. XX     link.  PREP should be used only in special cases, since it
  735. XX     may result in a large increase in the number of possible
  736. XX     prerequisites tested.  ddmmaakkee further assumes that any target
  737. XX     that has no suffix can be made from a prerequisite that has
  738. XX     at least one suffix.
  739. XX
  740. XX     ddmmaakkee supports dynamic prerequisite generation for prere-
  741. XX     quisites of %-meta rules.  This is best illustrated by an
  742. XX     example.  The RCS rule shown above can infer how to check
  743. XX     out a file from a corresponding RCS file only if the target
  744. XX     is a simple file name with no directory information.  That
  745. XX     is, the above rule can infer how to find _R_C_S_/_f_r_e_d_._c_,_v from
  746. XX     the target _f_r_e_d_._c, but cannot infer how to find
  747. XX     _s_r_c_d_i_r_/_R_C_S_/_f_r_e_d_._c_,_v from _s_r_c_d_i_r_/_f_r_e_d_._c because the above
  748. XX     rule will cause ddmmaakkee to look for RCS/srcdir/fred.c,v; which
  749. XX     does not exist (assume that srcdir has its own RCS directory
  750. XX     as is the common case).
  751. XX
  752. XX     A more versatile formulation of the above RCS check out rule
  753. XX     is the following:
  754. XX
  755. XX          % :  $$(@:d)RCS/$$(@:f),v : co $@
  756. XX
  757. XX     This rule uses the dynamic macro $@ to specify the prere-
  758. XX     quisite to try to infer.  During inference of this rule the
  759. XX     macro $@ is set to the value of the target of the %-meta
  760. XX     rule and the appropriate prerequisite is generated by
  761. XX     extracting the directory portion of the target name (if
  762. XX     any), appending the string _R_C_S_/ to it, and appending the
  763. XX     target file name with a trailing _,_v attached to the previous
  764. XX     result.
  765. XX
  766. XX     ddmmaakkee can also infer indirect prerequisites.  An inferred
  767. XX     target can have a list of prerequisites added that will not
  768. XX     show up in the value of $< but will show up in the value of
  769. XX     $? and $&.  Indirect prerequisites are specified in an
  770. XX     inference rule by quoting the prerequisite with single
  771. XX     quotes.  For example, if you had the explicit dependency:
  772. XX
  773. XX          fred.o : fred.c ; rule to make fred.o
  774. XX          fred.o : local.h
  775. XX
  776. XX     then this can be inferred for fred.o from the following
  777. XX     inference rule:
  778. XX
  779. XX          %.o : %.c 'local.h' ; rule to make a .o from a .c
  780. XX
  781. XX     You may infer indirect prerequisites that are a function of
  782. XX     the value of '%' in the current rule.  The meta-rule:
  783. XX
  784. XX          %.o : %.c '$(INC)/%.h' ; rule to make a .o from a .c
  785. XX
  786. XX
  787. XX
  788. XX
  789. XVersion 3.70                    UW                             36
  790. XX
  791. XX
  792. XX
  793. XX
  794. XDMAKE(p)             Unsupported Free Software            DMAKE(p)
  795. XX
  796. XX
  797. XX
  798. XX     infers an indirect prerequisite found in the INC directory
  799. XX     whose name is the same as the expansion of $(INC), and the
  800. XX     prerequisite name depends on the base name of the current
  801. XX     target.  The set of indirect prerequisites is attached to
  802. XX     the meta rule in which they are specified and are inferred
  803. XX     only if the rule is used to infer a recipe for a target.
  804. XX     They do not play an active role in driving the inference
  805. XX     algorithm.  The construct:
  806. XX
  807. XX          %.o : %.c %.f 'local.h'; recipe
  808. XX
  809. XX     is equivalent to:
  810. XX
  811. XX          %.o : %.c 'local.h' : recipe
  812. XX          %.o : %.f 'local.h' : recipe
  813. XX
  814. XX
  815. XX     If any of the attributes .SETDIR, .EPILOG, .PROLOG, .SILENT,
  816. XX     .USESHELL, .SWAP, .PRECIOUS, .LIBRARY, .NOSTATE and .IGNORE
  817. XX     are given for a %-rule then when that rule is bound to a
  818. XX     target as the result of an inference, the target's set of
  819. XX     attributes is augmented by the attributes from the above set
  820. XX     that are specified in the bound %-rule.  Other attributes
  821. XX     specified for %-meta rules are not inherited by the target.
  822. XX     The .SETDIR attribute is treated in a special way.  If the
  823. XX     target already had a .SETDIR attribute set then ddmmaakkee
  824. XX     changes to that directory prior to performing the inference.
  825. XX     During inference any .SETDIR attributes for the inferred
  826. XX     prerequisite are honored.  The directories must exist for a
  827. XX     %-meta rule to be selected as a possible inference path.  If
  828. XX     the directories do not exist no error message is issued,
  829. XX     instead the corresponding path in the inference graph is
  830. XX     rejected.
  831. XX
  832. XX     ddmmaakkee also supports the old format special target
  833. XX     .<suffix>.<suffix> by identifying any rules of this form and
  834. XX     mapping them to the appropriate %-rule.  So for example if
  835. XX     an old makefile contains the construct:
  836. XX
  837. XX          .c.o :; cc -c $< -o $@
  838. XX
  839. XX     ddmmaakkee maps this into the following %-rule:
  840. XX
  841. XX          %.o : %.c; cc -c $< -o $@
  842. XX
  843. XX     Furthermore, ddmmaakkee understands several SYSV AUGMAKE special
  844. XX     targets and maps them into corresponding %-meta rules.
  845. XX     These transformation must be enabled by providing the -A
  846. XX     flag on the command line or by setting the value of AUGMAKE
  847. XX     to non-NULL.  The construct
  848. XX
  849. XX          .suff :; recipe
  850. XX
  851. XX
  852. XX
  853. XVersion 3.70                    UW                             37
  854. XX
  855. XX
  856. XX
  857. XX
  858. XDMAKE(p)             Unsupported Free Software            DMAKE(p)
  859. XX
  860. XX
  861. XX
  862. XX     gets mapped into:
  863. XX
  864. XX          % : %.suff; recipe
  865. XX
  866. XX     and the construct
  867. XX
  868. XX          .c~.o :; recipe
  869. XX
  870. XX     gets mapped into:
  871. XX
  872. XX          %.o : s.%.c ; recipe
  873. XX
  874. XX     In general, a special target of the form .<str>~ is replaced
  875. XX     by the %-rule construct s.%.<str>, thereby providing support
  876. XX     for the syntax used by SYSV AUGMAKE for providing SCCS sup-
  877. XX     port.  When enabled, these mappings allow processing of
  878. XX     existing SYSV makefiles without modifications.
  879. XX
  880. XX     ddmmaakkee bases all of its inferences on the inference graph
  881. XX     constructed from the %-rules defined in the makefile.  It
  882. XX     knows exactly which targets can be made from which prere-
  883. XX     quisites by making queries on the inference graph.  For this
  884. XX     reason .SUFFIXES is not needed and is completely ignored.
  885. XX
  886. XX     For a %-meta rule to be inferred as the rule whose recipe
  887. XX     will be used to make a target, the target's name must match
  888. XX     the %-target pattern, and any inferred %-prerequisite must
  889. XX     already exist or have an explicit recipe so that the prere-
  890. SHAR_EOF
  891. true || echo 'restore of dm37p2 failed'
  892. fi
  893. echo 'End of  part 3'
  894. echo 'File dm37p2 is continued in part 4'
  895. echo 4 > _shar_seq_.tmp
  896. exit 0
  897.  
  898. exit 0 # Just in case...
  899. -- 
  900. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  901. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  902. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  903. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  904.