[comp.sources.misc] v20i079: dmake - dmake version 3.7, Patch02d/12

dvadura@watdragon.waterloo.edu (Dennis Vadura) (06/30/91)

Submitted-by: Dennis Vadura <dvadura@watdragon.waterloo.edu>
Posting-number: Volume 20, Issue 79
Archive-name: dmake/patch02d
Patch-To: dmake: Volume 19, Issue 22-58

#!/bin/sh
# this is dp2.03 (part 3 of a multipart archive)
# do not concatenate these parts, unpack them in order with /bin/sh
# file dm37p2 continued
#
if test ! -r _shar_seq_.tmp; then
	echo 'Please unpack part 1 first!'
	exit 1
fi
(read Scheck
 if test "$Scheck" != 3; then
	echo Please unpack part "$Scheck" next!
	exit 1
 else
	exit 0
 fi
) < _shar_seq_.tmp || exit 1
if test ! -f _shar_wnt_.tmp; then
	echo 'x - still skipping dm37p2'
else
echo 'x - continuing file dm37p2'
sed 's/^X//' << 'SHAR_EOF' >> 'dm37p2' &&
XX     ddmmaakkee defines a number of special macros.  They are divided
XX     into three classes: control macros, run-time macros, and
XX     function macros.  The control macros are used by ddmmaakkee to
XX     configure its actions, and are the preferred method of doing
XX     so.  In the case when a control macro has the same function
XX     as a special target or attribute they share the same name as
XX     the special target or attribute.  The run-time macros are
XX     defined when ddmmaakkee makes targets and may be used by the user
XX     inside recipes.  The function macros provide higher level
XX     functions dealing with macro expansion and diversion file
XX     processing.
XX
XCCOONNTTRROOLL MMAACCRROOSS
XX     To use the control macros simply assign them a value just
XX     like any other macro.  The control macros are divided into
XX     three groups: string valued macros, character valued macros,
XX     and boolean valued macros.
XX
XX     The following are all of the string valued macros.  This
XX     list is divided into two groups.  The first group gives the
XX     string valued macros that are defined internally and cannot
XX     be directly set by the user.
XX
XX     DDIIRRBBRRKKSSTTRR     Contains the string of chars used to terminate
XX                   the name of a directory in a pathname.  Under
XX                   UNIX its value is "/", under MSDOS its value
XX                   is "/\:".
XX
XX     IINNCCDDEEPPTTHH      This macro's value is a string of digits
XX                   representing the current depth of makefile
XX                   inclusion.  In the first makefile level this
XX                   value is zero.
XX
XX     MMFFLLAAGGSS        Is the list of flags that were given on the
XX                   command line including a leading switch char-
XX                   acter.  The -f flag is not included in this
XX                   list.
XX
XX     MMAAKKEECCMMDD       Is the name with which ddmmaakkee was invoked.
XX
XX     MMAAKKEEDDIIRR       Is the full path to the initial directory in
XX                   which ddmmaakkee was invoked.
XX
XX     MMAAKKEEFFIILLEE      Contains the string "-f _m_a_k_e_f_i_l_e" where,
XX                   _m_a_k_e_f_i_l_e is the name of initial user makefile
XX                   that was first read.
XX
XX
XX
XVersion 3.70                    UW                             25
XX
XX
XX
XX
XDMAKE(p)             Unsupported Free Software            DMAKE(p)
XX
XX
XX
XX     MMAAKKEEFFLLAAGGSS     Is the same as $(MFLAGS) but has no leading
XX                   switch character. (ie. MFLAGS = -$(MAKEFLAGS))
XX
XX     MMAAKKEEMMAACCRROOSS    Contains the complete list of macro expres-
XX                   sions that were specified on the command line.
XX
XX     MMAAKKEETTAARRGGEETTSS   Contains the name(s) of the target(s), if any,
XX                   that were specified on the command line.
XX
XX     MMAAXXPPRROOCCEESSSSLLIIMMIITT
XX                   Is a numeric string representing the maximum
XX                   number of processes that ddmmaakkee can use when
XX                   making targets using parallel mode.
XX
XX     NNUULLLL          Is permanently defined to be the NULL string.
XX                   This is useful when comparing a conditional
XX                   expression to an NULL value.
XX
XX     PPWWDD           Is the full path to the current directory in
XX                   which make is executing.
XX
XX     TTMMPPFFIILLEE       Is set to the name of the most recent tem-
XX                   porary file opened by ddmmaakkee.  Temporary files
XX                   are used for text diversions and for group
XX                   recipe processing.
XX
XX     TTMMDD           Stands for "To Make Dir", and is the path from
XX                   the present directory (value of $(PWD)) to the
XX                   directory that ddmmaakkee was started up in (value
XX                   of $(MAKEDIR)).  This macro is modified when
XX                   .SETDIR attributes are processed.
XX
XX     UUSSEESSHHEELLLL      The value of this macro is set to "yes" if the
XX                   current recipe is forced to use a shell for
XX                   its execution via the .USESHELL or '+' direc-
XX                   tives, its value is "no" otherwise.
XX
XX
XX     The second group of string valued macros control ddmmaakkee
XX     behavior and may be set by the user.
XX
XX     ..NNOOTTAABBSS         When set to non-NULL enables the use of
XX                     spaces as well as <tabs> to begin recipe
XX                     lines.  By default a non-group recipe is
XX                     terminated by a line without any leading
XX                     white-space or by a line not beggining with
XX                     a <tab> character.  Enabling this mode modi-
XX                     fies the first condition of the above termi-
XX                     nation rule to terminate a non-group recipe
XX                     with a line that contains only white-space.
XX                     This mode does not effect the parsing of
XX                     group recipes bracketed by [].
XX
XX
XX
XVersion 3.70                    UW                             26
XX
XX
XX
XX
XDMAKE(p)             Unsupported Free Software            DMAKE(p)
XX
XX
XX
XX     ..SSEETTDDIIRR         If this macro is assigned a value then ddmmaakkee
XX                     will change to the directory given by that
XX                     value before making any targets.
XX
XX     AAUUGGMMAAKKEE         If set to a non NULL value will enable the
XX                     transformation of special meta targets to
XX                     support special AUGMAKE inferences (See the
XX                     COMPATIBILITY section).
XX
XX     DDIIRRSSEEPPSSTTRR       Contains the string that is used to separate
XX                     directory components when path names are
XX                     constructed.  It is defined with a default
XX                     value at startup.
XX
XX     DDIIVVFFIILLEE         Is defined in the startup file and gives the
XX                     name that should be returned for the diver-
XX                     sion file name when used in $(mktmp ...)
XX                     expansions, see the TEXT DIVERSION section
XX                     for details.
XX
XX     ..KKEEEEPP__SSTTAATTEE     Assigning this macro a value tells ddmmaakkee the
XX                     name of the state file to use and turns on
XX                     the keeping of state information for any
XX                     targets that are brought up to date by the
XX                     make.
XX
XX     GGRROOUUPPFFLLAAGGSS      This macro gives the set of flags to pass to
XX                     the shell when invoking it to execute a
XX                     group recipe.  The value of the macro is the
XX                     list of flags with a leading switch indica-
XX                     tor.  (ie. `-' under UNIX)
XX
XX     GGRROOUUPPSSHHEELLLL      This macro defines the full path to the exe-
XX                     cutable image to be used as the shell when
XX                     processing group recipes.  This macro must
XX                     be defined if group recipes are used.  It is
XX                     assigned a default value in the startup
XX                     makefile.  Under UNIX this value is /bin/sh.
XX
XX     GGRROOUUPPSSUUFFFFIIXX     If defined, this macro gives the string to
XX                     use as a suffix when creating group recipe
XX                     files to be handed to the command inter-
XX                     preter.  For example, if it is defined as
XX                     .sh, then all temporary files created by
XX                     ddmmaakkee will end in the suffix .sh.  Under
XX                     MSDOS if you are using command.com as your
XX                     GROUPSHELL, then this suffix must be set to
XX                     .bat in order for group recipes to function
XX                     correctly.  The setting of GROUPSUFFIX and
XX                     GROUPSHELL is done automatically for
XX                     command.com in the startup.mk files.
XX
XX
XX
XX
XVersion 3.70                    UW                             27
XX
XX
XX
XX
XDMAKE(p)             Unsupported Free Software            DMAKE(p)
XX
XX
XX
XX     MMAAKKEE            Is defined in the startup file by default.
XX                     The string $(MAKE) is recognized when using
XX                     the -n option for single line recipes.  Ini-
XX                     tially this macro is defined to have the
XX                     value "$(MAKECMD) $(MFLAGS)".
XX
XX     MMAAKKEESSTTAARRTTUUPP     This macro defines the full path to the ini-
XX                     tial startup makefile.  Use the --VV command
XX                     line option to discover its initial value.
XX
XX     MMAAXXLLIINNEELLEENNGGTTHH   This macro defines the maximum size of a
XX                     single line of makefile input text.  The
XX                     size is specified as a number, the default
XX                     value is defined internally and is shown via
XX                     the --VV option.  A buffer of this size plus 2
XX                     is allocated for reading makefile text.  The
XX                     buffer is freed before any targets are made,
XX                     thereby allowing files containing long input
XX                     lines to be processed without consuming
XX                     memory during the actual make.
XX
XX     MMAAXXPPRROOCCEESSSS      Specify the maximum number of child
XX                     processes to use when making targets.  The
XX                     default value of this macro is "1" and its
XX                     value cannot exceed the value of the macro
XX                     MAXPROCESSLIMIT.  Setting the value of MAX-
XX                     PROCESS on the command line or in the
XX                     makefile is equivalent to supplying a
XX                     corresponding value to the -P flag on the
XX                     command line.
XX
XX     PPRREEPP            This macro defines the number of iterations
XX                     to be expanded automatically when processing
XX                     % rule definitions of the form:
XX
XX                     % : %.suff
XX
XX                     See the sections on PERCENT(%) RULES for
XX                     details on how PREP is used.
XX
XX     SSHHEELLLL           This macro defines the full path to the exe-
XX                     cutable image to be used as the shell when
XX                     processing single line recipes.  This macro
XX                     must be defined if recipes requiring the
XX                     shell for execution are to be used.  It is
XX                     assigned a default value in the startup
XX                     makefile.  Under UNIX this value is /bin/sh.
XX
XX     SSHHEELLLLFFLLAAGGSS      This macro gives the set of flags to pass to
XX                     the shell when invoking it to execute a sin-
XX                     gle line recipe.  The value of the macro is
XX                     the list of flags with a leading switch
XX
XX
XX
XVersion 3.70                    UW                             28
XX
XX
XX
XX
XDMAKE(p)             Unsupported Free Software            DMAKE(p)
XX
XX
XX
XX                     indicator.  (ie. `-' under UNIX)
XX
XX     SSHHEELLLLMMEETTAASS      Each time ddmmaakkee executes a single recipe
XX                     line (not a group recipe) the line is
XX                     searched for any occurrence of a character
XX                     defined in the value of SHELLMETAS.  If such
XX                     a character is found the recipe line is
XX                     defined to require a shell to ensure its
XX                     correct execution.  In such instances a
XX                     shell is used to invoke the recipe line.  If
XX                     no match is found the recipe line is exe-
XX                     cuted without the use of a shell.
XX
XX
XX     There is only one character valued macro defined by ddmmaakkee:
XX     SSWWIITTCCHHAARR contains the switch character used to introduce
XX     options on command lines.  For UNIX its value is `-', and
XX     for MSDOS its value may be `/' or `-'.  The macro is inter-
XX     nally defined and is not user setable.  The MSDOS version of
XX     ddmmaakkee attempts to first extract SWITCHAR from an environment
XX     variable of the same name.  If that fails it then attempts
XX     to use the undocumented getswitchar system call, and returns
XX     the result of that.  Under MSDOS version 4.0 you must set
XX     the value of the environment macro SWITCHAR to '/' to obtain
XX     predictable behavior.
XX
XX     All boolean macros currently understood by ddmmaakkee correspond
XX     directly to the previously defined attributes.  These macros
XX     provide a second way to apply global attributes, and
XX     represent the preferred method of doing so.  They are used
XX     by assigning them a value.  If the value is not a NULL
XX     string then the boolean condition is set to on.  If the
XX     value is a NULL string then the condition is set to off.
XX     There are five conditions defined and they correspond
XX     directly to the attributes of the same name.  Their meanings
XX     are defined in the ATTRIBUTES section above.  The macros
XX     are: ..EEPPIILLOOGG, ..IIGGNNOORREE, ..MMKKSSAARRGGSS, ..NNOOIINNFFEERR, ..PPRREECCIIOOUUSS, ..PPRROO----
XX     LLOOGG, ..SSEEQQUUEENNTTIIAALL, ..SSIILLEENNTT, ..SSWWAAPP, and ..UUSSEESSHHEELLLL.  Assigning
XX     any of these a non NULL value will globally set the
XX     corresponding attribute to on.
XX
XRRUUNN__TTIIMMEE MMAACCRROOSS
XX     These macros are defined when ddmmaakkee is making targets, and
XX     may take on different values for each target.  $$@@ is defined
XX     to be the full target name, $$?? is the list of all out of
XX     date prerequisites, $$&& is the list of all prerequisites, $$>>
XX     is the name of the library if the current target is a
XX     library member, and $$<< is the list of prerequisites speci-
XX     fied in the current rule.  If the current target had a
XX     recipe inferred then $$<< is the name of the inferred prere-
XX     quisite even if the target had a list of prerequisites sup-
XX     plied using an explicit rule that did not provide a recipe.
XX
XX
XX
XVersion 3.70                    UW                             29
XX
XX
XX
XX
XDMAKE(p)             Unsupported Free Software            DMAKE(p)
XX
XX
XX
XX     In such situations $$&& gives the full list of prerequisites.
XX
XX     $$** is defined as $$((@@::ddbb)) when making targets with explicit
XX     recipes and is defined as the value of % when making targets
XX     whose recipe is the result of an inference.  In the first
XX     case $$** is the target name with no suffix, and in the second
XX     case, is the value of the matched % pattern from the associ-
XX     ated %-rule.  $$^^ expands to the set of out of date prere-
XX     quisites taken from the current value of $$<<.  In addition to
XX     these, $$$$ expands to $, {{{{ expands to {, }}}} expands to },
XX     and the strings <<++ and ++>> are recognized as respectively
XX     starting and terminating a text diversion when they appear
XX     literally together in the same input line.
XX
XX     The difference between $? and $^ can best be illustrated by
XX     an example, consider:
XX
XX          fred.out : joe amy hello
XX               rules for making fred
XX
XX          fred.out : my.c your.h his.h her.h   # more prerequisites
XX
XX     Assume joe, amy, and my.c are newer then fred.out.  When
XX     ddmmaakkee executes the recipe for making fred.out the values of
XX     the following macros will be:
XX
XX          $@ --> fred.out
XX          $* --> fred
XX          $? --> joe amy my.c  # note the difference between $? and $^
XX          $^ --> joe amy
XX          $< --> joe amy hello
XX          $& --> joe amy hello my.c your.h his.h her.h
XX
XX
XFFUUNNCCTTIIOONN MMAACCRROOSS
XX     ddmmaakkee supports a full set of functional macros.  One of
XX     these, the $(mktmp ...) macro, is discussed in detail in the
XX     TEXT DIVERSION section and is not covered here.
XX
XX
XX          $(nnuullll,_t_e_x_t ttrruuee ffaallssee)
XX               expands the value of _t_e_x_t_. If it is NULL then the
XX               macro returns the value of the expansion of ttrruuee
XX               and the expansion of ffaallssee otherwise.  The terms
XX               ttrruuee, and ffaallssee must be strings containing no
XX               white-space.
XX
XX          $(!!nnuullll,_t_e_x_t ttrruuee ffaallssee)
XX               Behaves identically to the previous macro except
XX               that the ttrruuee string is chosen if the expansion of
XX               _t_e_x_t is not NULL.
XX
XX
XX
XX
XVersion 3.70                    UW                             30
XX
XX
XX
XX
XDMAKE(p)             Unsupported Free Software            DMAKE(p)
XX
XX
XX
XX          $(eeqq,_t_e_x_t___a,_t_e_x_t___b ttrruuee ffaallssee)
XX               expands _t_e_x_t___a and _t_e_x_t___b and compares their
XX               results.  If equal it returns the result of the
XX               expansion of the ttrruuee term, otherwise it returns
XX               the expansion of the ffaallssee term.
XX
XX          $(!!eeqq,_t_e_x_t___a,_t_e_x_t___b ttrruuee ffaallssee)
XX               Behaves identically to the previous macro except
XX               that the ttrruuee string is chosen if the expansions
XX               of the two strings are not equal
XX
XX          $(sshheellll ccoommmmaanndd)
XX               Runs _c_o_m_m_a_n_d as if it were part of a recipe and
XX               returns, separated by a single space, all the
XX               non-white space terms written to stdout by the
XX               command.  For example:
XX
XX                    $(shell ls *.c)
XX
XX               will return _"_a_._c _b_._c _c_._c _d_._c_" if the files exist
XX               in the current directory.  The recipe modification
XX               flags [[++@@%%--]] are honored if they appear as the
XX               first characters in the command.  For example:
XX
XX                    $(shell +ls *.c)
XX
XX               will run the command using the current shell.
XX
XX          $(ssoorrtt lliisstt)
XX               Will take all white-space separated tokens in _l_i_s_t
XX               and will return their sorted equivalent list.
XX
XX          $(ssttrriipp ddaattaa)
XX               Will replace all strings of white-space in data by
XX               a single space.
XX
XX          $(ssuubbsstt,_p_a_t,_r_e_p_l_a_c_e_m_e_n_t ddaattaa)
XX               Will search for _p_a_t in ddaattaa and will replace any
XX               occurrence of _p_a_t with the _r_e_p_l_a_c_e_m_e_n_t string.
XX               The expansion
XX
XX                    $(subst,.o,.c $(OBJECTS))
XX
XX               is equivalent to:
XX
XX                    $(OBJECTS:s/.o/.c/)
XX
XX
XDDYYNNAAMMIICC PPRREERREEQQUUIISSIITTEESS
XX     ddmmaakkee looks for prerequisites whose names contain macro
XX     expansions during target processing.  Any such prerequisites
XX     are expanded and the result of the expansion is used as the
XX
XX
XX
XVersion 3.70                    UW                             31
XX
XX
XX
XX
XDMAKE(p)             Unsupported Free Software            DMAKE(p)
XX
XX
XX
XX     prerequisite name.  As an example the line:
XX
XX          fred : $$@.c
XX
XX     causes the $$@ to be expanded when ddmmaakkee is making fred, and
XX     it resolves to the target _f_r_e_d.  This enables dynamic prere-
XX     quisites to be generated.  The value of @ may be modified by
XX     any of the valid macro modifiers.  So you can say for exam-
XX     ple:
XX
XX          fred.out : $$(@:b).c
XX
XX     where the $$(@:b) expands to _f_r_e_d.  Note the use of $$
XX     instead of $ to indicate the dynamic expansion, this is due
XX     to the fact that the rule line is expanded when it is ini-
XX     tially parsed, and $$ then returns $ which later triggers
XX     the dynamic prerequisite expansion.  If you really want a $
XX     to be part of a prerequisite name you must use $$$$.
XX     Dynamic macro expansion is performed in all user defined
XX     rules, and the special targets .SOURCE*, and .INCLUDEDIRS.
XX
XBBIINNDDIINNGG TTAARRGGEETTSS
XX     This operation takes a target name and binds it to an exist-
XX     ing file, if possible.  ddmmaakkee makes a distinction between
XX     the internal target name of a target and its associated
XX     external file name.  Thus it is possible for a target's
XX     internal name and its external file name to differ.  To per-
XX     form the binding, the following set of rules is used.
XX     Assume that we are trying to bind a target whose name is of
XX     the form _X_._s_u_f_f, where _._s_u_f_f is the suffix and _X is the stem
XX     portion (ie. that part which contains the directory and the
XX     basename).  ddmmaakkee takes this target name and performs a
XX     series of search operations that try to find a suitably
XX     named file in the external file system.  The search opera-
XX     tion is user controlled via the settings of the various
XX     .SOURCE targets.
XX
XX          1.   If target has the .SYMBOL attribute set then look
XX               for it in the library.  If found, replace the tar-
XX               get name with the library member name and continue
XX               with step 2.  If the name is not found then
XX               return.
XX
XX          2.   Extract the suffix portion (that following the
XX               `.') of the target name.  If the suffix is not
XX               null, look up the special target .SOURCE.<suff>
XX               (<suff> is the suffix). If the special target
XX               exists then search each directory given in the
XX               .SOURCE.<suff> prerequisite list for the target.
XX               If the target's suffix was null (ie. _._s_u_f_f was
XX               empty) then perform the above search but use the
XX               special target .SOURCE.NULL instead.  If at any
XX
XX
XX
XVersion 3.70                    UW                             32
XX
XX
XX
XX
XDMAKE(p)             Unsupported Free Software            DMAKE(p)
XX
XX
XX
XX               point a match is found then terminate the search.
XX               If a directory in the prerequisite list is the
XX               special name `.NULL ' perform a search for the
XX               full target name without prepending any directory
XX               portion (ie. prepend the NULL directory).  (a
XX               default target of '.SOURCE : .NULL' is defined by
XX               ddmmaakkee at startup, and is user redefinable)
XX
XX          3.   The search in step 2. failed.  Repeat the same
XX               search but this time use the special target
XX               .SOURCE.
XX
XX          4.   The search in step 3. failed.  If the target has
XX               the library member attribute (.LIBMEMBER) set then
XX               try to find the target in the library which was
XX               passed along with the .LIBMEMBER attribute (see
XX               the MAKING LIBRARIES section).  The bound file
XX               name assigned to a target which is successfully
XX               located in a library is the same name that would
XX               be assigned had the search failed (see 5.).
XX
XX          5.   The search failed.  Either the target was not
XX               found in any of the search directories or no
XX               applicable .SOURCE special targets exist.  If
XX               applicable .SOURCE special targets exist, but the
XX               target was not found, then ddmmaakkee assigns the first
XX               name searched as the bound file name.  If no
XX               applicable .SOURCE special targets exist, then the
XX               full original target name becomes the bound file
XX               name.
XX
XX     There is potential here for a lot of search operations.  The
XX     trick is to define .SOURCE.x special targets with short
XX     search lists and leave .SOURCE as short as possible.  The
XX     search algorithm has the following useful side effect.  When
XX     a target having the .LIBMEMBER (library member) attribute is
XX     searched for, it is first searched for as an ordinary file.
XX     When a number of library members require updating it is
XX     desirable to compile all of them first and to update the
XX     library at the end in a single operation.  If one of the
XX     members does not compile and ddmmaakkee stops, then the user may
XX     fix the error and make again.  ddmmaakkee will not remake any of
XX     the targets whose object files have already been generated
XX     as long as none of their prerequisite files have been modi-
XX     fied as a result of the fix.
XX
XX     When defining .SOURCE and .SOURCE.x targets the construct
XX
XX          .SOURCE :
XX          .SOURCE : fred gery
XX
XX     is equivalent to
XX
XX
XX
XVersion 3.70                    UW                             33
XX
XX
XX
XX
XDMAKE(p)             Unsupported Free Software            DMAKE(p)
XX
XX
XX
XX          .SOURCE :- fred gery
XX
XX     ddmmaakkee correctly handles the UNIX Make variable VPATH.  By
XX     definition VPATH contains a list of ':' separated direc-
XX     tories to search when looking for a target.  ddmmaakkee maps
XX     VPATH to the following special rule:
XX
XX          .SOURCE :^ $(VPATH:s/:/ /)
XX
XX     Which takes the value of VPATH and sets .SOURCE to the same
XX     set of directories as specified in VPATH.
XX
XPPEERRCCEENNTT((%%)) RRUULLEESS AANNDD MMAAKKIINNGG IINNFFEERREENNCCEESS
XX     When ddmmaakkee makes a target, the target's set of prerequisites
XX     (if any) must exist and the target must have a recipe which
XX     ddmmaakkee can use to make it.  If the makefile does not specify
XX     an explicit recipe for the target then ddmmaakkee uses special
XX     rules to try to infer a recipe which it can use to make the
XX     target.  Previous versions of Make perform this task by
XX     using rules that are defined by targets of the form
XX     .<suffix>.<suffix> and by using the .SUFFIXES list of suf-
XX     fixes.  The exact workings of this mechanism were sometimes
XX     difficult to understand and often limiting in their useful-
XX     ness.  Instead, ddmmaakkee supports the concept of _%_-_m_e_t_a rules.
XX     The syntax and semantics of these rules differ from standard
XX     rule lines as follows:
XX
XX          _<_%_-_t_a_r_g_e_t_> [_<_a_t_t_r_i_b_u_t_e_s_>] _<_r_u_l_e_o_p_> [_<_%_-_p_r_e_r_e_q_u_i_s_i_t_e_s_>] [;_<_r_e_c_i_p_e_>]
XX
XX     where _%_-_t_a_r_g_e_t is a target containing exactly a single `%'
XX     sign, _a_t_t_r_i_b_u_t_e_s is a list (possibly empty) of attributes,
XX     _r_u_l_e_o_p is the standard set of rule operators, _%_-_p_r_e_r_e_-
XX     _q_u_i_s_i_t_e_s , if present, is a list of prerequisites containing
XX     zero or more `%' signs, and _r_e_c_i_p_e_, if present, is the first
XX     line of the recipe.
XX
XX     The _%_-_t_a_r_g_e_t defines a pattern against which a target whose
XX     recipe is being inferred gets matched.  The pattern match
XX     goes as follows:  all chars are matched exactly from left to
XX     right up to but not including the % sign in the pattern, %
XX     then matches the longest string from the actual target name
XX     not ending in the suffix given after the % sign in the pat-
XX     tern.  Consider the following examples:
XX
XX          %.c       matches fred.c but not joe.c.Z
XX          dir/%.c   matches dir/fred.c but not dd/fred.c
XX          fred/%    matches fred/joe.c but not f/joe.c
XX          %         matches anything
XX
XX     In each case the part of the target name that matched the %
XX     sign is retained and is substituted for any % signs in the
XX     prerequisite list of the %-meta rule when the rule is
XX
XX
XX
XVersion 3.70                    UW                             34
XX
XX
XX
XX
XDMAKE(p)             Unsupported Free Software            DMAKE(p)
XX
XX
XX
XX     selected during inference and ddmmaakkee constructs the new
XX     dependency.  As an example the following %-meta rules
XX     describe the following:
XX
XX          %.c : %.y ; recipe...
XX
XX     describes how to make any file ending in .c if a correspond-
XX     ing file ending in .y can be found.
XX
XX          foo%.o : fee%.k ; recipe...
XX
XX     is used to describe how to make fooxxxx.o from feexxxx.k.
XX
XX          %.a :; recipe...
XX
XX     describes how to make a file whose suffix is .a without
XX     inferring any prerequisites.
XX
XX          %.c : %.y yaccsrc/%.y ; recipe...
XX
XX     is a short form for the construct:
XX
XX          %.c : %.y ; recipe...
XX          %.c : yaccsrc/%.y ; recipe...
XX
XX     ie. It is possible to specify the same recipe for two
XX     %-rules by giving more than one prerequisite in the prere-
XX     quisite list.  A more interesting example is:
XX
XX          % : RCS/%,v ; co $@
XX
XX     which describes how to take any target and check it out of
XX     the RCS directory if the corresponding file exists in the
XX     RCS directory.  The equivalent SCCS rule would be:
XX
XX          % : s.% ; get $@
XX
XX
XX     The previous RCS example defines an infinite rule, because
XX     it says how to make _a_n_y_t_h_i_n_g from RCS/%,v, and _a_n_y_t_h_i_n_g also
XX     includes RCS/fred.c,v.  To limit the size of the graph that
XX     results from such rules ddmmaakkee uses the macro variable PREP
XX     (stands for % repetition).  By default the value of this
XX     variable is 0, which says that no repetitions of a %-rule
XX     are to be generated.  If it is set to something greater than
XX     0, then that many repetitions of any infinite %-rule are
XX     allowed.  If in the above example PREP was set to 1, then
XX     ddmmaakkee would generate the dependency graph:
XX
XX          % --> RCS/%,v --> RCS/RCS/%,v,v
XX
XX     Where each link is assigned the same recipe as the first
XX
XX
XX
XVersion 3.70                    UW                             35
XX
XX
XX
XX
XDMAKE(p)             Unsupported Free Software            DMAKE(p)
XX
XX
XX
XX     link.  PREP should be used only in special cases, since it
XX     may result in a large increase in the number of possible
XX     prerequisites tested.  ddmmaakkee further assumes that any target
XX     that has no suffix can be made from a prerequisite that has
XX     at least one suffix.
XX
XX     ddmmaakkee supports dynamic prerequisite generation for prere-
XX     quisites of %-meta rules.  This is best illustrated by an
XX     example.  The RCS rule shown above can infer how to check
XX     out a file from a corresponding RCS file only if the target
XX     is a simple file name with no directory information.  That
XX     is, the above rule can infer how to find _R_C_S_/_f_r_e_d_._c_,_v from
XX     the target _f_r_e_d_._c, but cannot infer how to find
XX     _s_r_c_d_i_r_/_R_C_S_/_f_r_e_d_._c_,_v from _s_r_c_d_i_r_/_f_r_e_d_._c because the above
XX     rule will cause ddmmaakkee to look for RCS/srcdir/fred.c,v; which
XX     does not exist (assume that srcdir has its own RCS directory
XX     as is the common case).
XX
XX     A more versatile formulation of the above RCS check out rule
XX     is the following:
XX
XX          % :  $$(@:d)RCS/$$(@:f),v : co $@
XX
XX     This rule uses the dynamic macro $@ to specify the prere-
XX     quisite to try to infer.  During inference of this rule the
XX     macro $@ is set to the value of the target of the %-meta
XX     rule and the appropriate prerequisite is generated by
XX     extracting the directory portion of the target name (if
XX     any), appending the string _R_C_S_/ to it, and appending the
XX     target file name with a trailing _,_v attached to the previous
XX     result.
XX
XX     ddmmaakkee can also infer indirect prerequisites.  An inferred
XX     target can have a list of prerequisites added that will not
XX     show up in the value of $< but will show up in the value of
XX     $? and $&.  Indirect prerequisites are specified in an
XX     inference rule by quoting the prerequisite with single
XX     quotes.  For example, if you had the explicit dependency:
XX
XX          fred.o : fred.c ; rule to make fred.o
XX          fred.o : local.h
XX
XX     then this can be inferred for fred.o from the following
XX     inference rule:
XX
XX          %.o : %.c 'local.h' ; rule to make a .o from a .c
XX
XX     You may infer indirect prerequisites that are a function of
XX     the value of '%' in the current rule.  The meta-rule:
XX
XX          %.o : %.c '$(INC)/%.h' ; rule to make a .o from a .c
XX
XX
XX
XX
XVersion 3.70                    UW                             36
XX
XX
XX
XX
XDMAKE(p)             Unsupported Free Software            DMAKE(p)
XX
XX
XX
XX     infers an indirect prerequisite found in the INC directory
XX     whose name is the same as the expansion of $(INC), and the
XX     prerequisite name depends on the base name of the current
XX     target.  The set of indirect prerequisites is attached to
XX     the meta rule in which they are specified and are inferred
XX     only if the rule is used to infer a recipe for a target.
XX     They do not play an active role in driving the inference
XX     algorithm.  The construct:
XX
XX          %.o : %.c %.f 'local.h'; recipe
XX
XX     is equivalent to:
XX
XX          %.o : %.c 'local.h' : recipe
XX          %.o : %.f 'local.h' : recipe
XX
XX
XX     If any of the attributes .SETDIR, .EPILOG, .PROLOG, .SILENT,
XX     .USESHELL, .SWAP, .PRECIOUS, .LIBRARY, .NOSTATE and .IGNORE
XX     are given for a %-rule then when that rule is bound to a
XX     target as the result of an inference, the target's set of
XX     attributes is augmented by the attributes from the above set
XX     that are specified in the bound %-rule.  Other attributes
XX     specified for %-meta rules are not inherited by the target.
XX     The .SETDIR attribute is treated in a special way.  If the
XX     target already had a .SETDIR attribute set then ddmmaakkee
XX     changes to that directory prior to performing the inference.
XX     During inference any .SETDIR attributes for the inferred
XX     prerequisite are honored.  The directories must exist for a
XX     %-meta rule to be selected as a possible inference path.  If
XX     the directories do not exist no error message is issued,
XX     instead the corresponding path in the inference graph is
XX     rejected.
XX
XX     ddmmaakkee also supports the old format special target
XX     .<suffix>.<suffix> by identifying any rules of this form and
XX     mapping them to the appropriate %-rule.  So for example if
XX     an old makefile contains the construct:
XX
XX          .c.o :; cc -c $< -o $@
XX
XX     ddmmaakkee maps this into the following %-rule:
XX
XX          %.o : %.c; cc -c $< -o $@
XX
XX     Furthermore, ddmmaakkee understands several SYSV AUGMAKE special
XX     targets and maps them into corresponding %-meta rules.
XX     These transformation must be enabled by providing the -A
XX     flag on the command line or by setting the value of AUGMAKE
XX     to non-NULL.  The construct
XX
XX          .suff :; recipe
XX
XX
XX
XVersion 3.70                    UW                             37
XX
XX
XX
XX
XDMAKE(p)             Unsupported Free Software            DMAKE(p)
XX
XX
XX
XX     gets mapped into:
XX
XX          % : %.suff; recipe
XX
XX     and the construct
XX
XX          .c~.o :; recipe
XX
XX     gets mapped into:
XX
XX          %.o : s.%.c ; recipe
XX
XX     In general, a special target of the form .<str>~ is replaced
XX     by the %-rule construct s.%.<str>, thereby providing support
XX     for the syntax used by SYSV AUGMAKE for providing SCCS sup-
XX     port.  When enabled, these mappings allow processing of
XX     existing SYSV makefiles without modifications.
XX
XX     ddmmaakkee bases all of its inferences on the inference graph
XX     constructed from the %-rules defined in the makefile.  It
XX     knows exactly which targets can be made from which prere-
XX     quisites by making queries on the inference graph.  For this
XX     reason .SUFFIXES is not needed and is completely ignored.
XX
XX     For a %-meta rule to be inferred as the rule whose recipe
XX     will be used to make a target, the target's name must match
XX     the %-target pattern, and any inferred %-prerequisite must
XX     already exist or have an explicit recipe so that the prere-
SHAR_EOF
true || echo 'restore of dm37p2 failed'
fi
echo 'End of  part 3'
echo 'File dm37p2 is continued in part 4'
echo 4 > _shar_seq_.tmp
exit 0

exit 0 # Just in case...
-- 
Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
Sterling Software, IMD           UUCP:     uunet!sparky!kent
Phone:    (402) 291-8300         FAX:      (402) 291-4362
Please send comp.sources.misc-related mail to kent@uunet.uu.net.