home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume15 / dmake-3.6 / part17 < prev    next >
Text File  |  1990-10-14  |  40KB  |  988 lines

  1. Newsgroups: comp.sources.misc
  2. X-UNIX-From: dvadura@watdragon.waterloo.edu
  3. subject: v15i069: dmake version 3.6 (part 17/25)
  4. from: Dennis Vadura <dvadura@watdragon.waterloo.edu>
  5. Sender: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  6.  
  7. Posting-number: Volume 15, Issue 69
  8. Submitted-by: Dennis Vadura <dvadura@watdragon.waterloo.edu>
  9. Archive-name: dmake-3.6/part17
  10.  
  11. #!/bin/sh
  12. # this is part 17 of a multipart archive
  13. # do not concatenate these parts, unpack them in order with /bin/sh
  14. # file man/dmake.nc continued
  15. #
  16. CurArch=17
  17. if test ! -r s2_seq_.tmp
  18. then echo "Please unpack part 1 first!"
  19.      exit 1; fi
  20. ( read Scheck
  21.   if test "$Scheck" != $CurArch
  22.   then echo "Please unpack part $Scheck next!"
  23.        exit 1;
  24.   else exit 0; fi
  25. ) < s2_seq_.tmp || exit 1
  26. echo "x - Continuing file man/dmake.nc"
  27. sed 's/^X//' << 'SHAR_EOF' >> man/dmake.nc
  28. X     it is redundant as a shell is already being used to run the
  29. X     recipe.  See the MAKING TARGETS section for a description of
  30. X     how dmake invokes recipes.  Here is an example of a group
  31. X     recipe:
  32. X
  33. X          target :
  34. X          [
  35. X               first recipe line
  36. X               second recipe line
  37. X               all of these recipe lines are fed to a
  38. X               single copy of a shell for execution.
  39. X          ]
  40. X
  41. X
  42. X
  43. X
  44. XVersion 3.50                    UW                             18
  45. X
  46. X
  47. X
  48. X
  49. XDMAKE(p)               Unsupported Software               DMAKE(p)
  50. X
  51. X
  52. X
  53. XTEXT DIVERSIONS
  54. X     dmake supports the notion of text diversions.  If a recipe
  55. X     line contains the macro expression
  56. X
  57. X          $(mktmp[,name_modifier] data)
  58. X
  59. X     then all text contained in the data expression is expanded
  60. X     and is written to a new temporary file.  The name of that
  61. X     file is then returned as the value of the macro expansion
  62. X     and is substituted for the text of the macro expression if
  63. X     no name_modifier is present.
  64. X
  65. X     data can be any text and must be separated from the 'mktmp'
  66. X     portion of the macro name by white-space.  The only restric-
  67. X     tion on the data text is that it must contain an balanced
  68. X     number of parentheses of the same kind as are used to ini-
  69. X     tiate the $(mktmp ...) expression.  For example:
  70. X
  71. X          $(mktmp $(XXX))
  72. X
  73. X     is legal and works as expected, but:
  74. X
  75. X          $(mktmp text (to dump to file)
  76. X
  77. X     is not legal.  You can achieve what you wish by either
  78. X     defining a macro that expands to '(' or by using {} in the
  79. X     macro expression; like this:
  80. X
  81. X          ${mktmp text (to dump to file}
  82. X
  83. X     which works as expected.  Since the temporary file is opened
  84. X     when the macro containg the text diversion expression is
  85. X     expanded, diversions may now be nested and any diversions
  86. X     that are created as part of ':=' macro expansions persist
  87. X     for the duration of the dmake run.  The diversion text may
  88. X     contain the same escape codes as those described in the MAC-
  89. X     ROS section.  Thus if the data text is to contain new lines
  90. X     they must be inserted using the \n escape sequence.  For
  91. X     example the expression:
  92. X
  93. X          all:
  94. X               cat $(mktmp this is a\n\
  95. X               test of the text diversion\n)
  96. X
  97. X     is replaced by:
  98. X
  99. X          cat /tmp/mk12294AA
  100. X
  101. X     where the temporary file contains two lines both of which
  102. X     are terminated by a new-line.  If the data text spans multi-
  103. X     ple lines in the makefile then each line must be continued
  104. X     via the use of a \.  A second more illustrative example
  105. X
  106. X
  107. X
  108. XVersion 3.50                    UW                             19
  109. X
  110. X
  111. X
  112. X
  113. XDMAKE(p)               Unsupported Software               DMAKE(p)
  114. X
  115. X
  116. X
  117. X     generates a response file to an MSDOS link command:
  118. X
  119. X          OBJ = fred.obj mary.obj joe.obj
  120. X          all : $(OBJ)
  121. X               link @$(mktmp $(^:t"+\n")\n)
  122. X
  123. X     The result of making `all' in the second example is the com-
  124. X     mand:
  125. X
  126. X          link @/tmp/mk02394AA
  127. X
  128. X     where the temporary file contains:
  129. X
  130. X          fred.obj+
  131. X          mary.obj+
  132. X          joe.obj
  133. X
  134. X     The last line of the file is terminated by a new-line which
  135. X     is inserted due to the \n found at the end of the data
  136. X     string.
  137. X
  138. X     If the optional name_modifier is supplied in the diversion
  139. X     expression then the returned value of the expression is the
  140. X     expanded value of name_modifier.  Together with the special
  141. X     macros TMPFILE and USESHELL this can be used to alter the
  142. X     name of the temporary file returned as the result of the
  143. X     $(mktmp ...) expansion.
  144. X
  145. X     Under MS-DOS text diversions may be a problem.  Many DOS
  146. X     tools require that path names which contain directories use
  147. X     the \ character to delimit the directories.  Some users how-
  148. X     ever wish to use the '/' to delimit pathnames on their sys-
  149. X     tem and use environments that allow them to do so.  These
  150. X     environments usually accept the \ delimited path names as
  151. X     well.  In order to allow the user the most flexibility dmake
  152. X     defines three macros that can be used when text diversion
  153. X     file names are being placed into the recipe text to be exe-
  154. X     cuted.  The macro TMPFILE contains the name of the most
  155. X     recently opened temporary file, and the macro, USESHELL, is
  156. X     set to "yes" if the current recipe is forced to use a shell
  157. X     via the .USESHELL or '+' directives, otherwise its value is
  158. X     "no".  In the absence of a name_modifier in the diversion
  159. X     expression the result of expanding the diversion expression
  160. X     is the value of TMPFILE.  The dmake startup files define the
  161. X     macro DIVFILE whose value is either the value of TMPFILE or
  162. X     the value of TMPFILE editted to replace any '/' characters
  163. X     to the appropriate value based on the current shell and
  164. X     whether it will be used to execute the recipe.
  165. X
  166. X     Previous versions of dmake defined text diversions using <+,
  167. X     +> strings, where <+ started a text diversion and +> ter-
  168. X     minated one.  dmake is backward compatible with this
  169. X
  170. X
  171. X
  172. XVersion 3.50                    UW                             20
  173. X
  174. X
  175. X
  176. X
  177. XDMAKE(p)               Unsupported Software               DMAKE(p)
  178. X
  179. X
  180. X
  181. X     construct if the <+ and +> appear literally on the same
  182. X     recipe line or in the same macro value string.  In such
  183. X     instances the expression:
  184. X
  185. X          <+data text+>
  186. X
  187. X     is mapped to:
  188. X
  189. X          $(mktmp data text)
  190. X
  191. X     which is fully output compatible with the earlier construct.
  192. X     <+, +> constructs whose text spans multiple lines must be
  193. X     converted by hand to use $(mktmp ...).
  194. X
  195. X     If the environment variable TMPDIR is defined then the tem-
  196. X     porary file is placed into the directory specified by that
  197. X     variable.  A makefile can modify the location of temporary
  198. X     files by defining a macro named TMPDIR and exporting it
  199. X     using the .EXPORT special target.
  200. X
  201. XSPECIAL TARGETS
  202. X     This section describes the special targets that are recog-
  203. X     nized by dmake.  Some are affected by attributes and others
  204. X     are not.
  205. X
  206. X     .ERROR        If defined then the recipe associated with
  207. X                   this target is executed whenever an error con-
  208. X                   dition is detected by dmake.  All attributes
  209. X                   that can be used with any other target may be
  210. X                   used with this target.  Any prerequisites of
  211. X                   this target will be brought up to date during
  212. X                   it's processing.  NOTE:  errors will be
  213. X                   ignored while making this target, in extreme
  214. X                   cases this may cause some problems.
  215. X
  216. X     .EXPORT       All prerequisites associated with this target
  217. X                   are assumed to correspond to macro names and
  218. X                   they and their values are exported to the
  219. X                   environment as environment strings at the
  220. X                   point in the makefile at which this target
  221. X                   appears.  Any attributes specified with this
  222. X                   target are ignored.  Only macros which have
  223. X                   been assigned a value in the makefile prior to
  224. X                   the export directive are exported, macros as
  225. X                   yet undefined are not exported.
  226. X
  227. X     .IMPORT       Prerequisite names specified for this target
  228. X                   are searched for in the environment and
  229. X                   defined as macros with their value taken from
  230. X                   the environment.  If the name cannot be found
  231. X                   in the environment an error message is issued.
  232. X                   .IMPORT accepts the .IGNORE attribute.  When
  233. X
  234. X
  235. X
  236. XVersion 3.50                    UW                             21
  237. X
  238. X
  239. X
  240. X
  241. XDMAKE(p)               Unsupported Software               DMAKE(p)
  242. X
  243. X
  244. X
  245. X                   given, it causes dmake to ignore the above
  246. X                   error.  See the MACROS section for a descrip-
  247. X                   tion of the processing of imported macro
  248. X                   values.
  249. X
  250. X     .INCLUDE      Parse another makefile just as if it had been
  251. X                   located at the point of the .INCLUDE in the
  252. X                   current makefile.  The list of prerequisites
  253. X                   gives the list of makefiles to try to read.
  254. X                   If the list contains multiple makefiles then
  255. X                   they are read in order from left to right.
  256. X                   The following search rules are used when try-
  257. X                   ing to locate the file.  If the filename is
  258. X                   surrounded by " or just by itself then it is
  259. X                   searched for in the current directory.  If it
  260. X                   is not found it is then searched for in each
  261. X                   of the directories specified for the .INCLU-
  262. X                   DEDIRS special target.  If the file name is
  263. X                   surrounded by < and >, (ie.
  264. X                   <my_spiffy_new_makefile>) then it is searched
  265. X                   for only in the directories given by the
  266. X                   .INCLUDEDIRS special target.  In both cases if
  267. X                   the file name is a fully qualified name start-
  268. X                   ing at the root of the file system then it is
  269. X                   only searched for once, and the .INCLUDEDIRS
  270. X                   list is ignored.  .INCLUDE accepts the .IGNORE
  271. X                   and .SETDIR attributes.  If .IGNORE attribute
  272. X                   is given and the file cannot be found then
  273. X                   dmake continues processing, otherwise an error
  274. X                   message is generated.  The .SETDIR attribute
  275. X                   causes dmake to change directories to the
  276. X                   specified directory prior to attempting the
  277. X                   include operation.
  278. X
  279. X     .INCLUDEDIRS  The list of prerequisites specified for this
  280. X                   target defines the set of directories to
  281. X                   search when trying to include a makefile.
  282. X
  283. X     .MAKEFILES    The list of prerequisites is the set of files
  284. X                   to try to read as the default makefile.  By
  285. X                   default this target is defined as:
  286. X
  287. X                        .MAKEFILES : makefile.mk Makefile
  288. X                   makefile
  289. X
  290. X
  291. X     .SOURCE       The prerequisite list of this target defines a
  292. X                   set of directories to check when trying to
  293. X                   locate a target file name.  See the section on
  294. X                   BINDING of targets for more information.
  295. X
  296. X
  297. X
  298. X
  299. X
  300. XVersion 3.50                    UW                             22
  301. X
  302. X
  303. X
  304. X
  305. XDMAKE(p)               Unsupported Software               DMAKE(p)
  306. X
  307. X
  308. X
  309. X     .SOURCE.suff  The same as .SOURCE, except that the
  310. X                   .SOURCE.suff list is searched first when try-
  311. X                   ing to locate a file matching the a target
  312. X                   whose name ends in the suffix .suff.
  313. X
  314. X     .REMOVE       The recipe of this target is used whenever
  315. X                   dmake needs to remove intermediate targets
  316. X                   that were made but do not need to be kept
  317. X                   around.  Such targets result from the applica-
  318. X                   tion of transitive closure on the dependency
  319. X                   graph.
  320. X
  321. X     In addition to the special targets above, several other
  322. X     forms of targets are recognized and are considered special,
  323. X     their exact form and use is defined in the sections that
  324. X     follow.
  325. X
  326. XSPECIAL MACROS
  327. X     dmake defines a number of special macros.  They are divided
  328. X     into three classes: control macros, run-time macros, and
  329. X     function macros.  The control macros are used by dmake to
  330. X     configure it's actions, and are the preferred method of
  331. X     doing so.  In the case when a control macro has the same
  332. X     function as a special target or attribute they share the
  333. X     same name as the special target or attribute.  The run-time
  334. X     macros are defined when dmake makes targets and may be used
  335. X     by the user inside recipes.  The function macros provide
  336. X     higher level functions dealing with macro expansion and
  337. X     diversion file processing.
  338. X
  339. XCONTROL MACROS
  340. X     To use the control macros simply assign them a value just
  341. X     like any other macro.  The control macros are divided into
  342. X     three groups: string valued macros, character valued macros,
  343. X     and boolean valued macros.
  344. X
  345. X     The following are all of the string valued macros.  This
  346. X     list is divided into two groups.  The first group gives the
  347. X     string valued macros that are defined internally and cannot
  348. X     be directly set by the user.
  349. X
  350. X     DIRBRKSTR     Contains the string of chars used to terminate
  351. X                   the name of a directory in a pathname.  Under
  352. X                   UNIX it's value is "/", under MSDOS it's value
  353. X                   is "/\:".
  354. X
  355. X     INCDEPTH      This macro's value is a string of digits
  356. X                   representing the current depth of makefile
  357. X                   inclusion.  In the first makefile level this
  358. X                   value is zero.
  359. X
  360. X
  361. X
  362. X
  363. X
  364. XVersion 3.50                    UW                             23
  365. X
  366. X
  367. X
  368. X
  369. XDMAKE(p)               Unsupported Software               DMAKE(p)
  370. X
  371. X
  372. X
  373. X     MFLAGS        Is the list of flags that were given on the
  374. X                   command line including a leading switch char-
  375. X                   acter.  The -f flag is not included in this
  376. X                   list.
  377. X
  378. X     MAKECMD       Is the name with which dmake was invoked.
  379. X
  380. X     MAKEDIR       Is the full path to the initial directory in
  381. X                   which dmake was invoked.
  382. X
  383. X     MAKEFILE      Contains the string "-f makefile" where,
  384. X                   makefile is the name of initial user makefile
  385. X                   that was first read.
  386. X
  387. X     MAKEFLAGS     Is the same as $(MFLAGS) but has no leading
  388. X                   switch character. (ie. MFLAGS = -$(MAKEFLAGS))
  389. X
  390. X     MAKEMACROS    Contains the complete list of macro expres-
  391. X                   sions that were specified on the command line.
  392. X
  393. X     MAKETARGETS   Contains the name(s) of the target(s), if any,
  394. X                   that were specified on the command line.
  395. X
  396. X     MAXPROCESSLIMIT
  397. X                   Is a numeric string representing the maximum
  398. X                   number of processes that dmake can use when
  399. X                   making targets using parallel mode.
  400. X
  401. X     NULL          Is permanently defined to be the NULL string.
  402. X                   This is useful when comparing a conditional
  403. X                   expression to an NULL value.
  404. X
  405. X     PWD           Is the full path to the current directory in
  406. X                   which make is executing.
  407. X
  408. X     TMPFILE       Is set to the name of the most recent tem-
  409. X                   porary file opened by dmake.  Temporary files
  410. X                   are used for text diversions and for group
  411. X                   recipe processing.
  412. X
  413. X     TMD           Stands for "To Make Dir", and is the path from
  414. X                   the present directory (value of $(PWD)) to the
  415. X                   directory that dmake was started up in (value
  416. X                   of $(MAKEDIR)).  This macro is modified when
  417. X                   .SETDIR attributes are processed.
  418. X
  419. X     USESHELL      The value of this macro is set to "yes" if the
  420. X                   current recipe is forced to use a shell for
  421. X                   its execution via the .USESHELL or '+' direc-
  422. X                   tives, its value is "no" otherwise.
  423. X
  424. X
  425. X
  426. X
  427. X
  428. XVersion 3.50                    UW                             24
  429. X
  430. X
  431. X
  432. X
  433. XDMAKE(p)               Unsupported Software               DMAKE(p)
  434. X
  435. X
  436. X
  437. X     The second group of string valued macros control dmake
  438. X     behavior and may be set by the user.
  439. X
  440. X     .SETDIR         If this macro is assigned a value then dmake
  441. X                     will change to the directory given by that
  442. X                     value before making any targets.  This macro
  443. X                     is equivalent to the .SETDIR attribute.
  444. X                     Thus the two lines:
  445. X
  446. X                     .SETDIR=fred/hello :
  447. X
  448. X                     .SETDIR := fred/hello
  449. X
  450. X                     are completely equivalent.  The difference
  451. X                     being that the first is processed as a rule
  452. X                     definition and the other as a macro.
  453. X
  454. X     AUGMAKE         If set to a non NULL value will enable the
  455. X                     transformation of special meta targets to
  456. X                     support special AUGMAKE inferences.
  457. X
  458. X     DIRSEPSTR       Contains the string that is used to separate
  459. X                     directory components when path names are
  460. X                     constructed.  It is defined with a default
  461. X                     value at startup.
  462. X
  463. X     DIVFILE         Is defined in the startup file and gives the
  464. X                     name that should be used for the diversion
  465. X                     file name when specified as the name modif-
  466. X                     ier in $(mktmp ...) expansions, see the TEXT
  467. X                     DIVERSION section for details.
  468. X
  469. X     GROUPFLAGS      This macro gives the set of flags to pass to
  470. X                     the shell when invoking it to execute a
  471. X                     group recipe.  The value of the macro is the
  472. X                     list of flags with a leading switch indica-
  473. X                     tor.  (ie. `-' under UNIX)
  474. X
  475. X     GROUPSHELL      This macro defines the full path to the exe-
  476. X                     cutable image to be used as the shell when
  477. X                     processing group recipes.  This macro must
  478. X                     be defined if group recipes are used.  It is
  479. X                     assigned a default value in the startup
  480. X                     makefile.  Under UNIX this value is /bin/sh.
  481. X
  482. X     GROUPSUFFIX     If defined, this macro gives the string to
  483. X                     use as a suffix when creating group recipe
  484. X                     files to be handed to the command inter-
  485. X                     preter.  For example, if it is defined as
  486. X                     .sh, then all temporary files created by
  487. X                     dmake will end in the suffix .sh.  Under
  488. X                     MSDOS if you are using command.com as your
  489. X
  490. X
  491. X
  492. XVersion 3.50                    UW                             25
  493. X
  494. X
  495. X
  496. X
  497. XDMAKE(p)               Unsupported Software               DMAKE(p)
  498. X
  499. X
  500. X
  501. X                     GROUPSHELL, then this suffix must be set to
  502. X                     .bat in order for group recipes to function
  503. X                     correctly.
  504. X
  505. X     MAKE            Is defined in the startup file by default.
  506. X                     The string $(MAKE) is recognized when using
  507. X                     the -n option for single line recipes.  Ini-
  508. X                     tially this macro is defined to have the
  509. X                     value "$(MAKECMD) $(MFLAGS)".
  510. X
  511. X     MAKESTARTUP     This macro defines the full path to the ini-
  512. X                     tial startup makefile.  Use the -V command
  513. X                     line option to discover it's initial value.
  514. X
  515. X     MAXLINELENGTH   This macro defines the maximum size of a
  516. X                     single line of makefile input text.  The
  517. X                     size is specified as a number, the default
  518. X                     value is defined internally and is shown via
  519. X                     the -V option.  A buffer of this size plus 2
  520. X                     is allocated for reading makefile text.  The
  521. X                     buffer is freed before any targets are made,
  522. X                     thereby allowing files containing long input
  523. X                     lines to be processed without consuming
  524. X                     memory during the actual make.
  525. X
  526. X     MAXPROCESS      Specify the maximum number of child
  527. X                     processes to use when making targets.  The
  528. X                     default value of this macro is "1" and it's
  529. X                     value cannot exceed the value of the macro
  530. X                     MAXPROCESSLIMIT.  Setting the value of MAX-
  531. X                     PROCESS on the command line or in the
  532. X                     makefile is equivalent to supplying a
  533. X                     corresponding value to the -P flag on the
  534. X                     command line.
  535. X
  536. X     PREP            This macro defines the number of iterations
  537. X                     to be expanded automatically when processing
  538. X                     % rule definitions of the form:
  539. X
  540. X                     % : %.suff
  541. X
  542. X                     See the sections on PERCENT(%) RULES for
  543. X                     details on how PREP is used.
  544. X
  545. X     SHELL           This macro defines the full path to the exe-
  546. X                     cutable image to be used as the shell when
  547. X                     processing single line recipes.  This macro
  548. X                     must be defined if recipes requiring the
  549. X                     shell for execution are to be used.  It is
  550. X                     assigned a default value in the startup
  551. X                     makefile.  Under UNIX this value is /bin/sh.
  552. X
  553. X
  554. X
  555. X
  556. XVersion 3.50                    UW                             26
  557. X
  558. X
  559. X
  560. X
  561. XDMAKE(p)               Unsupported Software               DMAKE(p)
  562. X
  563. X
  564. X
  565. X     SHELLFLAGS      This macro gives the set of flags to pass to
  566. X                     the shell when invoking it to execute a sin-
  567. X                     gle line recipe.  The value of the macro is
  568. X                     the list of flags with a leading switch
  569. X                     indicator.  (ie. `-' under UNIX)
  570. X
  571. X     SHELLMETAS      Each time dmake executes a single recipe
  572. X                     line (not a group recipe) the line is
  573. X                     searched for any occurrence of a character
  574. X                     defined in the value of SHELLMETAS.  If such
  575. X                     a character is found the recipe line is
  576. X                     defined to require a shell to ensure it's
  577. X                     correct execution.  In such instances a
  578. X                     shell is used to invoke the recipe line.  If
  579. X                     no match is found the recipe line is exe-
  580. X                     cuted without the use of a shell.
  581. X
  582. X
  583. X     There is only one character valued macro defined by dmake:
  584. X     SWITCHAR contains the switch character used to introduce
  585. X     options on command lines.  On UNIX it's value is '-', on
  586. X     MSDOS it's value may be '/' or '-'.  The macro is internally
  587. X     defined and is not user setable.  The MSDOS version of dmake
  588. X     attempts to first extract SWITCHAR from an environment vari-
  589. X     able of the same name.  If that fails it then attempts to
  590. X     use the undocumented getswitchar interrupt call, and returns
  591. X     the result of that.  Thus under MSDOS version 4.0 you must
  592. X     set the value of the environment macro SWITCHAR to '/' to
  593. X     obtain predictable behaviour.
  594. X
  595. X     All boolean macros currently understood by dmake correspond
  596. X     directly to the previously defined attributes.  These macros
  597. X     provide a second way to apply global attributes, and
  598. X     represent the preferred method of doing so.  They are used
  599. X     by assigning them a value.  If the value is not a NULL
  600. X     string then the boolean condition is set to on.  If the
  601. X     value is a NULL string then the condition is set to off.
  602. X     There are five conditions defined and they correspond
  603. X     directly to the attributes of the same name.  Their meanings
  604. X     are defined in the ATTRIBUTES section above.  The macros
  605. X     are: .EPILOG, .IGNORE, .MKSARGS, .PRECIOUS, .PROLOG,
  606. X     .SEQUENTIAL, .SILENT, .SWAP, and .USESHELL.  Assigning any
  607. X     of these a non NULL value will globally set the correspond-
  608. X     ing attribute to on.
  609. X
  610. XRUN_TIME MACROS
  611. X     These macros are defined when dmake is making targets, and
  612. X     may take on different values for each target.  $@ is defined
  613. X     to be the full target name, $? is the list of all out of
  614. X     date prerequisites, $& is the list of all prerequisites, $>
  615. X     is the name of the library if the current target is a
  616. X     library member, and $< is the list of prerequisites
  617. X
  618. X
  619. X
  620. XVersion 3.50                    UW                             27
  621. X
  622. X
  623. X
  624. X
  625. XDMAKE(p)               Unsupported Software               DMAKE(p)
  626. X
  627. X
  628. X
  629. X     specified in the current rule.  If the current target had a
  630. X     recipe inferred then $< is the name of the inferred prere-
  631. X     quisite even if the target had a list of prerequisites sup-
  632. X     plied using an explicit rule that did not provide a recipe.
  633. X     In such situations $& gives the full list of prerequisites.
  634. X
  635. X     $* is defined as $(@:db) when making targets with explicit
  636. X     recipes and is defined as the value of % when making targets
  637. X     whose recipe is the result of an inference.  In the first
  638. X     case $* is the target name with no suffix, and in the second
  639. X     case, is the value of the matched % pattern from the associ-
  640. X     ated %-rule.  $^ expands to the set of out of date prere-
  641. X     quisites taken from the current value of $<.  In addition to
  642. X     these, $$ expands to $, {{ expands to {, }} expands to },
  643. X     and the strings <+ and +> are recognized as respectively
  644. X     starting and terminating a text diversion when they appear
  645. X     literally together in the same input line.
  646. X
  647. X     The difference between $? and $^ can best be illustrated by
  648. X     an example, consider:
  649. X
  650. X          fred.out : joe amy hello
  651. X               rules for making fred
  652. X
  653. X          fred.out : my.c your.h his.h her.h   # more prerequisites
  654. X
  655. X     Assume joe, amy, and my.c are newer then fred.out.  When
  656. X     dmake executes the recipe for making fred.out the values of
  657. X     the following macros will be:
  658. X
  659. X          $@ --> fred.out
  660. X          $* --> fred
  661. X          $? --> joe amy my.c  # note the difference between $? and $^
  662. X          $^ --> joe amy
  663. X          $< --> joe amy hello
  664. X          $& --> joe amy hello my.c your.h his.h her.h
  665. X
  666. X
  667. XFUNCTION MACROS
  668. X     Only one function macro is defined at this time.  The
  669. X     $(mktmp ...) construct can be used to create a temporary
  670. X     file containing data and returns the name of that file as
  671. X     it's result.  See the TEXT DIVERSION section for details on
  672. X     its use.  Temporary files created using this macro persist
  673. X     for the duration of the dmake run if processed as part of a
  674. X     macro assignment operation, or until an associated target's
  675. X     recipe is fully completed at which time the temporary file
  676. X     is removed.  NOTE:  Specifying '-v' on the command line
  677. X     causes all temporary files to be retained when dmake exits.
  678. X
  679. X
  680. X
  681. X
  682. X
  683. X
  684. XVersion 3.50                    UW                             28
  685. X
  686. X
  687. X
  688. X
  689. XDMAKE(p)               Unsupported Software               DMAKE(p)
  690. X
  691. X
  692. X
  693. XDYNAMIC PREREQUISITES
  694. X     dmake looks for prerequisites whose names contain macro
  695. X     expansions during target processing.  Any such prerequisites
  696. X     are expanded and the result of the expansion is used as the
  697. X     prerequisite name.  As an example the line:
  698. X
  699. X          fred : $$@.c
  700. X
  701. X     causes the $$@ to be expanded when dmake is making fred, and
  702. X     it resolves to the target fred.  This enables dynamic prere-
  703. X     quisites to be generated.  The value of @ may be modified by
  704. X     any of the valid macro modifiers.  So you can say for exam-
  705. X     ple:
  706. X
  707. X          fred.out : $$(@:b).c
  708. X
  709. X     where the $$(@:b) expands to fred.  Note the use of $$
  710. X     instead of $ to indicate the dynamic expansion, this is due
  711. X     to the fact that the rule line is expanded when it is ini-
  712. X     tially parsed, and $$ then returns $ which later triggers
  713. X     the dynamic prerequisite expansion.  If you really want a $
  714. X     to be part of a prerequisite name you must use $$$$.
  715. X     Dynamic macro expansion is performed in all user defined
  716. X     rules, and the special targets .SOURCE*, and .INCLUDEDIRS.
  717. X
  718. XBINDING TARGETS
  719. X     This operation takes a target name and binds it to an exist-
  720. X     ing file, if possible.  dmake makes a distinction between
  721. X     the internal target name of a target and it's associated
  722. X     external file name.  Thus it is possible for a target's
  723. X     internal name and its external file name to differ.  To per-
  724. X     form the binding, the following set of rules is used.
  725. X     Assume that we are trying to bind a target whose name is of
  726. X     the form X.suff, where .suff is the suffix and X is the stem
  727. X     portion (ie. that part which contains the directory and the
  728. X     basename).  dmake takes this target name and performs a
  729. X     series of search operations that try to find a suitably
  730. X     named file in the external file system.  The search opera-
  731. X     tion is user controlled via the settings of the various
  732. X     .SOURCE targets.
  733. X
  734. X          1.   If target has the .SYMBOL attribute set then look
  735. X               for it in the library.  If found, replace the tar-
  736. X               get name with the library member name and continue
  737. X               with step 2.  If the name is not found then
  738. X               return.
  739. X
  740. X          2.   Extract the suffix portion (that following the
  741. X               `.') of the target name.  If the suffix is not
  742. X               null, look up the special target .SOURCE.<suff>
  743. X               (<suff> is the suffix). If the special target
  744. X               exists then search each directory given in the
  745. X
  746. X
  747. X
  748. XVersion 3.50                    UW                             29
  749. X
  750. X
  751. X
  752. X
  753. XDMAKE(p)               Unsupported Software               DMAKE(p)
  754. X
  755. X
  756. X
  757. X               .SOURCE.<suff> prerequisite list for the target.
  758. X               If the target's suffix was null (ie. .suff was
  759. X               empty) then perform the above search but use the
  760. X               special target .SOURCE.NULL instead.  If at any
  761. X               point a match is found then terminate the search.
  762. X               If a directory in the prerequisite list is the
  763. X               special name `.NULL ' perform a search for the
  764. X               full target name without prepending any directory
  765. X               portion (ie. prepend the NULL directory).  (a
  766. X               default target of '.SOURCE : .NULL' is defined by
  767. X               dmake at startup, and is user redefinable)
  768. X
  769. X          3.   The search in step 2. failed.  Repeat the same
  770. X               search but this time use the special target
  771. X               .SOURCE.
  772. X
  773. X          4.   The search in step 3. failed.  If the target has
  774. X               the library member attribute (.LIBMEMBER) set then
  775. X               try to find the target in the library which was
  776. X               passed along with the .LIBMEMBER attribute (see
  777. X               the MAKING LIBRARIES section).  The bound file
  778. X               name assigned to a target which is successfully
  779. X               located in a library is the same name that would
  780. X               be assigned had the search failed (see 5.).
  781. X
  782. X          5.   The search failed.  Either the target was not
  783. X               found in any of the search directories or no
  784. X               applicable .SOURCE special targets exist.  If
  785. X               applicable .SOURCE special targets exist, but the
  786. X               target was not found, then dmake assigns the first
  787. X               name searched as the bound file name.  If no
  788. X               applicable .SOURCE special targets exist, then the
  789. X               full original target name becomes the bound file
  790. X               name.
  791. X
  792. X     There is potential here for a lot of search operations.  The
  793. X     trick is to define .SOURCE.x special targets with short
  794. X     search lists and leave .SOURCE as short as possible.  The
  795. X     search algorithm has the following useful side effect.  When
  796. X     a target having the .LIBMEMBER (library member) attribute is
  797. X     searched for, it is first searched for as an ordinary file.
  798. X     When a number of library members require updating it is
  799. X     desirable to compile all of them first and to update the
  800. X     library at the end in a single operation.  If one of the
  801. X     members does not compile and dmake stops, then the user may
  802. X     fix the error and make again.  dmake will not remake any of
  803. X     the targets whose object files have already been generated
  804. X     as long as none of their prerequisite files have been modi-
  805. X     fied as a result of the fix.
  806. X
  807. X     When defining .SOURCE and .SOURCE.x targets the construct
  808. X
  809. X
  810. X
  811. X
  812. XVersion 3.50                    UW                             30
  813. X
  814. X
  815. X
  816. X
  817. XDMAKE(p)               Unsupported Software               DMAKE(p)
  818. X
  819. X
  820. X
  821. X          .SOURCE :
  822. X          .SOURCE : fred gery
  823. X
  824. X     is equivalent to
  825. X
  826. X          .SOURCE :- fred gery
  827. X
  828. X     dmake correctly handles the UNIX Make variable VPATH.  By
  829. X     definition VPATH contains a list of ':' separated direc-
  830. X     tories to search when looking for a target.  dmake maps
  831. X     VPATH to the following special rule:
  832. X
  833. X          .SOURCE :^ $(VPATH:s/:/ /)
  834. X
  835. X     Which takes the value of VPATH and sets .SOURCE to the same
  836. X     set of directories as specified in VPATH.
  837. X
  838. XPERCENT(%) RULES AND MAKING INFERENCES
  839. X     When dmake makes a target it's set of prerequisites (if any)
  840. X     must exist and the target must have a recipe which dmake can
  841. X     use to make it.  If the makefile does not specify an expli-
  842. X     cit recipe for the target then dmake uses special rules to
  843. X     try to infer a recipe which it can use to make the target.
  844. X     Previous versions of Make perform this task by using rules
  845. X     that are defined by targets of the form .<suffix>.<suffix>
  846. X     and by using the .SUFFIXES list of suffixes.  The exact
  847. X     workings of this mechanism were sometimes difficult to
  848. X     understand and often limiting in their usefulness.  Instead,
  849. X     dmake supports the concept of %-meta rules. The syntax and
  850. X     semantics of these rules differ from standard rule lines as
  851. X     follows:
  852. X
  853. X          <%-target> [<attributes>] <ruleop> [<%-prerequisites>] [;<recipe>]
  854. X
  855. X     where %-target is a target containing exactly a single `%'
  856. X     sign, attributes is a list (possibly empty) of attributes,
  857. X     ruleop is the standard set of rule operators, %-prere-
  858. X     quisites , if present, is a list of prerequisites containing
  859. X     zero or more `%' signs, and recipe, if present, is the first
  860. X     line of the recipe.
  861. X
  862. X     The %-target defines a pattern against which a target whose
  863. X     recipe is being inferred gets matched.  The pattern match
  864. X     goes as follows:  all chars are matched exactly from left to
  865. X     right up to but not including the % sign in the pattern, %
  866. X     then matches the longest string from the actual target name
  867. X     not ending in the suffix given after the % sign in the pat-
  868. X     tern.  Consider the following examples:
  869. X
  870. X          %.c       matches fred.c but not joe.c.Z
  871. X          dir/%.c   matches dir/fred.c but not dd/fred.c
  872. X          fred/%    matches fred/joe.c but not f/joe.c
  873. X
  874. X
  875. X
  876. XVersion 3.50                    UW                             31
  877. X
  878. X
  879. X
  880. X
  881. XDMAKE(p)               Unsupported Software               DMAKE(p)
  882. X
  883. X
  884. X
  885. X          %         matches anything
  886. X
  887. X     In each case the part of the target name that matched the %
  888. X     sign is retained and is substituted for any % signs in the
  889. X     prerequisite list of the %-meta rule when the rule is
  890. X     selected during inference and dmake constructs the depen-
  891. X     dency specified by the %-meta rule for the actual target.
  892. X     As an example the following %-meta rules describe the fol-
  893. X     lowing:
  894. X
  895. X          %.c : %.y ; recipe...
  896. X
  897. X     describes how to make any file ending in .c if a correspond-
  898. X     ing file ending in .y can be found.
  899. X
  900. X          foo%.o : fee%.k ; recipe...
  901. X
  902. X     is used to describe how to make fooxxxx.o from feexxxx.k.
  903. X
  904. X          %.a :; recipe...
  905. X
  906. X     describes how to make a file whose suffix is .a without
  907. X     inferring any prerequisites.
  908. X
  909. X          %.c : %.y yaccsrc/%.y ; recipe...
  910. X
  911. X     is a short form for the construct:
  912. X
  913. X          %.c : %.y ; recipe...
  914. X          %.c : yaccsrc/%.y ; recipe...
  915. X
  916. X     ie. It is possible to specify the same recipe for two
  917. X     %-rules by giving more than one prerequisite in the prere-
  918. X     quisite list.  A more interesting example is:
  919. X
  920. X          % : RCS/%,v ; co $@
  921. X
  922. X     which describes how to take any target and check it out of
  923. X     the RCS directory if the corresponding file exists in the
  924. X     RCS directory.  The equivalent SCCS rule would be:
  925. X
  926. X          % : s.% ; get $@
  927. X
  928. X
  929. X     The previous RCS example defines an infinite rule, because
  930. X     it says how to make anything from RCS/%,v, and anything also
  931. X     includes RCS/fred.c,v.  To limit the size of the graph that
  932. X     results from such rules dmake uses the macro variable PREP
  933. X     (stands for % repetition).  By default the value of this
  934. X     variable is 0, which says that no repetitions of a %-rule
  935. X     are to be generated.  If it is set to something greater than
  936. X     0, then that many repetitions of any infinite %-rule are
  937. X
  938. X
  939. X
  940. XVersion 3.50                    UW                             32
  941. X
  942. X
  943. X
  944. X
  945. XDMAKE(p)               Unsupported Software               DMAKE(p)
  946. X
  947. X
  948. X
  949. X     allowed.  If in the above example PREP was set to 1, then
  950. X     dmake would generate the dependency graph:
  951. X
  952. X          % --> RCS/%,v --> RCS/RCS/%,v,v
  953. X
  954. X     Where each link is assigned the same recipe as the first
  955. X     link.  PREP should be used only in special cases, since it
  956. X     may result in a large increase in the number of possible
  957. X     prerequisites tested.
  958. X
  959. X     dmake supports dynamic prerequisite generation for prere-
  960. X     quisites of %-meta rules.  This is best illustrated by an
  961. X     example.  The RCS rule shown above can infer how to check
  962. X     out a file from a corresponding RCS file only if the target
  963. X     is a simple file name with no directory information.  That
  964. X     is, the above rule can infer how to find RCS/fred.c,v from
  965. X     the target fred.c, but cannot infer how to find
  966. X     srcdir/RCS/fred.c,v from srcdir/fred.c because the above
  967. X     rule will cause dmake to look for RCS/srcdir/fred.c,v; which
  968. X     does not exist (assume that srcdir has it's own RCS direc-
  969. X     tory as is the common case).
  970. X
  971. X     A more versatile formulation of the above RCS check out rule
  972. X     is the following:
  973. X
  974. X          % :  $$(@:d)RCS/$$(@:f),v : co $@
  975. X
  976. X     This rule uses the dynamic macro $@ to specify the prere-
  977. X     quisite to try to infer.  During inference of this rule the
  978. X     macro $@ is set to the value of the target of the %-meta
  979. X     rule and the appropriate prerequisite is generated by
  980. X     extracting the directory portion of the target name (if
  981. X     any), appending the string RCS/ to it, and appending the
  982. SHAR_EOF
  983. echo "End of part 17"
  984. echo "File man/dmake.nc is continued in part 18"
  985. echo "18" > s2_seq_.tmp
  986. exit 0
  987.  
  988.