home *** CD-ROM | disk | FTP | other *** search
Text File | 1991-06-29 | 38.4 KB | 1,016 lines |
- Newsgroups: comp.sources.misc
- From: Dennis Vadura <dvadura@watdragon.waterloo.edu>
- Subject: v20i080: dmake - dmake version 3.7, Patch02e/12
- Message-ID: <1991Jun29.222605.4198@sparky.IMD.Sterling.COM>
- X-Md4-Signature: 2d08f812f474d89866fd2da9169b2d27
- Date: Sat, 29 Jun 1991 22:26:05 GMT
- Approved: kent@sparky.imd.sterling.com
-
- Submitted-by: Dennis Vadura <dvadura@watdragon.waterloo.edu>
- Posting-number: Volume 20, Issue 80
- Archive-name: dmake/patch02e
- Patch-To: dmake: Volume 19, Issue 22-58
-
- #!/bin/sh
- # this is dp2.04 (part 4 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" != 4; 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 quisite can be made. Without _t_r_a_n_s_i_t_i_v_e _c_l_o_s_u_r_e on the
- XX inference graph the above rule describes precisely when an
- XX inference match terminates the search. If transitive clo-
- XX sure is enabled (the usual case), and a prerequisite does
- XX not exist or cannot be made, then ddmmaakkee invokes the infer-
- XX ence algorithm recursively on the prerequisite to see if
- XX there is some way the prerequisite can be manufactured.
- XX For, if the prerequisite can be made then the current target
- XX can also be made using the current %-meta rule. This means
- XX that there is no longer a need to give a rule for making a
- XX .o from a .y if you have already given a rule for making a
- XX .o from a .c and a .c from a .y. In such cases ddmmaakkee can
- XX infer how to make the .o from the .y via the intermediary .c
- XX and will remove the .c when the .o is made. Transitive clo-
- XX sure can be disabled by giving the -T switch on the command
- XX line.
- XX
- XX A word of caution. ddmmaakkee bases its transitive closure on
- XX the %-meta rule targets. When it performs transitive clo-
- XX sure it infers how to make a target from a prerequisite by
- XX performing a pattern match as if the potential prerequisite
- XX were a new target. The set of rules:
- XX
- XX %.o : %.c :; rule for making .o from .c
- XX
- XX
- XX
- XVersion 3.70 UW 38
- XX
- XX
- XX
- XX
- XDMAKE(p) Unsupported Free Software DMAKE(p)
- XX
- XX
- XX
- XX %.c : %.y :; rule for making .c from .y
- XX % : RCS/%,v :; check out of RCS file
- XX
- XX will, by performing transitive closure, allow ddmmaakkee to infer
- XX how to make a .o from a .y using a .c as an intermediate
- XX temporary file. Additionally it will be able to infer how
- XX to make a .y from an RCS file, as long as that RCS file is
- XX in the RCS directory and has a name which ends in .y,v. The
- XX transitivity computation is performed dynamically for each
- XX target that does not have a recipe. This has potential to
- XX be costly if the %-meta rules are not carefully specified.
- XX The .NOINFER attribute is used to mark a %-meta node as
- XX being a final target during inference. Any node with this
- XX attribute set will not be used for subsequent inferences.
- XX As an example the node RCS/%,v is marked as a final node
- XX since we know that if the RCS file does not exist there
- XX likely is no other way to make it. Thus the standard
- XX startup makefile contains an entry similar to:
- XX .NOINFER : RCS/%,v
- XX Thereby indicating that the RCS file is the end of the
- XX inference chain.
- XX
- XX Whenever the inference algorithm determines that a target
- XX can be made from more than one prerequisite and the infer-
- XX ence chains for the two methods are the same length the
- XX algorithm reports an ambiguity and prints the ambiguous
- XX inference chains.
- XX
- XX ddmmaakkee tries to remove intermediate files resulting from
- XX transitive closure if the file is not marked as being PRE-
- XX CIOUS, or the --uu flag was not given on the command line, and
- XX if the inferred intermediate did not previously exist.
- XX Intermediate targets that existed prior to being made are
- XX never removed. This is in keeping with the philosophy that
- XX ddmmaakkee should never remove things from the file system that
- XX it did not add. If the special target .REMOVE is defined
- XX and has a recipe then ddmmaakkee constructs a list of the inter-
- XX mediate files to be removed and makes them prerequisites of
- XX .REMOVE. It then makes .REMOVE thereby removing the prere-
- XX quisites if the recipe of .REMOVE says to. Typically
- XX .REMOVE is defined in the startup file as:
- XX
- XX .REMOVE :; $(RM) $<
- XX
- XMMAAKKIINNGG TTAARRGGEETTSS
- XX In order to update a target ddmmaakkee must execute a recipe.
- XX When a recipe needs to be executed it is first expanded so
- XX that any macros in the recipe text are expanded, and it is
- XX then either executed directly or passed to a shell. ddmmaakkee
- XX supports two types of recipes. The regular recipes and
- XX group recipes.
- XX
- XX
- XX
- XX
- XVersion 3.70 UW 39
- XX
- XX
- XX
- XX
- XDMAKE(p) Unsupported Free Software DMAKE(p)
- XX
- XX
- XX
- XX When a regular recipe is invoked ddmmaakkee executes each line of
- XX the recipe separately using a new copy of a shell if a shell
- XX is required. Thus effects of commands do not generally per-
- XX sist across recipe lines. (e.g. cd requests in a recipe
- XX line do not carry over to the next recipe line) The decision
- XX on whether a shell is required to execute a command is based
- XX on the value of the macro SHELLMETAS or on the specification
- XX of '+' or .USESHELL for the current recipe or target respec-
- XX tively. If any character in the value of SHELLMETAS is
- XX found in the expanded recipe text-line or the use of a shell
- XX is requested explicitly via '+' or .USESHELL then the com-
- XX mand is executed using a shell, otherwise the command is
- XX executed directly. The shell that is used for execution is
- XX given by the value of the macro SHELL. The flags that are
- XX passed to the shell are given by the value of SHELLFLAGS.
- XX Thus ddmmaakkee constructs the command line:
- XX
- XX $(SHELL) $(SHELLFLAGS) $(expanded_recipe_command)
- XX
- XX Normally ddmmaakkee writes the command line that it is about to
- XX invoke to standard output. If the .SILENT attribute is set
- XX for the target or for the recipe line (via @), then the
- XX recipe line is not echoed.
- XX
- XX Group recipe processing is similar to that of regular
- XX recipes, except that a shell is always invoked. The shell
- XX that is invoked is given by the value of the macro GROUP-
- XX SHELL, and its flags are taken from the value of the macro
- XX GROUPFLAGS. If a target has the .PROLOG attribute set then
- XX ddmmaakkee prepends to the shell script the recipe associated
- XX with the special target .GROUPPROLOG, and if the attribute
- XX .EPILOG is set as well, then the recipe associated with the
- XX special target .GROUPEPILOG is appended to the script file.
- XX This facility can be used to always prepend a common header
- XX and common trailer to group recipes. Group recipes are
- XX echoed to standard output just like standard recipes, but
- XX are enclosed by lines beginning with [ and ].
- XX
- XX The recipe flags [+,-,%,@] are recognized at the start of a
- XX recipe line even if they appear in a macro. For example:
- XX
- XX SH = +
- XX all:
- XX $(SH)echo hi
- XX
- XX is completely equivalent to writing
- XX
- XX SH = +
- XX all:
- XX +echo hi
- XX
- XX
- XX
- XX
- XX
- XVersion 3.70 UW 40
- XX
- XX
- XX
- XX
- XDMAKE(p) Unsupported Free Software DMAKE(p)
- XX
- XX
- XX
- XX The last step performed by ddmmaakkee prior to running a recipe
- XX is to set the macro CMNDNAME to the name of the command to
- XX execute (determined by finding the first white-space ending
- XX token in the command line). It then sets the macro CMNDARGS
- XX to be the remainder of the line. ddmmaakkee then expands the
- XX macro COMMAND which by default is set to
- XX
- XX COMMAND = $(CMNDNAME) $(CMNDARGS)
- XX
- XX The result of this final expansion is the command that will
- XX be executed. The reason for this expansion is to allow for
- XX a different interface to the argument passing facilities
- XX (esp. under DOS) than that provided by ddmmaakkee. You can for
- XX example define COMMAND to be
- XX
- XX COMMAND = $(CMNDNAME) @$(mktmp $(CMNDARGS))
- XX
- XX which dumps the arguments into a temporary file and runs the
- XX command
- XX
- XX $(CMNDNAME) @/tmp/ASAD23043
- XX
- XX which has a much shorter argument list. It is now up to the
- XX command to use the supplied argument as the source for all
- XX other arguments. As an optimization, if COMMAND is not
- XX defined ddmmaakkee does not perform the above expansion. On sys-
- XX tems, such as UNIX, that handle long command lines this pro-
- XX vides a slight saving in processing the makefiles.
- XX
- XMMAAKKIINNGG LLIIBBRRAARRIIEESS
- XX Libraries are easy to maintain using ddmmaakkee. A library is a
- XX file containing a collection of object files. Thus to make
- XX a library you simply specify it as a target with the
- XX .LIBRARY attribute set and specify its list of prere-
- XX quisites. The prerequisites should be the object members
- XX that are to go into the library. When ddmmaakkee makes the
- XX library target it uses the .LIBRARY attribute to pass to the
- XX prerequisites the .LIBMEMBER attribute and the name of the
- XX library. This enables the file binding mechanism to look
- XX for the member in the library if an appropriate object file
- XX cannot be found. A small example best illustrates this.
- XX
- XX mylib.a .LIBRARY : mem1.o mem2.o mem3.o
- XX rules for making library...
- XX # remember to remove .o's when lib is made
- XX
- XX # equivalent to: '%.o : %.c ; ...'
- XX .c.o :; rules for making .o from .c say
- XX
- XX ddmmaakkee will use the .c.o rule for making the library members
- XX if appropriate .c files can be found using the search rules.
- XX NOTE: this is not specific in any way to C programs, they
- XX
- XX
- XX
- XVersion 3.70 UW 41
- XX
- XX
- XX
- XX
- XDMAKE(p) Unsupported Free Software DMAKE(p)
- XX
- XX
- XX
- XX are simply used as an example.
- XX
- XX ddmmaakkee tries to handle the old library construct format in a
- XX sensible way. The construct _l_i_b_(_m_e_m_b_e_r_._o_) is separated and
- XX the _l_i_b portion is declared as a library target. The new
- XX target is defined with the .LIBRARY attribute set and the
- XX _m_e_m_b_e_r_._o portion of the construct is declared as a prere-
- XX quisite of the lib target. If the construct _l_i_b_(_m_e_m_b_e_r_._o_)
- XX appears as a prerequisite of a target in the makefile, that
- XX target has the new name of the lib assigned as its prere-
- XX quisite. Thus the following example:
- XX
- XX a.out : ml.a(a.o) ml.a(b.o); $(CC) -o $@ $<
- XX
- XX .c.o :; $(CC) -c $(CFLAGS) -o $@ $<
- XX %.a:
- XX ar rv $@ $<
- XX ranlib $@
- XX rm -rf $<
- XX
- XX constructs the following dependency graph.
- XX
- XX a.out : ml.a; $(CC) -o $@ $<
- XX ml.a .LIBRARY : a.o b.o
- XX
- XX %.o : %.c ; $(CC) -c $(CFLAGS) -o $@ $<
- XX %.a :
- XX ar rv $@ $<
- XX ranlib $@
- XX rm -rf $<
- XX
- XX and making a.out then works as expected.
- XX
- XX The same thing happens for any target of the form
- XX _l_i_b_(_(_e_n_t_r_y_)_). These targets have an additional feature in
- XX that the _e_n_t_r_y target has the .SYMBOL attribute set automat-
- XX ically.
- XX
- XX NOTE: If the notion of entry points is supported by the
- XX archive and by ddmmaakkee (currently not the case) then ddmmaakkee
- XX will search the archive for the entry point and return not
- XX only the modification time of the member which defines the
- XX entry but also the name of the member file. This name will
- XX then replace _e_n_t_r_y and will be used for making the member
- XX file. Once bound to an archive member the .SYMBOL attribute
- XX is removed from the target. This feature is presently dis-
- XX abled as there is little standardization among archive for-
- XX mats, and we have yet to find a makefile utilizing this
- XX feature (possibly due to the fact that it is unimplemented
- XX in most versions of UNIX Make).
- XX
- XX
- XX
- XX
- XX
- XVersion 3.70 UW 42
- XX
- XX
- XX
- XX
- XDMAKE(p) Unsupported Free Software DMAKE(p)
- XX
- XX
- XX
- XX Finally, when ddmmaakkee looks for a library member it must first
- XX locate the library file. It does so by first looking for
- XX the library relative to the current directory and if it is
- XX not found it then looks relative to the current value of
- XX $(TMD). This allows commonly used libraries to be kept near
- XX the root of a source tree and to be easily found by ddmmaakkee.
- XX
- XKKEEEEPP SSTTAATTEE
- XX ddmmaakkee supports the keeping of state information for targets
- XX that it makes whenever the macro .KEEP_STATE is assigned a
- XX value. The value of the macro should be the name of a state
- XX file that will contain the state information. If state
- XX keeping is enabled then each target that does not poses the
- XX .NOSTATE attribute will have a record written into the state
- XX file indicating the target's name, the current directory,
- XX the command used to update the target, and which, if any, ::
- XX rule is being used. When you make this target again if any
- XX of this information does not match the previous settings and
- XX the target is not out dated it will still be re-made. The
- XX assumption is that one of the conditions above has changed
- XX and that we wish to remake the target. For example, state
- XX keeping is used in the maintenance of ddmmaakkee to test compile
- XX different versions of the source using different compilers.
- XX Changing the compiler causes the compilation flags to be
- XX modified and hence all sources to be recompiled.
- XX
- XX The state file is an ascii file and is portable, however it
- XX is not in human readable form as the entries represent hash
- XX keys of the above information.
- XX
- XX The Sun Microsystem's Make construct
- XX
- XX .KEEP_STATE :
- XX
- XX is recognized and is mapped to ..KKEEEEPP__SSTTAATTEE::==__ssttaattee..mmkk. The
- XX ddmmaakkee version of state keeping does not include scanning C
- XX source files for dependencies like Sun Make. This is
- XX specific to C programs and it was felt that it does not
- XX belong in make. ddmmaakkee instead provides the tool, ccddeeppeenndd,
- XX to scan C source files and to produce depedency information.
- XX Users are free to modify cdepend to produce other dependency
- XX files. (NOTE: ccddeeppeenndd does not come with the distribution
- XX at this time, but will be available in a patch in the near
- XX future)
- XX
- XMMUULLTTII PPRROOCCEESSSSIINNGG
- XX If the architecture supports it then ddmmaakkee is capable of
- XX making a target's prerequisites in parallel. ddmmaakkee will
- XX make as much in parallel as it can and use a number of child
- XX processes up to the maximum specified by MAXPROCESS or by
- XX the value supplied to the -P command line flag. A parallel
- XX make is enabled by setting the value of MAXPROCESS (either
- XX
- XX
- XX
- XVersion 3.70 UW 43
- XX
- XX
- XX
- XX
- XDMAKE(p) Unsupported Free Software DMAKE(p)
- XX
- XX
- XX
- XX directly or via -P option) to a value which is > 1. ddmmaakkee
- XX guarantees that all dependencies as specified in the
- XX makefile are honored. A target will not be made until all
- XX of its prerequisites have been made. If a parallel make is
- XX being performed then the following restrictions on parallel-
- XX ism are enforced.
- XX
- XX 1. Individual recipe lines in a non-group recipe are
- XX performed sequentially in the order in which they
- XX are specified within the makefile and in parallel
- XX with the recipes of other targets.
- XX
- XX 2. If a target contains multiple recipe definitions
- XX (cf. :: rules) then these are performed sequen-
- XX tially in the order in which the :: rules are
- XX specified within the makefile and in parallel with
- XX the recipes of other targets.
- XX
- XX 3. If a target rule contains the `!' modifier, then
- XX the recipe is performed sequentially for the list
- XX of outdated prerequisites and in parallel with the
- XX recipes of other targets.
- XX
- XX 4. If a target has the .SEQUENTIAL attribute set then
- XX all of its prerequisites are made sequentially
- XX relative to one another (as if MAXPROCESS=1), but
- XX in parallel with other targets in the makefile.
- XX
- XX Note: If you specify a parallel make then the order of tar-
- XX get update and the order in which the associated recipes are
- XX invoked will not correspond to that displayed by the -n
- XX flag.
- XX
- XCCOONNDDIITTIIOONNAALLSS
- XX ddmmaakkee supports a makefile construct called a _c_o_n_d_i_t_i_o_n_a_l.
- XX It allows the user to conditionally select portions of
- XX makefile text for input processing and to discard other por-
- XX tions. This becomes useful for writing makefiles that are
- XX intended to function for more than one target host and
- XX environment. The conditional expression is specified as
- XX follows:
- XX
- XX .IF _e_x_p_r_e_s_s_i_o_n
- XX ... if text ...
- XX .ELIF _e_x_p_r_e_s_s_i_o_n
- XX ... if text ...
- XX .ELSE
- XX ... else text ...
- XX .END
- XX
- XX The .ELSE and .ELIF portions are optional, and the condi-
- XX tionals may be nested (ie. the text may contain another
- XX
- XX
- XX
- XVersion 3.70 UW 44
- XX
- XX
- XX
- XX
- XDMAKE(p) Unsupported Free Software DMAKE(p)
- XX
- XX
- XX
- XX conditional). .IF, .ELSE, and .END may appear anywhere in
- XX the makefile, but a single conditional expression may not
- XX span multiple makefiles.
- XX
- XX _e_x_p_r_e_s_s_i_o_n can be one of the following three forms:
- XX
- XX <text> | <text> == <text> | <text> != <text>
- XX
- XX where _t_e_x_t is either text or a macro expression. In any
- XX case, before the comparison is made, the expression is
- XX expanded. The text portions are then selected and compared.
- XX White space at the start and end of the text portion is dis-
- XX carded before the comparison. This means that a macro that
- XX evaluates to nothing but white space is considered a NULL
- XX value for the purpose of the comparison. In the first case
- XX the expression evaluates TRUE if the text is not NULL other-
- XX wise it evaluates FALSE. The remaining two cases both
- XX evaluate the expression on the basis of a string comparison.
- XX If a macro expression needs to be equated to a NULL string
- XX then compare it to the value of the macro $(NULL). You can
- XX use the $(shell ...) macro to construct more complex test
- XX expressions.
- XX
- XEEXXAAMMPPLLEESS
- XX # A simple example showing how to use make
- XX #
- XX prgm : a.o b.o
- XX cc a.o b.o -o prgm
- XX a.o : a.c g.h
- XX cc a.c -o $@
- XX b.o : b.c g.h
- XX cc b.c -o $@
- XX
- XX In the previous example prgm is remade only if a.o and/or
- XX b.o is out of date with respect to prgm. These dependencies
- XX can be stated more concisely by using the inference rules
- XX defined in the standard startup file. The default rule for
- XX making .o's from .c's looks something like this:
- XX
- XX %.o : %.c; cc -c $(CFLAGS) -o $@ $<
- XX
- XX Since there exists a rule (defined in the startup file) for
- XX making .o's from .c's ddmmaakkee will use that rule for manufac-
- XX turing a .o from a .c and we can specify our dependencies
- XX more concisely.
- XX
- XX prgm : a.o b.o
- XX cc -o prgm $<
- XX a.o b.o : g.h
- XX
- XX A more general way to say the above using the new macro
- XX expansions would be:
- XX
- XX
- XX
- XVersion 3.70 UW 45
- XX
- XX
- XX
- XX
- XDMAKE(p) Unsupported Free Software DMAKE(p)
- XX
- XX
- XX
- XX SRC = a b
- XX OBJ = {$(SRC)}.o
- XX
- XX prgm : $(OBJ)
- XX cc -o $@ $<
- XX
- XX $(OBJ) : g.h
- XX
- XX If we want to keep the objects in a separate directory,
- XX called objdir, then we would write something like this.
- XX
- XX SRC = a b
- XX OBJ = {$(SRC)}.o
- XX
- XX prgm : $(OBJ)
- XX cc $< -o $@
- XX
- XX $(OBJ) : g.h
- XX %.o : %.c
- XX $(CC) -c $(CFLAGS) -o $(@:f) $<
- XX mv $(@:f) objdir
- XX
- XX .SOURCE.o : objdir # tell make to look here for .o's
- XX
- XX An example of building library members would go something
- XX like this: (NOTE: The same rules as above will be used to
- XX produce .o's from .c's)
- XX
- XX SRC = a b
- XX LIB = lib
- XX LIBm = { $(SRC) }.o
- XX
- XX prgm: $(LIB)
- XX cc -o $@ $(LIB)
- XX
- XX $(LIB) .LIBRARY : $(LIBm)
- XX ar rv $@ $<
- XX rm $<
- XX
- XX Finally, suppose that each of the source files in the previ-
- XX ous example had the `:' character in their target name.
- XX Then we would write the above example as:
- XX
- XX SRC = f:a f:b
- XX LIB = lib
- XX LIBm = "{ $(SRC) }.o" # put quotes around each token
- XX
- XX prgm: $(LIB)
- XX cc -o $@ $(LIB)
- XX
- XX $(LIB) .LIBRARY : $(LIBm)
- XX ar rv $@ $<
- XX
- XX
- XX
- XVersion 3.70 UW 46
- XX
- XX
- XX
- XX
- XDMAKE(p) Unsupported Free Software DMAKE(p)
- XX
- XX
- XX
- XX rm $<
- XX
- XCCOOMMPPAATTIIBBIILLIITTYY
- XX There are two notable differences between ddmmaakkee and the
- XX standard version of BSD UNIX 4.2/4.3 Make.
- XX
- XX 1. BSD UNIX 4.2/4.3 Make supports wild card filename
- XX expansion for prerequisite names. Thus if a direc-
- XX tory contains a.h, b.h and c.h, then a line like
- XX
- XX target: *.h
- XX
- XX will cause UNIX make to expand the *.h into "a.h b.h
- XX c.h". ddmmaakkee does not support this type of filename
- XX expansion.
- XX
- XX 2. Unlike UNIX make, touching a library member causes
- XX ddmmaakkee to search the library for the member name and
- XX to update the library time stamp. This is only
- XX implemented in the UNIX version. MSDOS and other
- XX versions may not have librarians that keep file time
- XX stamps, as a result ddmmaakkee touches the library file
- XX itself, and prints a warning.
- XX
- XX ddmmaakkee is not compatible with GNU Make. In particular it
- XX does not understand GNU Make's macro expansions that query
- XX the file system.
- XX
- XX ddmmaakkee is fully compatible with SYSV AUGMAKE, and supports
- XX the following AUGMAKE features:
- XX
- XX 1. The word iinncclluuddee appearing at the start of a line
- XX can be used instead of the ".INCLUDE :" construct
- XX understood by ddmmaakkee.
- XX
- XX 2. The macro modifier expression $(macro:str=sub) is
- XX understood and is equivalent to the expression
- XX $(macro:s/str/sub), with the restriction that str
- XX must match the following regular expression:
- XX
- XX str[ |\t][ |\t]*
- XX
- XX (ie. str only matches at the end of a token where
- XX str is a suffix and is terminated by a space, a tab,
- XX or end of line)
- XX
- XX 3. The macro % is defined to be $@ (ie. $% expands to
- XX the same value as $@).
- XX
- XX 4. The AUGMAKE notion of libraries is handled
- XX correctly.
- XX
- XX
- XX
- XX
- XVersion 3.70 UW 47
- XX
- XX
- XX
- XX
- XDMAKE(p) Unsupported Free Software DMAKE(p)
- XX
- XX
- XX
- XX 5. When defining special targets for the inference
- XX rules and the AUGMAKE special target handling is
- XX enabled then the special target .X is equivalent to
- XX the %-rule "% : %.X".
- XX
- XX 6. Directories are always made if you specify --AA. This
- XX is consistent with other UNIX versions of Make.
- XX
- XX 7. Makefiles that utilize virtual targets to force mak-
- XX ing of other targets work as expected if AUGMAKE
- XX special target handling is enabled. For example:
- XX
- XX FRC:
- XX myprog.o : myprog.c $(FRC) ; ...
- XX
- XX Works as expected if you issue the command
- XX
- XX 'ddmmaakkee -A FRC=FRC'
- XX
- XX but fails with a 'don't know how to make FRC' error
- XX message if you do not specify AUGMAKE special target
- XX handling via the -A flag (or by setting AUGMAKE:=yes
- XX internally).
- XX
- XLLIIMMIITTSS
- XX In some environments the length of an argument string is
- XX restricted. (e.g. MSDOS command line arguments cannot be
- XX longer than 128 bytes if you are using the standard
- XX command.com command interpreter as your shell, ddmmaakkee text
- XX diversions may help in these situations.)
- XX
- XPPOORRTTAABBIILLIITTYY
- XX To write makefiles that can be moved from one environment to
- XX another requires some forethought. In particular you must
- XX define as macros all those things that may be different in
- XX the new environment. ddmmaakkee has two facilities that help to
- XX support writing portable makefiles, recursive macros and
- XX conditional expressions. The recursive macros, allow one to
- XX define environment configurations that allow different
- XX environments for similar types of operating systems. For
- XX example the same make script can be used for SYSV and BSD
- XX but with different macro definitions.
- XX
- XX To write a makefile that is portable between UNIX and MSDOS
- XX requires both features since in almost all cases you will
- XX need to define new recipes for making targets. The recipes
- XX will probably be quite different since the capabilities of
- XX the tools on each machine are different. Different macros
- XX will be needed to help handle the smaller differences in the
- XX two environments.
- XX
- XX
- XX
- XX
- XX
- XVersion 3.70 UW 48
- XX
- XX
- XX
- XX
- XDMAKE(p) Unsupported Free Software DMAKE(p)
- XX
- XX
- XX
- XFFIILLEESS
- XX Makefile, makefile, startup.mk (use dmake -V to tell you
- XX where the startup file is)
- XX
- XSSEEEE AALLSSOO
- XX sh(1), csh(1), touch(1), f77(1), pc(1), cc(1)
- XX S.I. Feldman _M_a_k_e _- _A _P_r_o_g_r_a_m _f_o_r _M_a_i_n_t_a_i_n_i_n_g _C_o_m_p_u_t_e_r _P_r_o_-
- XX _g_r_a_m_s
- XX
- XAAUUTTHHOORR
- XX Dennis Vadura, CS Dept. University of Waterloo.
- XX dvadura@watdragon.uwaterloo.ca
- XX Many thanks to Carl Seger for his helpful suggestions, and
- XX to Trevor John Thompson for his many excellent ideas and
- XX informative bug reports.
- XX
- XBBUUGGSS
- XX Some system commands return non-zero status inappropriately.
- XX Use --ii (`-' within the makefile) to overcome the difficulty.
- XX
- XX Some systems do not have easily accessible time stamps for
- XX library members (MSDOS, AMIGA, etc) for these ddmmaakkee uses the
- XX time stamp of the library instead and prints a warning the
- XX first time it does so. This is almost always ok, except
- XX when multiple makefiles update a single library file. In
- XX these instances it is possible to miss an update if one is
- XX not careful.
- XX
- XX This man page is way too long.
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XX
- XVersion 3.70 UW 49
- XSHAR_EOF
- Xchmod 0640 man/dmake.p ||
- Xecho 'restore of man/dmake.p failed'
- XWc_c="`wc -c < 'man/dmake.p'`"
- Xtest 125864 -eq "$Wc_c" ||
- X echo 'man/dmake.p: original size 125864, current size' "$Wc_c"
- Xfi
- X# ============= man/dmake.tf ==============
- Xif test -f 'man/dmake.tf' -a X != X; then
- X echo 'x - skipping man/dmake.tf (File already exists)'
- Xelse
- Xecho 'x - extracting man/dmake.tf (Text)'
- Xsed 's/^X//' << 'SHAR_EOF' > 'man/dmake.tf' &&
- X.\" Copyright (c) 1990 Dennis Vadura, All rights reserved.
- X.\"
- X.ds TB "0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.5i +0.5i +2.0i
- X.de Ip
- X.fi
- X.nr Ip \w'\\$1 'u
- X.IP "\\$1" \\n(Ipu
- X\\$2
- X.nf
- X..
- X.de Is
- X.nr )I \w'\\$1'u
- X..
- X.de Ii
- X.in \\n()Ru
- X.nr )E 1
- X.ns
- X.ne 1.1v
- X.it 1 }N
- X.di ]B
- X\&\\$1
- X..
- X.TH DMAKE p "UW" "Version 3.70" "Unsupported Free Software"
- X.SH NAME
- X\fBdmake\fR \- maintain program groups, or interdependent files
- X.SH SYNOPSIS
- X.B dmake
- X[\-ABceEhiknpqrsStTuVx] [\-v{dfimt}] [\-P#] [\-{f|C|K} file]
- X[macro[*][+][:]=\fIvalue\fP ...] [target ...]
- X.SH DESCRIPTION
- X.PP
- X.B dmake
- Xexecutes commands found in an external file called a
- X.I makefile
- Xto update one or more target names.
- XEach target may depend on zero or more prerequisite targets.
- XIf any of the target's prerequisites is newer than the target or if the target
- Xitself does not exist, then
- X.B dmake
- Xwill attempt to make the target.
- X.PP
- XIf no
- X.B \-f
- Xcommand line option is present then
- X.B dmake
- Xsearches for an existing
- X.I makefile
- Xfrom the list of prerequisites specified for the special target \fI.MAKEFILES\fR
- X(see the STARTUP section for more details).
- XIf "\-" is the name of the file specified to the
- X.B \-f
- Xflag then \fBdmake\fR uses standard input as the source of the makefile text.
- X.PP
- XAny macro definitions (arguments with embedded "="
- Xsigns) that appear on the command line are processed first
- Xand supersede definitions for macros of the same name found
- Xwithin the makefile. In general it is impossible for definitions found
- Xinside the makefile to redefine a macro defined on the command line, see the
- XMACROS section for an exception.
- X.PP
- XIf no
- X.I target
- Xnames are specified on the command line, then \fBdmake\fR uses the first
- Xnon-special target found in the makefile as the default target.
- XSee the
- X.B "SPECIAL TARGETS"
- Xsection for the list of special targets and their function.
- X\fBdmake\fR is a re-implementation of the UNIX Make utility with
- Xsignificant enhancements. Makefiles written for most previous
- Xversions of
- X.I Make
- Xwill be handled correctly by
- X.B dmake.
- XKnown differences between \fBdmake\fR and other versions of make
- Xare discussed in the
- X.B COMPATIBILITY
- Xsection found at the end of this document.
- X.SH OPTIONS
- X.IP "\fB\-A\fR"
- XEnable AUGMAKE special inference rule transformations
- X(see the "PERCENT(%) RULES" section), these are set to off by default.
- X.IP "\fB\-B\fR"
- XEnable the use of spaces instead of <tabs> to begin recipe lines.
- XThis flag equivalent to the .NOTABS special macro and is further described
- Xbelow.
- X.IP "\fB\-c\fR"
- XUse non-standard comment stripping. If you specify \fB\-c\fP then
- X.B dmake
- Xwill treat any \fB#\fP character as a start of comment character wherever it
- Xmay appear unless it is escaped by a \e.
- X.IP "\fB\-C [+]file\fR"
- XThis option writes to \fIfile\fP a copy of standard output and
- Xstandard error from any child processes and from the
- X.B dmake
- Xprocess itself. If you specify a \fB+\fP prior to the file name then
- Xthe text is appended to the previous contents of \fIfile\fP.
- XThis option is active in the MSDOS implementation only and is ignored
- Xby non-MSDOS versions of
- X.B dmake.
- X.IP "\fB\-e\fR"
- XRead the environment and define all strings of the
- Xform '\fBENV\-VAR\fP=\fIevalue\fP'
- Xdefined within as macros whose name is \fBENV\-VAR\fP,
- Xand whose value is '\fIevalue\fP'.
- XThe environment is processed prior to processing the user
- Xspecified makefile thereby allowing definitions in the makefile to override
- Xdefinitions in the environment.
- X.IP "\fB\-E\fR"
- XSame as \-e, except that the environment is processed after the
- Xuser specified makefile has been processed
- X(thus definitions in the environment override definitions in the makefile).
- XThe \-e and \-E options are mutually exclusive.
- XIf both are given the latter takes effect.
- X.IP "\fB\-f file\fR"
- XUse \fBfile\fR as the source for the makefile text.
- XOnly one \fB\-f\fR option is allowed.
- X.IP "\fB\-h\fR"
- XPrint the command summary for \fBdmake\fR.
- X.IP "\fB\-i\fR"
- XTells \fBdmake\fR to ignore errors, and continue making other targets.
- XThis is equivalent to the .IGNORE attribute or macro.
- X.IP "\fB\-K file\fR"
- XTurns on \fB.KEEP_STATE\fP state tracking and tells \fBdmake\fP to use
- X\fIfile\fP as the state file.
- X.IP "\fB\-k\fR"
- XCauses \fBdmake\fR to ignore errors caused by command execution and to make
- Xall targets not depending on targets that could not be made.
- XOrdinarily \fBdmake\fR stops after a command returns a non-zero status,
- Xspecifying \fB\-k\fR causes \fBdmake\fR to ignore the error
- Xand continue to make as much as possible.
- X.IP "\fB\-n\fR"
- XCauses \fBdmake\fR to print out what it would have executed,
- Xbut does not actually execute the commands. A special check is made for
- Xthe string "$(MAKE)" inside a recipe line, if found, the line is expanded
- Xand invoked, thereby enabling recursive makes to give a full
- Xdescription of all that they will do.
- XThe check for "$(MAKE)" is disabled inside group recipes.
- X.IP "\fB\-p\fR"
- XPrint out a version of the digested makefile in human readable form.
- X(useful for debugging, but cannot be re-read by \fBdmake\fP)
- X.IP "\fB\-P#\fR"
- XOn systems that support multi-processing cause \fBdmake\fP to use \fI#\fP
- Xconcurrent child processes to make targets.
- XSee the "MULTI PROCESSING" section for more information.
- X.IP "\fB\-q\fR"
- XCheck and see if the target is up to date. Exits with code 0 if up to date,
- X1 otherwise.
- X.IP "\fB\-r\fR"
- XTells \fBdmake\fR not to read the initial startup makefile, see STARTUP
- Xsection for more details.
- X.IP "\fB\-s\fR"
- XTells \fBdmake\fR to do all its work silently and not echo the commands it is
- Xexecuting to stdout (also suppresses warnings).
- XThis is equivalent to the .SILENT attribute or macro.
- X.IP "\fB\-S\fR"
- XForce sequential execution of recipes on architectures which support
- Xconcurrent makes. For backward compatibility with old makefiles that have
- Xnasty side-effect prerequisite dependencies.
- X.IP "\fB\-t\fR"
- XCauses \fBdmake\fR to touch the targets and bring them up to date
- Xwithout executing any commands.
- X.IP "\fB\-T\fR"
- XTells \fBdmake\fP to not perform transitive closure on the inference graph.
- X.IP "\fB\-u\fR"
- XForce an unconditional update. (ie. do everything that would
- Xbe done if everything that a target depended on was out of date)
- X.IP "\fB\-v[dfimt]\fR"
- XVerbose flag, when making targets print to stdout what we are going to make
- Xand what we think its time stamp is. The optional flags \fB[dfimt]\fP can be
- Xused to restrict the information that is displayed. In the absence of any
- Xoptional flags all are assumed to be given (ie. \fB\-v\fP is equivalent to
- X\fB\-vdfimt\fP). The meanings of the optional flags are:
- X.RS
- X.IP "\fBd\fP"
- XNotify of change directory operations only.
- X.IP "\fBf\fP"
- XNotify of file I/O operations only.
- X.IP "\fBi\fP"
- XNotify of inference algorithm operation only.
- X.IP "\fBm\fP"
- XNotify of target update operations only.
- X.IP "\fBt\fP"
- XKeep any temporary files created; normally they are automatically deleted.
- X.RE
- X.IP "\fB\-V\fR"
- XPrint the version of \fBdmake\fR, and values of builtin macros.
- X.IP "\fB\-x\fR"
- XUpon processing the user makefile export all non-internally defined macros
- Xto the user's environment. This option together with the \-e option
- Xallows SYSV AUGMAKE recursive makes to function as expected.
- X.SH INDEX
- XHere is a list of the sections that follow and a short description of each.
- XPerhaps you won't have to read the whole man page to find
- Xwhat you need.
- X.IP \fBSTARTUP\fP 1.9i
- XDescribes \fBdmake\fP initialization.
- X.IP \fBSYNTAX\fP 1.9i
- XDescribes the syntax of makefile expressions.
- X.IP \fBATTRIBUTES\fP 1.9i
- XDescribes the notion of attributes and how they are used when
- Xmaking targets.
- X.IP \fBMACROS\fP 1.9i
- XDefining and expanding macros.
- X.IP "\fBRULES AND TARGETS" 1.9i
- XHow to define targets and their prerequisites.
- X.IP \fBRECIPES\fP 1.9i
- XHow to tell \fBdmake\fP how to make a target.
- X.IP "\fBTEXT DIVERSIONS\fP" 1.9i
- XHow to use text diversions in recipes and macro expansions.
- X.IP "\fBSPECIAL TARGETS\fP" 1.9i
- XSome targets are special.
- X.IP "\fBSPECIAL MACROS\fP" 1.9i
- XMacros used by \fBdmake\fP to alter the processing of the makefile,
- Xand those defined by \fBdmake\fP for the user.
- X.IP "\fBCONTROL MACROS\fP" 1.9i
- XItemized list of special control macros.
- X.IP "\fBRUN-TIME MACROS\fP" 1.9i
- XDiscussion of special run-time macros such as $@ and $<.
- X.IP "\fBFUNCTION MACROS\fP" 1.9i
- XGNU style function macros, only $(mktmp ...) for now.
- X.IP "\fBDYNAMIC PREREQUISITES\fP" 1.9i
- SHAR_EOF
- true || echo 'restore of dm37p2 failed'
- fi
- echo 'End of part 4'
- echo 'File dm37p2 is continued in part 5'
- echo 5 > _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.
-