home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / dmake40.zip / man / dmake.tf.B < prev    next >
Text File  |  1994-10-23  |  53KB  |  1,441 lines

  1. non\-group recipe with a line that contains only white\-space.
  2. This mode does not effect the parsing of group recipes bracketed by [].
  3. .IP \fBAUGMAKE\fP 1.6i
  4. If set to a non NULL value will enable the transformation of special
  5. meta targets to support special AUGMAKE inferences (See the COMPATIBILITY
  6. section).
  7. .IP \fBDIRBRKSTR\fP 1.6i
  8. Contains the string of chars used to terminate
  9. the name of a directory in a pathname.
  10. Under UNIX its value is "/", under MSDOS its value is "/\e:".
  11. .IP \fBDIRSEPSTR\fP 1.6i
  12. Contains the string that is used to separate directory components when
  13. path names are constructed.  It is defined with a default value at startup.
  14. .IP \fBDIVFILE\fP 1.6i
  15. Is defined in the startup file and gives the name that should be returned for
  16. the diversion file name when used in
  17. $(mktmp ...) expansions, see the TEXT DIVERSION section for details.
  18. .IP \fBDYNAMICNESTINGLEVEL\fP 1.6i
  19. Specifies the maximum number of recursive dynamic macro expansions.  Its
  20. initial value is 100.
  21. .IP \fB.KEEP_STATE\fP 1.6i
  22. Assigning this macro a value tells
  23. .B dmake
  24. the name of the state file to use and turns on the keeping of state
  25. information for any targets that are brought up to date by the make.
  26. .IP \fBGROUPFLAGS\fP 1.6i
  27. This macro gives the set of flags to pass to the shell when
  28. invoking it to execute a group recipe.  The value of the macro is the
  29. list of flags with a leading switch indicator.  (ie. `\-' under UNIX)
  30. .IP \fBGROUPSHELL\fP 1.6i
  31. This macro defines the full
  32. path to the executable image to be used as the shell when
  33. processing group recipes.  This macro must be defined if group recipes are
  34. used.  It is assigned a default value in the startup makefile.  Under UNIX
  35. this value is /bin/sh.
  36. .IP \fBGROUPSUFFIX\fP 1.6i
  37. If defined, this macro gives the string to use as a suffix
  38. when creating group recipe files to be handed to the command interpreter.
  39. For example, if it is defined as .sh, then all
  40. temporary files created by \fBdmake\fP will end in the suffix .sh.
  41. Under MSDOS if you are using command.com as your GROUPSHELL, then this suffix
  42. must be set to .bat in order for group recipes to function correctly.
  43. The setting of GROUPSUFFIX and GROUPSHELL is done automatically for
  44. command.com in the startup.mk files.
  45. .IP \fBMAKE\fP 1.6i
  46. Is defined in the startup file by default.
  47. The string $(MAKE) is recognized when
  48. using the \-n option for single line recipes.  Initially this macro is defined
  49. to have the value "$(MAKECMD) $(MFLAGS)".
  50. .IP \fBMAKESTARTUP\fP 1.6i
  51. This macro defines the full path to the initial startup
  52. makefile.  Use the \fB\-V\fP command line option to discover its initial
  53. value.
  54. .IP \fBMAXLINELENGTH\fP 1.6i
  55. This macro defines the maximum size of a single line of
  56. makefile input text.  The size is specified as a number, the default value
  57. is defined internally and is shown via the \fB\-V\fP option.
  58. A buffer of this size plus 2 is allocated for reading makefile text.  The
  59. buffer is freed before any targets are made, thereby allowing files containing
  60. long input lines to be processed without consuming memory during the actual
  61. make.
  62. This macro can only be used to extend the line length beyond it's default
  63. minimum value.
  64. .IP \fBMAXPROCESS\fP 1.6i
  65. Specify the maximum number of child processes to use when making targets.
  66. The default value of this macro is "1" and its value cannot exceed the value
  67. of the macro MAXPROCESSLIMIT.  Setting the value of MAXPROCESS on the command
  68. line or in the makefile is equivalent to supplying a corresponding value to
  69. the -P flag on the command line.
  70. .IP \fBPREP\fP 1.6i
  71. This macro defines the number of iterations to be expanded
  72. automatically when processing % rule definitions of the form:
  73. .sp
  74. % : %.suff
  75. .sp
  76. See the sections on PERCENT(%) RULES for details on how PREP is used.
  77. .IP \fBSHELL\fP 1.6i
  78. This macro defines the full path to the executable
  79. image to be used as the shell when
  80. processing single line recipes.  This macro must be defined if recipes
  81. requiring the shell for execution are to be used.
  82. It is assigned a default value in the startup makefile.
  83. Under UNIX this value is /bin/sh.
  84. .IP \fBSHELLFLAGS\fP 1.6i
  85. This macro gives the set of flags to pass to the shell when
  86. invoking it to execute a single line recipe.  The value of the macro is the
  87. list of flags with a leading switch indicator.  (ie. `\-' under UNIX)
  88. .IP \fBSHELLMETAS\fP 1.6i
  89. Each time
  90. .B dmake
  91. executes a single recipe line (not a group recipe) the line is
  92. searched for any occurrence of a character defined in the value of SHELLMETAS.
  93. If such a character is found the recipe line is defined to require a shell
  94. to ensure its correct execution.  In such instances
  95. a shell is used to invoke the recipe line.
  96. If no match is found the recipe line is executed without the use of a shell.
  97. .sp
  98. .PP
  99. There is only one character valued macro defined by \fBdmake\fP:
  100. \fBSWITCHAR\fP contains the switch character used
  101. to introduce options on command lines.  For UNIX its value is `\-', and for
  102. MSDOS its value may be `/' or `\-'.
  103. The macro is internally defined and is not user setable.
  104. The MSDOS version of \fBdmake\fP attempts to first extract SWITCHAR from an
  105. environment variable of the same name.  If that fails it then attempts to
  106. use the undocumented getswitchar system call, and returns the result of
  107. that.  Under MSDOS version 4.0 you must set the value of the environment
  108. macro SWITCHAR to '/' to obtain predictable behavior.
  109. .PP
  110. All boolean macros currently understood by 
  111. .B dmake
  112. correspond directly to the previously defined attributes.
  113. These macros provide
  114. a second way to apply global attributes, and represent the
  115. preferred method of doing so.  They are used by assigning them a
  116. value.  If the value is not a NULL string then the boolean condition
  117. is set to on.
  118. If the value is a NULL string then the condition is set to off.
  119. There are five conditions defined and they correspond directly to the
  120. attributes of the same name.  Their meanings are defined in the ATTRIBUTES
  121. section above.
  122. The macros are:
  123. \&\fB.EPILOG\fP,
  124. \&\fB.IGNORE\fP,
  125. \&\fB.MKSARGS\fP,
  126. \&\fB.NOINFER\fP,
  127. \&\fB.PRECIOUS\fP,
  128. \&\fB.PROLOG\fP,
  129. \&\fB.SEQUENTIAL\fP,
  130. \&\fB.SILENT\fP,
  131. \&\fB.SWAP\fP, and
  132. \&\fB.USESHELL\fP.
  133. Assigning any of these a non NULL value will globally set
  134. the corresponding attribute to on.
  135. .SH "RUN_TIME MACROS"
  136. These macros are defined
  137. when \fBdmake\fP is making targets, and may take on different values for each
  138. target.  \fB$@\fP is defined to be the full target name, \fB$?\fP is the
  139. list of all out of date prerequisites, \fB$&\fP is the list of all
  140. prerequisites, \fB$>\fP is the name of the library if the current target is a
  141. library member, and
  142. \fB$<\fP is the list of prerequisites specified in the current rule.
  143. If the current target had a recipe inferred then \fB$<\fP is the name of the
  144. inferred prerequisite even if the target had a list of prerequisites supplied
  145. using an explicit rule that did not provide a recipe.  In such situations
  146. \fB$&\fP gives the full list of prerequisites.
  147. .PP
  148. \fB$*\fP is defined as
  149. \fB$(@:db)\fP when making targets with explicit recipes and is defined as the
  150. value of % when making targets whose recipe is the result of an inference.
  151. In the first case \fB$*\fP is the target name with no suffix,
  152. and in the second case, is the value of the matched % pattern from
  153. the associated %-rule.
  154. \fB$^\fP expands to the set of out of date prerequisites taken from the
  155. current value of \fB$<\fP.
  156. In addition to these,
  157. \fB$$\fP expands to $, \fB{{\fP expands to {, \fB}}\fP expands to }, and the
  158. strings \fB<+\fP and \fB+>\fP are recognized
  159. as respectively starting and terminating a text diversion when they appear
  160. literally together in the same input line.
  161. .PP
  162. The difference between $? and $^ can best be illustrated by an example,
  163. consider:
  164. .RS
  165. .sp
  166. .nf
  167. fred.out : joe amy hello
  168. \trules for making fred
  169.  
  170. fred.out : my.c your.h his.h her.h      # more prerequisites
  171. .fi
  172. .sp
  173. .RE
  174. Assume joe, amy, and my.c are newer then fred.out.  When
  175. .B dmake
  176. executes the recipe for making fred.out the values of the following macros
  177. will be:
  178. .RS
  179. .sp
  180. .nf
  181. .Is "$@ "
  182. .Ii "$@"
  183. --> fred.out
  184. .Ii "$*"
  185. --> fred
  186. .Ii "$?"
  187. --> joe amy my.c  # note the difference between $? and $^
  188. .Ii "$^"
  189. --> joe amy
  190. .Ii "$<"
  191. --> joe amy hello
  192. .Ii "$&"
  193. --> joe amy hello my.c your.h his.h her.h
  194. .fi
  195. .sp
  196. .RE
  197. .SH "FUNCTION MACROS"
  198. .B dmake
  199. supports a full set of functional macros.  One of these, the $(mktmp ...)
  200. macro, is discussed in detail in the TEXT DIVERSION section and is not
  201. covered here.
  202. .RS
  203. .sp
  204. .IP "$(\fBassign\fP \fBexpression\fP)"
  205. Causes \fIexpression\fP to be parsed as a macro assignment expression and results
  206. in the specified assignment being made.  An error is issued if the assignment
  207. is not syntatically correct.  \fIexpression\fP may contain white space.  This is
  208. in effect a dynamic macro assignment facility and may appear anywhere any
  209. other macro may appear.  The result of the expanding a dynamic macro
  210. assignment expression is the name of the macro that was assigned and $(NULL)
  211. if the \fIexpression\fP is not a valid macro assignment expression.
  212. Some examples are:
  213. .sp
  214. .nf
  215. $(assign foo := fred)
  216. $(assign $(indirect_macro_name) +:= $(morejunk))
  217. .fi
  218. .IP "$(\fBnull\fP,\fItext\fP \fBtrue\fP \fBfalse\fP)"
  219. expands the value of
  220. .I text.
  221. If it is NULL then the macro returns the value of the expansion of \fBtrue\fP
  222. and the expansion of \fBfalse\fP otherwise.  The terms \fBtrue\fP, and
  223. \fBfalse\fP must be strings containing no white\-space.
  224. .IP "$(\fB!null\fP,\fItext\fP \fBtrue\fP \fBfalse\fP)"
  225. Behaves identically to the previous macro except that the 
  226. .B true
  227. string is chosen if the expansion of
  228. .I text
  229. is not NULL.
  230. .IP "$(\fBeq\fP,\fItext_a\fP,\fItext_b\fP \fBtrue\fP \fBfalse\fP)"
  231. expands
  232. .I text_a
  233. and
  234. .I text_b
  235. and compares their results.  If equal it returns the result of the expansion
  236. of the 
  237. .B true
  238. term, otherwise it returns the expansion of the
  239. .B false
  240. term.
  241. .IP "$(\fB!eq\fP,\fItext_a\fP,\fItext_b\fP \fBtrue\fP \fBfalse\fP)"
  242. Behaves identically to the previous macro except that the 
  243. .B true
  244. string is chosen if the expansions of the two strings are not equal
  245. .IP "$(\fBnil\fP \fBexpression\fP)"
  246. Always returns the value of $(NULL) regardless of what \fIexpression\fP is.
  247. This function macro can be used to discard results of expanding
  248. macro expressions.
  249. .IP "$(\fBshell\fP \fBcommand\fP)"
  250. Runs \fIcommand\fP as if it were part of a recipe and returns,
  251. separated by a single space, all the non-white
  252. space terms written to stdout by the command.
  253. For example:
  254. .RS
  255. .RS
  256. .sp
  257. $(shell ls *.c)
  258. .sp
  259. .RE
  260. will return \fI"a.c b.c c.c d.c"\fP if the files exist in the current
  261. directory.  The recipe modification flags \fB[+@%\-]\fP are honored if they
  262. appear as the first characters in the command.  For example:
  263. .RS
  264. .sp
  265. $(shell +ls *.c)
  266. .sp
  267. .RE
  268. will run the command using the current shell.
  269. .RE
  270. .IP "$(\fBshell,expand\fP \fBcommand\fP)"
  271. Is an extension to the \fB$(shell...\fP function macro that expands the result
  272. of running \fBcommand\fP.
  273. .IP "$(\fBsort\fP \fBlist\fP)"
  274. Will take all white\-space separated tokens in \fIlist\fP and will
  275. return their sorted equivalent list.
  276. .IP "$(\fBstrip\fP \fBdata\fP)"
  277. Will replace all strings of white\-space in data by a single space.
  278. .IP "$(\fBsubst\fP,\fIpat\fP,\fIreplacement\fP \fBdata\fP)"
  279. Will search for \fIpat\fP in
  280. .B data
  281. and will replace any occurrence of
  282. .I pat
  283. with the
  284. .I replacement
  285. string.  The expansion
  286. .RS
  287. .sp
  288. $(subst,.o,.c $(OBJECTS))
  289. .sp
  290. .RE
  291. is equivalent to:
  292. .RS
  293. .sp
  294. $(OBJECTS:s/.o/.c/)
  295. .sp
  296. .RE
  297. .RE
  298. .SH "CONDITIONAL MACROS"
  299. .B dmake
  300. supports conditional macros.  These allow the definition of target specific
  301. macro values.  You can now say the following:
  302. .RS
  303. .sp
  304. \fBtarget\fP ?= \fIMacroName MacroOp Value\fP
  305. .sp
  306. .RE
  307. This creates a definition for \fIMacroName\fP whose value is \fIValue\fP
  308. only when \fBtarget\fP is being made.  You may use a conditional macro
  309. assignment anywhere that a regular macro assignment may appear, including
  310. as the value of a $(assign ...) macro.
  311. .LP
  312. The new definition is associated with the most recent cell definition
  313. for \fBtarget\fP.  If no prior definition exists then one is created.  The
  314. implications of this are immediately evident in the following example:
  315. .sp
  316. .RS
  317. .nf
  318. foo := hello
  319. .sp
  320. all : cond;@echo "all done, foo=[$(foo)] bar=[$(bar)]"
  321. .sp
  322. cond ?= bar := global decl
  323. .sp
  324. cond .SETDIR=unix::;@echo $(foo) $(bar)
  325. cond ?= foo := hi
  326. .sp
  327. cond .SETDIR=msdos::;@echo $(foo) $(bar)
  328.     cond ?= foo := hihi
  329. .fi
  330. .RE
  331. .sp
  332. The first conditional assignment creates a binding for 'bar' that is
  333. activated when 'cond' is made.  The bindings following the :: definitions are
  334. activated when their respective recipe rules are used.  Thus the
  335. first binding serves to provide a global value for 'bar' while any of the
  336. cond :: rules are processed, and the local bindings for 'foo' come into
  337. effect when their associated :: rule is processed.
  338. .LP
  339. Conditionals for targets of .UPDATEALL are all activated before the
  340. target group is made.  Assignments are processed in order.  Note that
  341. the value of a conditional macro assignment is NOT AVAILABLE until the
  342. associated target is made, thus the construct
  343. .sp
  344. .RS
  345. .nf
  346. mytarget ?= bar := hello
  347. mytarget ?= foo := $(bar)
  348. .fi
  349. .RE
  350. .sp
  351. results in $(foo) expanding to "", if you want the result to be "hello"
  352. you must use:
  353. .sp
  354. .RS
  355. .nf
  356. mytarget ?= bar := hello
  357. mytarget ?= foo  = $(bar)
  358. .fi
  359. .RE
  360. .sp
  361. Once a target is made any associated conditional macros are deactivated
  362. and their values are no longer available.  Activation occurrs after all
  363. inference, and .SETDIR directives have been processed and after $@ is
  364. assigned, but before prerequisites are processed; thereby making the values of
  365. conditional macro definitions available during construction of prerequisites.
  366. .LP
  367. If a %-meta rule target has associated conditional macro assignments,
  368. and the rule is chosen by the inference algorithm then the conditional
  369. macro assignments are inferred together with the associated recipe.
  370. .SH "DYNAMIC PREREQUISITES"
  371. .B dmake
  372. looks for prerequisites whose names contain macro expansions during target
  373. processing.  Any such prerequisites are expanded and the result of the
  374. expansion is used as the prerequisite name.  As an example the line:
  375. .sp
  376. \tfred : $$@.c
  377. .sp
  378. causes the $$@ to be expanded when \fBdmake\fP is making fred, and it resolves
  379. to the target \fIfred\fP.
  380. This enables dynamic prerequisites to be generated.  The value
  381. of @ may be modified by any of the valid macro modifiers.  So you can say for
  382. example:
  383. .sp
  384. \tfred.out : $$(@:b).c
  385. .sp
  386. where the $$(@:b) expands to \fIfred\fP.
  387. Note the use of $$ instead of $ to indicate the dynamic expansion, this
  388. is due to the fact that the rule line is expanded when it is initially parsed,
  389. and $$ then returns $ which later triggers the dynamic prerequisite expansion.
  390. If you really want a $ to be part of a prerequisite name you must use $$$$.
  391. Dynamic macro expansion is performed in all user defined rules,
  392. and the special targets .SOURCE*, and .INCLUDEDIRS.
  393. .PP
  394. If dynamic macro expansion results in multiple white space separated tokens
  395. then these are inserted into the prerequisite list inplace of the dynamic
  396. prerequisite.  If the new list contains additional dynamic prerequisites they
  397. will be expanded when they are processed.  The level of recursion in this
  398. expansion is controlled by the value of the variable \fBDYNAMICNESTINGLEVEL\fP
  399. and is set to 100 by default.
  400. .SH "BINDING TARGETS"
  401. This operation takes a target name and binds it to an existing file, if
  402. possible.
  403. .B dmake
  404. makes a distinction between the internal target name of a target and its
  405. associated external file name.
  406. Thus it is possible for a target's internal name and its external
  407. file name to differ.
  408. To perform the binding, the following set of rules is used.
  409. Assume that we are
  410. trying to bind a target whose name is of the form \fIX.suff\fP,
  411. where \fI.suff\fP is the suffix and \fIX\fP is the stem portion
  412. (ie. that part which contains the directory and the basename).
  413. .B dmake
  414. takes this target name and performs a series of search operations that try to
  415. find a suitably named file in the external file system.
  416. The search operation is user controlled
  417. via the settings of the various .SOURCE targets.
  418. .RS
  419. .IP 1.
  420. If target has the .SYMBOL attribute set then look for it in the library.
  421. If found, replace the target name with the library member name and continue
  422. with step 2.  If the name is not found then return.
  423. .IP 2.
  424. Extract the suffix portion (that following the `.') of the target name.
  425. If the suffix is not null, look up the special target .SOURCE.<suff>
  426. (<suff> is the suffix).  
  427. If the special target exists then search each directory given in
  428. the .SOURCE.<suff> prerequisite list for the target.
  429. If the target's suffix was null (ie. \fI.suff\fP was empty) then 
  430. perform the above search but use the special target .SOURCE.NULL instead.
  431. If at any point a match is found then terminate the search.
  432. If a directory in the prerequisite list is the special name `.NULL ' perform
  433. a search for the full target name without prepending any directory portion
  434. (ie. prepend the NULL directory).
  435. .IP 3.
  436. The search in step 2. failed.  Repeat the same search but this time
  437. use the special target .SOURCE.
  438. (a default target of '.SOURCE : .NULL' is defined by \fBdmake\fP at startup,
  439. and is user redefinable)
  440. .IP 4.
  441. The search in step 3. failed.
  442. If the target has the library member attribute (.LIBMEMBER)
  443. set then try to find the target in the library which was passed along
  444. with the .LIBMEMBER attribute (see the MAKING LIBRARIES section).
  445. The bound file name assigned to a target which is successfully
  446. located in a library is the same name that would be assigned had the search
  447. failed (see 5.).
  448. .IP 5.
  449. The search failed.  Either the target was not found in any of the search
  450. directories or no applicable .SOURCE special targets exist.
  451. If applicable .SOURCE special targets exist, but the target was not found,
  452. then \fBdmake\fP assigns the first name searched as the bound file name.
  453. If no applicable .SOURCE special targets exist,
  454. then the full original target name becomes the bound file name.
  455. .RE
  456. .PP
  457. There is potential here for a lot of search operations.  The trick is to
  458. define .SOURCE.x special targets with short search lists and leave .SOURCE
  459. as short as possible.
  460. The search algorithm has the following useful side effect.
  461. When a target having the .LIBMEMBER (library member) attribute is searched for,
  462. it is first searched for as an ordinary file.
  463. When a number of library members require updating it is desirable to compile
  464. all of them first and to update the library at the end in a single operation.
  465. If one of the members does not compile and \fBdmake\fP stops, then
  466. the user may fix the error and make again.  \fBdmake\fP will not remake any
  467. of the targets whose object files have already been generated as long as
  468. none of their prerequisite files have been modified as a result of the fix.
  469. .PP
  470. When \fBdmake\fP constructs target pathnames './' substrings are removed and
  471. substrings of the form 'foo/..' are eliminated.  This may result in somewhat
  472. unexpected values of the macro expansion \fB$@\fP, but is infact the corect
  473. result.
  474. .PP
  475. When defining .SOURCE and .SOURCE.x targets the construct
  476. .sp
  477. \t.SOURCE :
  478. .br
  479. \t.SOURCE : fred gery
  480. .sp
  481. is equivalent to
  482. .sp
  483. \t.SOURCE :\- fred gery
  484. .PP
  485. \fBdmake\fP correctly handles the UNIX Make variable VPATH.  By definition VPATH
  486. contains a list of ':' separated directories to search when looking for a
  487. target.  \fBdmake\fP maps VPATH to the following special rule:
  488. .sp
  489. \t.SOURCE :^ $(VPATH:s/:/ /)
  490. .sp
  491. Which takes the value of VPATH and sets .SOURCE to the same set of directories
  492. as specified in VPATH.
  493. .SH "PERCENT(%) RULES AND MAKING INFERENCES"
  494. When \fBdmake\fP makes a target, the target's set of prerequisites (if any)
  495. must exist and the target must have a recipe which \fBdmake\fP
  496. can use to make it.
  497. If the makefile does not specify an explicit recipe for the target then
  498. .B dmake
  499. uses special rules to try to infer a recipe which it can use
  500. to make the target.  Previous versions of Make perform this task by using
  501. rules that are defined by targets of the form .<suffix>.<suffix> and by
  502. using the .SUFFIXES list of suffixes.  The exact workings of this mechanism
  503. were sometimes difficult to understand and often limiting in their usefulness.
  504. Instead, \fBdmake\fP supports the concept of \fI%-meta\fP rules.  
  505. The syntax and semantics of these rules differ from standard rule lines as
  506. follows:
  507. .sp
  508. .nf
  509. .RS
  510. \fI<%-target>\fP [\fI<attributes>\fP] \fI<ruleop>\fP [\fI<%-prerequisites>\fP] [;\fI<recipe>\fP]
  511. .RE
  512. .fi
  513. .sp
  514. where \fI%-target\fP is a target containing exactly a single `%' sign,
  515. .I attributes
  516. is a list (possibly empty) of attributes,
  517. .I ruleop
  518. is the standard set of rule operators,
  519. .I "%-prerequisites"
  520. \&, if present, is a list of prerequisites containing zero or more `%' signs,
  521. and
  522. .I recipe,
  523. if present, is the first line of the recipe.
  524. .PP
  525. The
  526. .I %-target
  527. defines a pattern against which a target whose recipe is
  528. being inferred gets matched.  The pattern match goes as follows:  all chars are
  529. matched exactly from left to right up to but not including the % sign in the
  530. pattern, % then matches the longest string from the actual target name
  531. not ending in
  532. the suffix given after the % sign in the pattern.
  533. Consider the following examples:
  534. .RS
  535. .sp
  536. .nf
  537. .Is "dir/%.c   "
  538. .Ii "%.c"
  539. matches fred.c but not joe.c.Z
  540. .Ii "dir/%.c"
  541. matches dir/fred.c but not dd/fred.c
  542. .Ii "fred/%"
  543. matches fred/joe.c but not f/joe.c
  544. .Ii "%"
  545. matches anything
  546. .fi
  547. .sp
  548. .RE
  549. In each case the part of the target name that matched the % sign is retained
  550. and is substituted for any % signs in the prerequisite list of the %-meta rule
  551. when the rule is selected during inference and
  552. .B dmake
  553. constructs the new dependency.
  554. As an example the following %-meta rules describe the following:
  555. .RS
  556. .sp
  557. %.c : %.y ; recipe...
  558. .sp
  559. .RE
  560. describes how to make any file ending in .c if a corresponding file ending
  561. in .y can be found.
  562. .RS
  563. .sp
  564. foo%.o : fee%.k ; recipe...
  565. .sp
  566. .RE
  567. is used to describe how to make fooxxxx.o from feexxxx.k.
  568. .RS
  569. .sp
  570. %.a :; recipe...
  571. .sp
  572. .RE
  573. describes how to make a file whose suffix is .a without inferring any
  574. prerequisites.
  575. .RS
  576. .sp
  577. %.c : %.y yaccsrc/%.y ; recipe...
  578. .sp
  579. .RE
  580. is a short form for the construct:
  581. .RS
  582. .sp
  583. %.c : %.y ; recipe...
  584. .br
  585. %.c : yaccsrc/%.y ; recipe...
  586. .sp
  587. .RE
  588. ie. It is possible to specify the same recipe for two %-rules by giving
  589. more than one prerequisite in the prerequisite list.
  590. A more interesting example is:
  591. .RS
  592. .sp
  593. % : RCS/%,v ; co $<
  594. .sp
  595. .RE
  596. which describes how to take any target and check it out of
  597. the RCS directory if the corresponding file exists in the RCS directory.
  598. The equivalent SCCS rule would be:
  599. .RS
  600. .sp
  601. % : s.% ; get $<
  602. .sp
  603. .RE
  604. .PP
  605. The previous RCS example defines an infinite rule, because it says how to make
  606. .I anything
  607. from RCS/%,v, and
  608. .I anything
  609. also includes RCS/fred.c,v.
  610. To limit the size of the graph that results from such rules
  611. .B dmake
  612. uses the macro variable PREP (stands for % repetition).  By default the value
  613. of this variable is 0, which says that no repetitions of a %-rule are to be
  614. generated.  If it is set to something greater than 0, then that many
  615. repetitions of any infinite %-rule are allowed.  If in the above
  616. example PREP was set to 1, then \fBdmake\fP would generate the dependency
  617. graph:
  618. .RS
  619. .sp
  620. % --> RCS/%,v --> RCS/RCS/%,v,v
  621. .sp
  622. .RE
  623. Where each link is assigned the same recipe as the first link.
  624. PREP should be used only in special cases, since it may result in
  625. a large increase in the number of possible prerequisites tested.
  626. .B dmake
  627. further assumes that any target that has no suffix can be made from
  628. a prerequisite that has at least one suffix.
  629. .PP
  630. .B dmake
  631. supports dynamic prerequisite generation for prerequisites of %-meta rules.
  632. This is best illustrated by an example.  The RCS rule shown above can infer
  633. how to check out a file from a corresponding RCS file only if the target
  634. is a simple file name with no directory information.  That is, the above rule
  635. can infer how to find \fIRCS/fred.c,v\fP from the target \fIfred.c\fP,
  636. but cannot infer how to find \fIsrcdir/RCS/fred.c,v\fP from \fIsrcdir/fred.c\fP
  637. because the above rule will cause \fBdmake\fP to look for RCS/srcdir/fred.c,v;
  638. which does not exist (assume that srcdir has its own RCS directory as is the
  639. common case).
  640. .PP
  641. A more versatile formulation of the above RCS check out rule is the following:
  642. .RS
  643. .sp
  644. % :  $$(@:d)RCS/$$(@:f),v : co $@
  645. .sp
  646. .RE
  647. This rule uses the dynamic macro $@ to specify the prerequisite to try to
  648. infer.  During inference of this rule the macro $@ is set to the value of
  649. the target of the %-meta rule and the appropriate prerequisite is generated by
  650. extracting the directory portion of the target name (if any), appending the
  651. string \fIRCS/\fP to it, and appending the target file name with a trailing
  652. \fI,v\fP attached to the previous result.
  653. .PP
  654. .B dmake
  655. can also infer indirect prerequisites.
  656. An inferred target can have a list of prerequisites added that will not
  657. show up in the value of $< but will show up in the value of $? and $&.
  658. Indirect prerequisites are specified in an inference rule by quoting the
  659. prerequisite with single quotes.  For example, if you had the explicit
  660. dependency:
  661. .RS
  662. .sp
  663. .nf
  664. fred.o : fred.c ; rule to make fred.o
  665. fred.o : local.h
  666. .fi
  667. .sp
  668. .RE
  669. then this can be inferred for fred.o from the following inference rule:
  670. .RS
  671. .sp
  672. %.o : %.c 'local.h' ; rule to make a .o from a .c
  673. .sp
  674. .RE
  675. You may infer indirect prerequisites that are a function of the value of '%'
  676. in the current rule.  The meta-rule:
  677. .RS
  678. .sp
  679. %.o : %.c '$(INC)/%.h' ; rule to make a .o from a .c
  680. .sp
  681. .RE
  682. infers an indirect prerequisite found in the INC directory whose name is the
  683. same as the expansion of $(INC), and the prerequisite name depends on the
  684. base name of the current target.
  685. The set of indirect prerequisites is attached to the meta rule in which they
  686. are specified and are inferred only if the rule is used to infer a recipe
  687. for a target.  They do not play an active role in driving the inference
  688. algorithm.
  689. The construct:
  690. .RS
  691. .sp
  692. %.o : %.c %.f 'local.h'; recipe
  693. .sp
  694. .RE
  695. is equivalent to:
  696. .RS
  697. .sp
  698. .nf
  699. %.o : %.c 'local.h' : recipe
  700. .fi
  701. .sp
  702. .RE
  703. while:
  704. .RS
  705. .sp
  706. %.o :| %.c %.f 'local.h'; recipe
  707. .sp
  708. .RE
  709. is equivalent to:
  710. .RS
  711. .sp
  712. .nf
  713. %.o : %.c 'local.h' : recipe
  714. %.o : %.f 'local.h' : recipe
  715. .fi
  716. .sp
  717. .RE
  718. .PP
  719. If any of the attributes .SETDIR, .EPILOG, .PROLOG, .SILENT,
  720. \&.USESHELL, .SWAP, .PRECIOUS, .LIBRARY, .NOSTATE and .IGNORE
  721. are given for a %-rule then when that rule is bound to a target
  722. as the result of an inference, the target's set of attributes is augmented by
  723. the attributes from the above set that are specified in the bound %-rule.
  724. Other attributes specified for %-meta rules are not inherited by the target.
  725. The .SETDIR attribute is treated in a special way.
  726. If the target already had a .SETDIR attribute set then
  727. .B dmake
  728. changes to that directory prior to performing the inference.
  729. During inference any .SETDIR attributes for the inferred prerequisite
  730. are honored.
  731. The directories must exist for a %-meta rule to be selected as a possible
  732. inference path.  If the directories do not exist no error message is issued,
  733. instead the corresponding path in the inference graph is rejected.
  734. .PP
  735. .B dmake
  736. also supports the old format special target .<suffix>.<suffix>
  737. by identifying any rules
  738. of this form and mapping them to the appropriate %-rule.  So for example if
  739. an old makefile contains the construct:
  740. .RS
  741. .sp
  742. \&.c.o :; cc \-c $< \-o $@
  743. .sp
  744. .RE
  745. .B dmake
  746. maps this into the following %-rule:
  747. .RS
  748. .sp
  749. %.o : %.c; cc \-c $< \-o $@
  750. .sp
  751. .RE
  752. Furthermore,
  753. .B dmake
  754. understands several SYSV AUGMAKE special targets and maps them into
  755. corresponding %-meta rules.  These transformation must be enabled by providing
  756. the \-A flag on the command line or by setting the value of AUGMAKE to
  757. non\-NULL.
  758. The construct
  759. .RS
  760. .sp
  761. \&.suff :; recipe
  762. .sp
  763. .RE
  764. gets mapped into:
  765. .RS
  766. .sp
  767. % : %.suff; recipe
  768. .sp
  769. .RE
  770. and the construct
  771. .RS
  772. .sp
  773. \&.c~.o :; recipe
  774. .sp
  775. .RE
  776. gets mapped into:
  777. .RS
  778. .sp
  779. %.o : s.%.c ; recipe
  780. .sp
  781. .RE
  782. In general, a special target of the form .<str>~ is replaced by the %-rule
  783. construct s.%.<str>, thereby providing support for the syntax used by SYSV
  784. AUGMAKE for providing SCCS support.
  785. When enabled, these mappings allow processing of existing SYSV
  786. makefiles without modifications.
  787. .PP
  788. .B dmake
  789. bases all of its inferences on the inference graph constructed from the
  790. %-rules defined in the makefile.
  791. It knows exactly which targets can be made from which prerequisites by
  792. making queries on the inference graph.  For this reason .SUFFIXES is not
  793. needed and is completely ignored.
  794. .PP
  795. For a %-meta rule to be inferred as the
  796. rule whose recipe will be used to make a target, the target's name must match
  797. the %-target pattern, and any inferred %-prerequisite must already exist or
  798. have an explicit recipe so that the prerequisite can be made.
  799. Without \fItransitive closure\fP on the inference graph the above rule
  800. describes precisely when an inference match terminates the search.
  801. If transitive closure is enabled (the usual case), and a prerequisite does
  802. not exist or cannot be made, then
  803. .B dmake
  804. invokes the inference algorithm recursively on the prerequisite to see if
  805. there is some way the prerequisite can be manufactured.  For, if the
  806. prerequisite can be made then the current target can also be made using the
  807. current %-meta rule.
  808. This means that there is no longer a need to give a rule
  809. for making a .o from a .y if you have already given a rule for making a .o
  810. from a .c and a .c from a .y.  In such cases
  811. .B dmake
  812. can infer how to make the
  813. \&.o from the .y via the intermediary .c and will remove the .c when the .o is
  814. made.  Transitive closure can be disabled by giving the \-T switch on the
  815. command line.
  816. .PP
  817. A word of caution.
  818. .B dmake
  819. bases its transitive closure on the %-meta rule targets.
  820. When it performs transitive closure it infers how to make a target from a
  821. prerequisite by performing a pattern match as if the potential prerequisite
  822. were a new target.
  823. The set of rules:
  824. .RS
  825. .nf
  826. .sp
  827. %.o : %.c :; rule for making .o from .c
  828. %.c : %.y :; rule for making .c from .y
  829. % : RCS/%,v :; check out of RCS file
  830. .fi
  831. .sp
  832. .RE
  833. will, by performing transitive closure, allow \fBdmake\fP to infer how to make
  834. a .o from a .y using a .c as an intermediate temporary file.  Additionally
  835. it will be able to infer how to make a .y from an RCS file, as long as that
  836. RCS file is in the RCS directory and has a name which ends in .y,v.
  837. The transitivity computation is performed dynamically for each target that
  838. does not have a recipe.  This has potential to be costly if the %-meta
  839. rules are not carefully specified.  The .NOINFER attribute is used to mark
  840. a %-meta node as being a final target during inference.  Any node with this
  841. attribute set will not be used for subsequent inferences.  As an example
  842. the node RCS/%,v is marked as a final node since we know that if the RCS file
  843. does not exist there likely is no other way to make it.  Thus the standard
  844. startup makefile contains an entry similar to:
  845. .RS
  846. .nf
  847. \&.NOINFER : RCS/%,v
  848. .fi
  849. .RE
  850. Thereby indicating that the RCS file is the end of the inference chain.
  851. Whenever the inference algorithm determines that a target can be made from
  852. more than one prerequisite and the inference chains for the two methods
  853. are the same length the algorithm reports an ambiguity and prints the
  854. ambiguous inference chains.
  855. .PP
  856. .B dmake
  857. tries to
  858. remove intermediate files resulting from transitive closure if the file
  859. is not marked as being PRECIOUS, or the \fB\-u\fP flag was not given on the
  860. command line, and if the inferred intermediate did not previously exist.
  861. Intermediate targets that existed prior to being made are never removed.
  862. This is in keeping with the philosophy that
  863. .B dmake
  864. should never remove things from the file system that it did not add.
  865. If the special target .REMOVE is defined and has a recipe then
  866. .B dmake
  867. constructs a list of the intermediate files to be removed and makes them
  868. prerequisites of .REMOVE.  It then makes .REMOVE thereby removing the
  869. prerequisites if the recipe of .REMOVE says to.  Typically .REMOVE is defined
  870. in the startup file as:
  871. .sp
  872. \t.REMOVE :; $(RM) $<
  873. .SH "MAKING TARGETS"
  874. In order to update a target \fBdmake\fP must execute a recipe.
  875. When a recipe needs to be executed it is first expanded so that any macros
  876. in the recipe text are expanded, and it is then either executed directly or
  877. passed to a shell.
  878. .B dmake
  879. supports two types of recipes.  The regular recipes and group recipes.
  880. .PP
  881. When a regular recipe is invoked \fBdmake\fP executes each line of the recipe
  882. separately using a new copy of a shell if a shell is required.
  883. Thus effects of commands do not generally persist across recipe lines
  884. (e.g. cd requests in a recipe line do not carry over to the next recipe line).
  885. This is true even in environments such as \fBMSDOS\fP, where dmake internally
  886. sets the current working director to match the directory it was in before
  887. the command was executed.
  888. .PP
  889. The decision on whether a shell is required to execute a command is based on
  890. the value of the macro SHELLMETAS or on the specification of '+' or .USESHELL
  891. for the current recipe or target respectively.
  892. If any character in the value of
  893. SHELLMETAS is found in the expanded recipe text-line or the use of a shell
  894. is requested explicitly via '+' or .USESHELL then the command is
  895. executed using a shell, otherwise the command is executed directly.
  896. The shell that is used for execution is given by the value of the macro SHELL.
  897. The flags that are passed to the shell are given by the value of SHELLFLAGS.
  898. Thus \fBdmake\fP constructs the command line:
  899. .sp
  900. \t$(SHELL) $(SHELLFLAGS) $(expanded_recipe_command)
  901. .sp
  902. Normally
  903. .B dmake
  904. writes the command line that it is about to invoke to standard output.
  905. If the .SILENT attribute is set for the target or for
  906. the recipe line (via @), then the recipe line is not echoed.
  907. .PP
  908. Group recipe processing is similar to that of regular recipes, except that
  909. a shell is always invoked.  The shell that is invoked is given by the value of
  910. the macro GROUPSHELL, and its flags are taken from the value of the macro
  911. GROUPFLAGS.  If a target has the .PROLOG attribute set then
  912. .B dmake
  913. prepends to the shell script the recipe associated with the special target
  914. \&.GROUPPROLOG, and if the attribute .EPILOG is set as well, then the recipe
  915. associated with the special target .GROUPEPILOG is appended to the script
  916. file.
  917. This facility can be used to always prepend a common header and common trailer
  918. to group recipes.
  919. Group recipes are echoed to standard output just like standard recipes, but
  920. are enclosed by lines beginning with [ and ].
  921. .PP
  922. The recipe flags [+,\-,%,@] are recognized at the start of a recipe line
  923. even if they appear in a macro.  For example:
  924. .RS
  925. .sp
  926. .nf
  927. SH = +
  928. all:
  929. \t$(SH)echo hi
  930. .fi
  931. .sp
  932. .RE
  933. is completely equivalent to writing
  934. .RS
  935. .sp
  936. .nf
  937. SH = +
  938. all:
  939. \t+echo hi
  940. .fi
  941. .sp
  942. .RE
  943. .PP
  944. The last step performed by
  945. .B dmake
  946. prior to running a recipe is to set the macro CMNDNAME to the name of the
  947. command to execute (determined by finding the first white\-space ending token
  948. in the command line).  It then sets the macro CMNDARGS to be the remainder
  949. of the line.
  950. .B dmake
  951. then expands the macro COMMAND which by default is set to
  952. .RS
  953. .sp
  954. COMMAND = $(CMNDNAME) $(CMNDARGS)
  955. .sp
  956. .RE
  957. The result of this final expansion is the command that will be executed.
  958. The reason for this expansion is to allow for a different interface to
  959. the argument passing facilities (esp. under DOS) than that provided by
  960. .B dmake\fR.\fP
  961. You can for example define COMMAND to be
  962. .RS
  963. .sp
  964. COMMAND = $(CMNDNAME) @$(mktmp $(CMNDARGS))
  965. .sp
  966. .RE
  967. which dumps the arguments into a temporary file and runs the command
  968. .RS
  969. .sp
  970. $(CMNDNAME) @/tmp/ASAD23043
  971. .sp
  972. .RE
  973. which has a much shorter argument list.  It is now up to the command to
  974. use the supplied argument as the source for all other arguments.
  975. As an optimization, if COMMAND is not defined
  976. .B dmake
  977. does not perform the above expansion.  On systems, such as UNIX, that
  978. handle long command lines this provides a slight saving in processing the
  979. makefiles.
  980. .SH "MAKING LIBRARIES"
  981. Libraries are easy to maintain using \fBdmake\fP.  A library is a file
  982. containing a collection of object files.
  983. Thus to make a library you simply specify it as a target with the .LIBRARY
  984. attribute set and specify its list of prerequisites.  The prerequisites should
  985. be the object members that are to go into the library.  When
  986. .B dmake
  987. makes the library target it uses the .LIBRARY attribute to pass to the
  988. prerequisites the .LIBMEMBER attribute and the name of the library.  This
  989. enables the file binding mechanism to look for the member in the library if an
  990. appropriate object file cannot be found. A small example best illustrates
  991. this.
  992. .RS
  993. .nf
  994. .sp
  995. mylib.a .LIBRARY : mem1.o mem2.o mem3.o
  996. \trules for making library...
  997. \t# remember to remove .o's when lib is made
  998. .sp
  999. # equivalent to:  '%.o : %.c ; ...'
  1000. \&.c.o :; rules for making .o from .c say
  1001. .sp
  1002. .fi
  1003. .RE
  1004. .B dmake
  1005. will use the .c.o rule for making the library members if appropriate .c files
  1006. can be found using the search rules.  NOTE:  this is not specific in any way
  1007. to C programs, they are simply used as an example.
  1008. .PP
  1009. .B dmake
  1010. tries to handle the old library construct format in a sensible way.
  1011. The construct 
  1012. .I lib(member.o)
  1013. is separated and the \fIlib\fP portion is declared
  1014. as a library target.
  1015. The new target is defined
  1016. with the .LIBRARY attribute set and the \fImember.o\fP portion of the
  1017. construct is
  1018. declared as a prerequisite of the lib target.
  1019. If the construct \fIlib(member.o)\fP
  1020. appears as a prerequisite of a target in the
  1021. makefile, that target has the new name of the lib assigned as its
  1022. prerequisite.  Thus the following example:
  1023. .RS
  1024. .sp
  1025. .nf
  1026. a.out : ml.a(a.o) ml.a(b.o); $(CC) \-o $@  $<
  1027.  
  1028. \&.c.o :; $(CC) \-c $(CFLAGS) \-o $@  $<
  1029. %.a:
  1030. \tar rv $@ $?
  1031. \tranlib $@
  1032. \trm \-rf $?
  1033. .sp
  1034. .fi
  1035. .RE
  1036. constructs the following dependency
  1037. graph.
  1038. .RS
  1039. .sp
  1040. .nf
  1041. a.out : ml.a; $(CC) \-o $@  $<
  1042. ml.a .LIBRARY : a.o b.o
  1043.  
  1044. %.o : %.c ; $(CC) -c $(CFLAGS) \-o $@  $<
  1045. %.a :
  1046. \tar rv $@ $?
  1047. \tranlib $@
  1048. \trm -rf $?
  1049. .sp
  1050. .fi
  1051. .RE
  1052. and making a.out then works as expected.
  1053. .PP
  1054. The same thing happens for any target of the form \fIlib((entry))\fP.
  1055. These targets have an
  1056. additional feature in that the \fIentry\fP target has the .SYMBOL attribute
  1057. set automatically.
  1058. .PP
  1059. NOTE:  If the notion of entry points is supported by the archive and by
  1060. \fBdmake\fP (currently not the case) then
  1061. .B dmake
  1062. will search the archive for the entry point and return not only the
  1063. modification time of the member which defines the entry but also the name of
  1064. the member file.  This name will then replace \fIentry\fP and will be used for
  1065. making the member file.  Once bound to an archive member the .SYMBOL
  1066. attribute is removed from the target.
  1067. This feature is presently disabled as there is little standardization
  1068. among archive formats, and we have yet to find a makefile utilizing this
  1069. feature (possibly due to the fact that it is unimplemented in most versions
  1070. of UNIX Make).
  1071. .PP
  1072. Finally, when
  1073. .B dmake
  1074. looks for a library member it must first locate the library file.
  1075. It does so by first looking for the library relative to the current directory
  1076. and if it is not found it then looks relative to the current value of
  1077. $(TMD).  This allows commonly used libraries to be kept near the root of
  1078. a source tree and to be easily found by
  1079. .B dmake\fR.\fP
  1080. .SH "KEEP STATE"
  1081. .B dmake
  1082. supports the keeping of state information for targets that it makes whenever
  1083. the macro .KEEP_STATE is assigned a value.  The value of the macro should be
  1084. the name of a state file that will contain the state information.  If state
  1085. keeping is enabled then each target that does not poses the .NOSTATE
  1086. attribute will have a record written into the state file indicating the
  1087. target's name, the current directory, the command used to update the target,
  1088. and which, if any, :: rule is being used.  When you make this target again
  1089. if any of this information does not match the previous settings and the
  1090. target is not out dated it will still be re\-made.  The assumption is that one
  1091. of the conditions above has changed and that we wish to remake the target.
  1092. For example,
  1093. state keeping is used in the maintenance of
  1094. .B dmake
  1095. to test compile different versions of the source using different compilers.
  1096. Changing the compiler causes the compilation flags to be modified and hence
  1097. all sources to be recompiled.
  1098. .PP
  1099. The state file is an ascii file and is portable, however it is
  1100. not in human readable form as the entries represent hash keys of the above
  1101. information.
  1102. .PP
  1103. The Sun Microsystem's Make construct
  1104. .RS
  1105. .sp
  1106. \&.KEEP_STATE :
  1107. .sp
  1108. .RE
  1109. is recognized and is mapped to \fB.KEEP_STATE:=_state.mk\fP.
  1110. The
  1111. .B dmake
  1112. version of state keeping does not include scanning C source files for
  1113. dependencies like Sun Make.  This is specific to C programs and it was
  1114. felt that it does not belong in make.
  1115. .B dmake
  1116. instead provides the tool, \fBcdepend\fP, to scan C source files and to produce
  1117. depedency information.  Users are free to modify cdepend to produce other
  1118. dependency files.  (NOTE:
  1119. .B cdepend
  1120. does not come with the distribution at this time, but will be available in
  1121. a patch in the near future)
  1122. .SH "MULTI PROCESSING"
  1123. If the architecture supports it then \fBdmake\fP is capable of making a target's
  1124. prerequisites in parallel.  \fBdmake\fP will make as much in parallel as it
  1125. can and use a number of child processes up to the maximum specified by
  1126. MAXPROCESS or by the value supplied to the \-P command line flag.
  1127. A parallel make is enabled by setting the value of MAXPROCESS (either directly
  1128. or via \-P option) to a value which is > 1.
  1129. \fBdmake\fP guarantees that all dependencies as specified in the makefile are
  1130. honored.  A target will not be made until all of its prerequisites have been
  1131. made.  Note that when you specify \fB-P 4\fP then four child processes are
  1132. run concurrently but \fBdmake\fP actually displays the fifth command it will
  1133. run immediately upon a child process becomming free.  This is an artifact of
  1134. the method used to traverse the dependency graph and cannot be removed.
  1135. If a parallel make is being performed then the following restrictions on
  1136. parallelism are enforced.
  1137. .RS
  1138. .IP 1.
  1139. Individual recipe lines in a non-group recipe are performed sequentially in
  1140. the order in which they are specified within the makefile and in parallel with
  1141. the recipes of other targets.
  1142. .IP 2.
  1143. If a target contains multiple recipe definitions (cf. :: rules) then these are
  1144. performed sequentially in the order in which the :: rules are specified within
  1145. the makefile and in parallel with the recipes of other targets.
  1146. .IP 3.
  1147. If a target rule contains the `!' modifier, then the recipe is performed
  1148. sequentially for the list of outdated prerequisites and in parallel with the recipes of other targets.
  1149. .IP 4.
  1150. If a target has the .SEQUENTIAL attribute set then all of its prerequisites
  1151. are made sequentially relative to one another (as if MAXPROCESS=1), but in
  1152. parallel with other targets in the makefile.
  1153. .RE
  1154. .PP
  1155. Note:  If you specify a parallel make then
  1156. the order of target update and the order in which the associated recipes are
  1157. invoked will not correspond to that displayed by the \-n flag.
  1158. .SH "CONDITIONALS"
  1159. .B dmake
  1160. supports a makefile construct called a \fIconditional\fR.  It allows
  1161. the user
  1162. to conditionally select portions of makefile text for input processing
  1163. and to discard other portions.  This becomes useful for
  1164. writing makefiles that are intended to function for more than one target
  1165. host and environment.  The conditional expression is specified as follows:
  1166. .sp
  1167. .RS
  1168. .nf
  1169. \&.IF  \fIexpression\fR
  1170.    ... if text ...
  1171. \&.ELIF  \fIexpression\fR
  1172.    ... if text ...
  1173. \&.ELSE
  1174.    ... else text ...
  1175. \&.END
  1176. .RE
  1177. .fi
  1178. .sp
  1179. The .ELSE and .ELIF portions are optional, and the conditionals may be
  1180. nested (ie.  the text may contain another conditional).
  1181. \&.IF, .ELSE, and .END
  1182. may appear anywhere in the makefile, but a single conditional expression
  1183. may not span multiple makefiles.
  1184. .PP
  1185. \fIexpression\fR can be one of the following three forms:
  1186. .sp
  1187. \t<text> | <text> == <text> | <text> != <text>
  1188. .sp
  1189. where \fItext\fR is either text or a macro expression.  In any case,
  1190. before the comparison is made, the expression is expanded.  The text
  1191. portions are then selected and compared.  White space at the start and
  1192. end of the text portion is discarded before the comparison.  This means
  1193. that a macro that evaluates to nothing but white space is considered a
  1194. NULL value for the purpose of the comparison.
  1195. In the first case the expression evaluates TRUE if the text is not NULL
  1196. otherwise it evaluates FALSE.  The remaining two cases both evaluate the
  1197. expression on the basis of a string comparison.
  1198. If a macro expression needs to be equated to a NULL string then compare it to
  1199. the value of the macro $(NULL).
  1200. You can use the $(shell ...) macro to construct more complex test expressions.
  1201. .SH "EXAMPLES"
  1202. .RS
  1203. .nf
  1204. .sp
  1205. # A simple example showing how to use make
  1206. #
  1207. prgm : a.o b.o
  1208.     cc a.o b.o \-o prgm
  1209. a.o : a.c g.h
  1210.     cc a.c \-o $@
  1211. b.o : b.c g.h
  1212.     cc b.c \-o $@
  1213. .fi
  1214. .RE
  1215. .sp
  1216. In the previous
  1217. example prgm is remade only if a.o and/or b.o is out of date with
  1218. respect to prgm.
  1219. These dependencies can be stated more concisely
  1220. by using the inference rules defined in the standard startup file.
  1221. The default rule for making .o's from .c's looks something like this:
  1222. .sp
  1223. \&\t%.o : %.c; cc \-c $(CFLAGS) \-o $@ $<
  1224. .sp
  1225. Since there exists a rule (defined in the startup file)
  1226. for making .o's from .c's
  1227. \fBdmake\fR will use that rule
  1228. for manufacturing a .o from a .c and we can specify our dependencies
  1229. more concisely.
  1230. .sp
  1231. .RS
  1232. .nf
  1233. prgm : a.o b.o
  1234.     cc \-o prgm $<
  1235. a.o b.o : g.h
  1236. .fi
  1237. .RE
  1238. .sp
  1239. A more general way to say the above using the new macro expansions
  1240. would be:
  1241. .sp
  1242. .RS
  1243. .nf
  1244. SRC = a b
  1245. OBJ = {$(SRC)}.o
  1246. .sp
  1247. prgm : $(OBJ)
  1248.     cc \-o $@ $<
  1249. .sp
  1250. $(OBJ) : g.h
  1251. .fi
  1252. .RE
  1253. .sp
  1254. If we want to keep the objects in a separate directory, called
  1255. objdir, then we would write
  1256. something like this.
  1257. .sp
  1258. .RS
  1259. .nf
  1260. SRC = a b
  1261. OBJ = {$(SRC)}.o
  1262. .sp
  1263. prgm : $(OBJ)
  1264.     cc $< \-o $@
  1265. .sp
  1266. $(OBJ) : g.h
  1267. \&%.o : %.c
  1268.     $(CC) \-c $(CFLAGS) \-o $(@:f) $<
  1269.     mv $(@:f) objdir
  1270.  
  1271. \&.SOURCE.o : objdir        # tell make to look here for .o's
  1272. .fi
  1273. .RE
  1274. .sp
  1275. An example of building library members would go something like this:
  1276. (NOTE:  The same rules as above will be used to produce .o's from .c's)
  1277. .sp
  1278. .RS
  1279. .nf
  1280. SRC\t= a b
  1281. LIB\t= lib
  1282. LIBm\t= { $(SRC) }.o
  1283. .sp
  1284. prgm: $(LIB)
  1285.     cc \-o $@ $(LIB)
  1286. .sp
  1287. $(LIB) .LIBRARY : $(LIBm)
  1288.     ar rv $@ $<
  1289.     rm $<
  1290. .fi
  1291. .RE
  1292. .sp
  1293. Finally, suppose that each of the source files in the previous example had
  1294. the `:' character in their target name.  Then we would write the above example
  1295. as:
  1296. .sp
  1297. .RS
  1298. .nf
  1299. SRC\t= f:a f:b
  1300. LIB\t= lib
  1301. LIBm\t= "{ $(SRC) }.o"        # put quotes around each token
  1302. .sp
  1303. prgm: $(LIB)
  1304.     cc \-o $@ $(LIB)
  1305. .sp
  1306. $(LIB) .LIBRARY : $(LIBm)
  1307.     ar rv $@ $<
  1308.     rm $<
  1309. .fi
  1310. .RE
  1311. .SH "COMPATIBILITY"
  1312. There are two notable differences between 
  1313. .B \fBdmake\fR
  1314. and the standard version of BSD UNIX 4.2/4.3 Make.
  1315. .RS
  1316. .IP 1. .3i
  1317. BSD UNIX 4.2/4.3 Make supports wild card filename expansion for
  1318. prerequisite names.  Thus if a directory contains a.h, b.h and c.h, then a
  1319. line like
  1320. .sp
  1321. \ttarget: *.h
  1322. .sp
  1323. will cause UNIX make to expand the *.h into "a.h b.h c.h".  \fBdmake\fR
  1324. does not support this type of filename expansion.
  1325. .IP 2. .3i
  1326. Unlike UNIX make, touching a library member causes \fBdmake\fR
  1327. to search the library for the member name and to update the library time stamp.
  1328. This is only implemented in the UNIX version.
  1329. MSDOS and other versions may not have librarians that keep file time stamps,
  1330. as a result \fBdmake\fR touches the library file itself, and prints a warning.
  1331. .RE
  1332. .PP
  1333. \fBdmake\fP is not compatible with GNU Make.  In particular it does not
  1334. understand GNU Make's macro expansions that query the file system.
  1335. .PP
  1336. .B dmake
  1337. is fully compatible with SYSV AUGMAKE, and supports the following AUGMAKE
  1338. features:
  1339. .RS
  1340. .IP 1. .3i
  1341. The word \fBinclude\fP appearing at the start of a line can be used instead of
  1342. the ".INCLUDE :" construct understood by \fBdmake\fP.
  1343. .IP 2. .3i
  1344. The macro modifier expression $(macro:str=sub) is understood and is equivalent
  1345. to the expression $(macro:s/str/sub), with the restriction that str must match
  1346. the following regular expression:
  1347. .sp
  1348. \tstr[ |\et][ |\et]*
  1349. .sp
  1350. (ie. str only matches at the end of a token where str is a suffix and is
  1351. terminated by a space, a tab, or end of line)
  1352. Normally \fIsub\fP is expanded before the substitution is made, if you specify
  1353. \-A on the command line then sub is not expanded.
  1354. .IP 3.
  1355. The macro % is defined to be $@ (ie. $% expands to the same value as $@).
  1356. .IP 4.
  1357. The AUGMAKE notion of libraries is handled correctly.
  1358. .IP 5.
  1359. When defining special targets for the inference rules and the AUGMAKE special
  1360. target handling is enabled then the special target
  1361. \&.X is equivalent to the %-rule "% : %.X".
  1362. .IP 6.
  1363. Directories are always made if you specify \fB\-A\fP.  This is consistent
  1364. with other UNIX versions of Make.
  1365. .IP 7.
  1366. Makefiles that utilize virtual targets to force making of other targets work
  1367. as expected if AUGMAKE special target handling is enabled.  For example:
  1368. .sp
  1369. .nf
  1370. \tFRC:
  1371. \tmyprog.o : myprog.c $(FRC) ; ...
  1372. .fi
  1373. .sp
  1374. Works as expected if you issue the command
  1375. .sp
  1376. \t'\fBdmake\fP \-A FRC=FRC'
  1377. .sp
  1378. but fails with a 'don't know how to make FRC'
  1379. error message if you do not specify AUGMAKE special target handling via
  1380. the \-A flag (or by setting AUGMAKE:=yes internally).
  1381. .RE
  1382. .SH "LIMITS"
  1383. In some environments the length of an argument string is restricted.
  1384. (e.g. MSDOS command line arguments cannot be longer than 128 bytes if you are
  1385. using the standard command.com command interpreter as your shell,
  1386. .B dmake
  1387. text diversions may help in these situations.)
  1388. .SH "PORTABILITY"
  1389. To write makefiles that can be moved from one environment to another requires
  1390. some forethought.  In particular you must define as macros all those things
  1391. that may be different in the new environment.
  1392. .B dmake
  1393. has two facilities that help to support writing portable makefiles, recursive
  1394. macros and conditional expressions.  The recursive macros, allow one to define
  1395. environment configurations that allow different environments for similar types
  1396. of operating systems.  For example the same make script can be used for SYSV and
  1397. BSD but with different macro definitions.
  1398. .PP
  1399. To write a makefile that is portable between UNIX and MSDOS requires both
  1400. features since in almost all cases you will need to define new recipes for
  1401. making targets.  The recipes will probably be quite different since the
  1402. capabilities of the tools on each machine are different.  Different
  1403. macros will be needed to help handle the smaller differences in the two
  1404. environments.
  1405. .SH FILES
  1406. Makefile, makefile, startup.mk (use dmake \-V to tell you where the startup
  1407. file is)
  1408. .SH "SEE ALSO"
  1409. sh(1), csh(1), touch(1), f77(1), pc(1), cc(1)
  1410. .br
  1411. S.I. Feldman  \fIMake - A Program for Maintaining Computer Programs\fP
  1412. .SH "AUTHOR"
  1413. Dennis Vadura, CS Dept. University of Waterloo. dvadura@watdragon.uwaterloo.ca
  1414. .br
  1415. Many thanks to Carl Seger for his helpful suggestions,
  1416. and to Trevor John Thompson for his many excellent ideas and
  1417. informative bug reports.
  1418. .SH BUGS
  1419. Some system commands return non-zero status inappropriately.
  1420. Use
  1421. .B \-i
  1422. (`\-' within the makefile) to overcome the difficulty.
  1423. .PP
  1424. Some systems do not have easily accessible
  1425. time stamps for library members (MSDOS, AMIGA, etc)
  1426. for these \fBdmake\fR uses the time stamp of the library instead and prints
  1427. a warning the first time it does so.  This is almost always ok, except when
  1428. multiple makefiles update a single library file.  In these instances it is
  1429. possible to miss an update if one is not careful.
  1430. .PP
  1431. This man page is way too long.
  1432. .SH WARNINGS
  1433. Rules supported by make(1) may not work if transitive closure is turned off
  1434. (-T, .NOINFER).
  1435. .PP
  1436. PWD from csh/ksh will cause problems if a cd operation is performed and
  1437. -e or -E option is used.
  1438. .PP
  1439. Using internal macros such as COMMAND, may wreak havoc if you don't understand
  1440. their functionality.
  1441.