home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD2.mdf
/
c
/
tools
/
make
/
dmake37e
/
release
< prev
next >
Wrap
Text File
|
1991-05-06
|
18KB
|
455 lines
dmake Version 3.7
=================
FULL RELEASE OF DMAKE, REPLACES VERSION 3.6
Nature: It is highly recommended that this version replace all versions of 3.6
------- that are in current use. Version 3.7 fixes numerous memory bugs that
were present in Version 3.6. These often caused spurious behaviour
especially on MSDOS machines when complex makefiles were used.
This release addresses the following issues:
1. Modifications to the inference algorithm.
2. Memory bug fixes.
3. Enhancements to the macro expansion facilities.
4. Addition of .KEEP_STATE functionality.
5. Many other tweaks and tunes
This distribution advances dmake to Version 3.7, patch level 0.
Availability:
-------------
dmake is available via anonymous ftp from watmsg.uwaterloo.edu
(129.97.129.9) as:
pub/dmake/dmake37.tar.Z - compressed tar archive
pub/dmake/dmake37.zoo - zoo archive
pub/dmake/dmake37-msdos-exe.zoo - MSDOS executable zoo archive
pub/dmake/dmake37-msdos-exe.zip - MSDOS executable zip archive
pub/dmake/dmake37.shar01 - xx part shar archive
... (get all parts)
pub/dmake/dmake37.sharxx
and comes in several archive formats. Choose the one that best
suits your needs.
Acknowledgements:
-----------------
Thanks to all who submitted code for new features, suggestions for
improvements, and bug fixes. I have tried to make sure no gotchas
remain, if you encounter problems installing or running dmake please
let me know. As always, I am always happy to receive e-mail.
DETAILS OF ENHANCEMENTS/TWEAKS:
===============================
- Ran the whole thing with a DEBUGING malloc library on. Found one memory
bug in expand.c, one in BSD 4.3's version of getwd. I am now fairly
confident that no more obscure memory allocation bugs remain in dmake.
- Addition of the malloc dbug code made me move all debug code into the
dbug directory and I changed the config.mk files around to reflect the
changes. Setting DEBUG=1 on the command line gives you DB_ macros, and
DEBUG=1 DBMALLOC=1 gives you DB_ macros and debuging malloc library.
- Added sysvr4 directory and targets
- Disallowed %.o :: %.c rules. They make no sense and the implementation
was completely wrong. That is, the difference between
%.o : %.c; ...
%.o : %.f; ...
and
%.o :: %.c; ...
%.o :: %.f; ...
is less than clear, and the efficacy of the latter is even muddier. From
now on :: rules are not allowed in %-meta rules. This simplifies the
description of what is going on and makes the code in infer.c significantly
more correct. When %-meta rules are now replaced by other rules, the
.SETDIR attribute (if specified) is taken into consideration and only rules
whose target, prerequisite, and .SETDIR value match are considered for
replacement, otherwise the new rule is added.
- Modified the setting of external file name for targets that have been made
and that had a .SETDIR= attribute as follows:
.SETDIR=fred : test
target : test ; ...
then the name of test in any $< expansions is fred/test if the change of
directory was successful, if however the rules for making test are:
test .SETDIR=a :: ...
test .SETDIR=b :: ...
then the external file name for 'test' is simply 'test'. We don't know
which recipes will be used to bring it up to date in which directories
hence we will not attempt to modify the name of test. The same holds for
the .SOURCE search rules in this case.
You are now able to provide different .SETDIR=dir attributes to each
new :: rule associated with a target, see above for what name is deduced
for such targets after they are made.
- Went to a Breadth-first search inference algorithm. Major change and two
days of hacking, but it seems to work. It is much nicer now and I can
describe with definite determinism what the algorithm will not infer.
All ambiguities are reported rather than choosing an arbitrary inference
chain. This is considerably less error prone, but may break some existing
makefiles. Modified -v display to show exactly what inference chain is
used.
- Fixed the recipe handling of +,-,%,@ at the start of a recipe line. The
attributes are now recognized even if they appear in a macro at the start
of the recipe line. ie;
all:
$(SH) do the right thing
will use the shell if SH=+ is defined somewhere.
- Modified string{token_list} expansions to better co-exist with /bin/sh.
/bin/sh treats the following as valid syntax:
{ echo hello;}
under version 3.6 of dmake it would strip the {} characters or worse.
This version of dmake has been modified to apply the {} only of the
first token in token_list follows the opening { with no intervening
white space. Thus the above line will NOT BE Expanded, while
{foo fee}.c
will result in foo.c and fee.c as the result of the expansion.
- If using Augmake (-A) flag then directories are always made, even if they
are up to date.
- Added .PHONY attribute. Any target with this attribute will have it's
recipe made each time it is made even if a file with the name of the target
exists and can be found by dmake. Targets that have as a prerequisite a
target with the .PHONY attribute set will also get made since the time stamp
of the prerequisite will be made current and it will appear older than the
target thereby forcing it to be made as well.
- Added .ELIF <condition> construct, and allowed .ENDIF as a synnonym for
.END. Made the parsing of .IF....ELIF....ELSE....END constructs a little
more robust.
- Changed behaviour of .SETDIR= attribute when used without prerequisites or
a target.
.SETDIR=somedir :
is no longer supported you should instead use the macro form of the
attribute:
.SETDIR := somedir
The reasoning behind the switch goes as follows. If you wrote the line
.SETDIR=somedir : $(SOURCE_FILES)
and $(SOURCE_FILES) was null this would cause dmake to CD to somedir prior
to making any targets. This situation is undesirable at best as it caused
some weird error messages. The new modified behaviour is more consistent
and allows the attribute to be set on the command line.
- Modified inference to assume targets that have no .suffix can be made from
files that contain at least one .suffix. This prevents early termination of
the inference algorithm.
- Added -v{dfimt} flag so that you can now control
how much junk -v actually prints. This means that
-v is now a seperate flag and cannot be catenated
with the rest... oh well.
- Added DOS tee function to copy the contents of output to stdout and stderr
to a file specified using -C option. patches were supplied by Len Reed.
- Added KEEPSTATE functionality based on Dean Hoovers stuff.
BEWARE: If you make a target and the recipe has a default set of rules
when things are updated, but a slightly different set when it
updates then using KEEPSTATE will fail. In particular:
Suppose you infer a recipe % --> %.o --> %.c, and the first time
you make a target the .o is in the '.' directory, but by default
you tell dmake to look in objects, then when you run dmake the
next time the recipe will be different as the .o will now be
objects/foo.o and the KEEPSTATE value will be outdated and hence
the target will look as if it needs making.
.NOSTATE attribute to disable keeping of state for any target with this
attribute set. no state is kept for .PHONY targets either.
- Added some more GNU style macro expansions:
$(null,text true false)
$(!null,text true false)
$(eq,lhs,rhs true false)
$(!eq,lhs,rhs true false)
The first returns Expand(true) if Expand(text) is null, and Expand(false) if
Expand(text) is not null. The second is the negation of the first.
The equality macros are similar but test
Expand(lhs) == Expand(rhs)
rather than against null.
- Modified the running of normal recipes to perform the following expansion
prior to doing the command:
set CNMDNAME := name of command to execute (first whitespace ending
token in command line)
set CMNDARGS := remainder of the line
Expand $(COMMAND) to form the the command line to pass to be executed. By
default COMMAND is set to:
COMMAND = $(CMNDNAME) $(CMNDARGS)
If however you wish to use a different interface (esp under DOS) for passing
long command line arguments then you can easily do so, for example:
COMMAND = $(CMNDNAME) @(mktmp $(CMNDARGS))
assigns a temporary file that holds the arguments and executest the comand
$(CMNDNAME) @/tmp/ASAD38479217
or whatever, the temporary file is removed upon completion of the command
unless the -vt flag is given.
- Added $(shell command) macro, which passes the commands specified as data to
a shell using the usual interface and returns the result of the output from
the command catenated together into a single string separated by spaces.
For example:
$(shell ls *.c)
returns the list of *.c files from the current directory.
- Added $(sort data) macro which sorts the list of space separated tokens in
data.
- Added $(strip data) macro which makes sure that data contains a list
of tokens separated by a single space.
- Added $(subst,pat,replacement data)
DETAILS OF BUG FIXES:
=====================
MAN PAGE TWEAKS:
----------------
- Made all "it's" in the document to "its" -- oops.
- Documented '.IMPORT : .EVERYTHING' functionality and ensured that global
attributes are not affected by it.
- Documented '.NOINFER:' functionality.
- Documented new features
UNIX RELATED BUG FIXES:
-----------------------
- Changed unix/arlib.c to use binary time headers if M_XENIX. You can fix
this by changing the definition of ASCARCH in unix/sysvr3/config.h when
M_XENIX is defined. I don't know which is the true case so if anyone knows
can you let me know and I'll make sure it gets set right.
- Updated unix/arlib.c to handle RS6000/AIX 3.0 archive headers. This is
a bit of a pain as #ifdef _AIX had to be spattered throughout arlib.c
and in a number of other places. It was the lesser of two evils. Will
IBM ever get stuff like __STDC__ right?
MSDOS RELATED BUG FIXES:
------------------------
- Applied fix supplied by few@gupta.com (Frank Whaley) to msdos/spawn.c for
building and handling path names during the search for an executable.
It could have hung the machine the way it was due to lack of a NULL
pointer.
- Fixed another bug in msdos/spawn.c. If you tried to run a program that had
a full path including extension then the current spawn.c did not find it
in some instances. Whether it did or not depended on what the contents of
the NULL pointer happened to be :-).
- Fixed a HUGE bug in msdos/spawn.c. There was an off by one error in
_get_path that caused serious memory stomps, and eventual hangs of the
machine.
- Fixed bug in msdos/switchar.c, it now correctly selects the code to
get the switchar if it's an MSDOS compile.
OS/2 RELATED FIXES:
-------------------
- Applied patch for OS/2 supplied by "Kai Uwe Rommel". Details (from Kai) of
patch:
o in os2/_chdir.c, there was a transmission error or typo, Ox20 instead of
0x20
o in os2/dmake.cs I corrected the options; my compiler shell maintains a
global ("system-wide") set of default options, so there is no need to
use -G2 etc. there. Also, -WX seems to be unnessecary.
o in os2/dmake.def, I commented out the IMPORT statement (see below).
o in os2/ruletab.c, MAXPROCESS *MUST* me removed, otherwise the argument
of the -Pn option seems to be ignored.
o in os2/runargv.c, I moved the session title code (with a call to an
undocumented system call) into "#ifdef SESSTITTLE" because it also
prevents BIND to make a family mode application that also runs under DOS
or in the DOS box; this may be of interest to people who use both DOS
and OS/2 on their machines, to prevent them from having two binaries of
dmake on their hard disk. This also requires to remove the import
statement for the undoc. system call from the dmake.def file.
o in os2/startup.h I added a / into the MAKESTARTUP definition.
GENERAL FIXES:
--------------
- Fixed the # comment handling inside recipes to mirror what standard makes
do. This turned out to be trivial to do so I stuck it in.
- Fixed bug reported by bill@twwells.com, If dmake was run in a /bin/sh with
makefile text comming via a pipe from stdin then when dmake executed the
makefile it would see an extra child termination comming from the source
of the pipe. dmake now ignores returned pid's from child processes that it
did not spawn. An example, under /bin/sh, do:
cat <<\+ | dmake -vf - verify
verify : make
echo verify
make :
echo make
+
The cat could finish before the first real dmake child finished and would
cause a core dump.
- Inserted definitions of FP_OFF and FP_SEG into spawn.c and find.c under
msdos directory as Turbo C++ was having troubles finding them. As reported
by Nino Margetic (nino@uk.ac.ucl.sm.mph).
- Changed Fatal error message for multiple .SETDIR= attribute specifications
into a Warning.
- Fixed a nasty bug in Parallel Make. It would get the names of .SETDIR'ed
prerequisites wrong. Specifically it lost the .SETDIR value when setting
the $< etc macro values for the final target.
- Fixed bug reported by Len Reed. When removing prerequisites using .REMOVE
I now set their flags as no longer existing. This way if we happen to
walk this part of the graph again from some other place we know enough
to remake them. This is really a simpler case of the general go to the
same spot from a different .SETDIR location problem.
NOTE: The following makefile is an example of what this fixes, but that
it may not work correctly with -Pn where n>1 since .REMOVES are run and
they happen in parallel along with the rest of the processing. There is
a race in getting the .REMOVE done and walking the graph from
the large.target side. Don't build graphs like this. If you want to
do it in parallel then put each of large and small in a different
directory.
all .SEQUENTIAL : small.target large.target
small.target : one.sml two.sml
echo Building $@ from $&
large.target : one.lrg two.lrg; echo Building $@ from $&
%.sml : %.c; echo $(CC) $(CFLAGS) -c -Fo$<; touch $@
%.lrg : %.c; echo $(CC) $(CFLAGS) -AL -c -Fo$<; touch $@
CO = co -u
CC = cc
V = ,v
% : $$(@:d)RCS/$$(@:f)$V;- $(CO) $(COFLAGS) $@
.NOINFER : %$V $$(@:d)RCS/$$(@:f)$V
:REMOVE :; /bin/rm -f $&
- Fixed core dump on circularity test for targets that contain a .LIBRARY
beats me why I put the explicit test in to ignore the libraries if found
to be circular. Someone will complain if this is broken now but I don't
think it is.
- Cleaned up the .h files, they are much cleaner and more
organized now.
o Added define of _POSIX_SOURCE for RS/6000
o Moved the definition of size_t from all over the place to alloc.h
o Cleaned up the definition of POSTAR for XENIX, You shouldn't need it.
- Fixed a bug with setting macro variables from the command line.
It now recognizes a + only if it preceeds an '='.
- WARNING if you use the vfprintf code supplied with dmake then you might get
a warning indicating that an illegal pointer assignment is taking place,
ignore it.
- Fixed handling of attributes for recipes and :: rules. The following is now
true:
.MKSARGS : list_of_targets
Will set .MKSARGS for any target appearing in list_of_targets irrespective
of whether it appears as a target in :: or : recipe lines. Conversely
the construct:
target1 :: ; recipe 1
target1 .MKSARGS :: ; recipe 2
will set .MKSARGS when making target1 using recipe 2 only.
- Fixed a nasty bug in string.c. Forgot to check for NIL(char) in second
argument to _strspn and _strpbrk, sheesh!.
- Propagate parent timestamp for infered prerequisites if it is >= not just >.
This fixes a small bug with directories that were prerequisites of a target.
If the directory was modified when the target was made it is quite possible
they may have the same time-stamp. This in general is not a good thing to
do anyway.
- Modified $(mktmp ...) macro so that you can specify a file name.
$(mktmp[,[FILE][,TEXT]] data);
will put data into a file called Expand(FILE), if FILE contains
$(TMPFILE) then a suitable temporary file name is generated and
substituted. The result value of the macro is the name of the tempfile
or if TEXT is defined, is the result of Expand(TEXT).
Some examples are:
$(mktmp data) ==> normal tmpfile
$(mktmp,$(TMPFILE) data) ==> normal tmpfile
$(mktmp,, data) ==> normal tmpfile
$(mktmp,turboc.cfg $(CFLAGS)) ==> tmpfile named turboc.cfg
$(mktmp,,$(TMPSHELL) data) ==> normal tmpfile, named Expand(...)
$(mktmp,,$(NULL) data) ==> normal tmpfile, null result
- Modified making of .MAKEFILES special targets to make certain that
it does not make a prerequisite of that target if the -n flag is specified.
- Changed statting of targets to match the functionality of .SETDIR a bit
better. When looking into a library and we have used .SETDIR to change
directories, dmake will look into a relative current path, and if it
does not find it, it will search a library found by prepending the value
of the TMD macro to the path of the library file.
- Fixed the handling of :: and %-meta targets by ripping out the HOW internal
data-structure, and by doing some interesting things with the cell dag.
.UPDATEALL is now more comprehensive in its behaviour (might even be
correct). Sets of :: rules for a target return the timestamp for the target
that resulted in it's being made.