🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

4 total messages Started by Steven Grady Thu, 31 Aug 1989 01:43
make 3.55 infinite loop
#387
Author: Steven Grady
Date: Thu, 31 Aug 1989 01:43
59 lines
2956 bytes
It seems like the new feature that a production that has commands
but no dependencies should always be executed is a mistake.  I believe
this should only be the case if it is a phony target.  If it's a real
file, then a valid interpretation of having no dependencies is that
this is the set of commands to do to _create_ the file.  If the file
exists, no commands need to run.

I'm not sure I am right about this, however.  If you are still interested,
keep reading -- I'll describe the problem I'm having in detail.

I have a makefile system that is kind of complicated.  I include
a file called $(DEPENDENCIES), which is in an architecture-dependent
subdirectory.  In this case, I'm running the program on a sun3.
$(DEPENDENCIES) (in this case, "sun3/Dependencies") has a production
to create it from the "Dependencies" file in the current directory.
This "Dependencies" file is modified by mkmf.  Furthermore, if
the "Dependencies" file doesn't exist (ie the first time you run
the make), it will be copied from a template file (in my case,
a file called "/usr/aws/etc/GnuMake/DependTmpl").

The idea is that if you do a "gnumake depend", the "Dependencies" file 
gets created, then updated.  If you then do a "gnumake" (on a sun3),
the "sun3/Dependencies" file depends on "Dependencies", so it gets
updated.  This new "sun3/Dependencies" file is then included.

This all worked fine until 3.55.  Under 3.55, if I say "gnumake",
it starts going into an infinite loop, saying the following:
  cp /usr/aws/etc/GnuMake/DependTmpl Dependencies
  chmod ug+w Dependencies
  gnumake depend
  cp /usr/aws/etc/GnuMake/DependTmpl Dependencies
  chmod ug+w Dependencies
  gnumake depend
  ...

When I run it with "-d", here is the beginning of the output:
  Reading makefiles...
  Updating makefiles....
    Considering target file `sun3/Dependencies'.
     Considering target file `Dependencies'.
      Finished dependencies of target file `Dependencies'.
     Target `Dependencies' has commands but no dependencies.
     Must remake target `Dependencies'.

Here is the relevant rule:
$(DEPENDFILE):
        cp $(MAKEDIR)/DependTmpl $(DEPENDFILE)
        chmod ug+w $(DEPENDFILE)
        $(MAKE) depend

What's happening is that the file gets copied (since it has commands
but no dependencies), then gnumake gets re-invoked.  It then runs the
same rules, causing gnumake to be re-invoked, etc.

	Steven
	...!ucbvax!grady
	grady@postgres.berkeley.edu

"Guards, beat this man brutally for daring to try to confuse me!"
Re: make 3.55 infinite loop
#389
Author: Steven Grady
Date: Thu, 31 Aug 1989 08:06
44 lines
2442 bytes
[Sorry these are so long.]
Hmm.  On looking at this further, I see a more insidious problem.
Consider the siuation where you want to include one makefile
in another, but you want to provide the opportunity for
overriding productions (which is what I want to do).  This
requires using a ".DEFAULT" rule (as recommended in the "Overriding
Makefiles" section of the texinfo document).  But consider the
following makefile:
	a: b
		@echo making a
	
	.DEFAULT:
		$(MAKE) -f OtherMakefile $@

The default production, a, depends on b.  Assume b exists.  Well,
since there is a default production, b has commands associated with it 
(namely, the commands in the default production which are used whenever
no other productions can be found).  Since b has commands but no dependencies,
the default rule will be executed.  So it's going to invoke another
make just because it can't find any production on what to do for a file
that already exists.

If there were an additional line up there: "include a", then even if
some other production were invoked, it would still check if "a" was
up-to-date (since all include files are checked), and therefore the
default rule would fire to try to update "b".

It also seems to be the case that gnumake always checks to see if
the makefile being used is up-to-date.  Again, if there's a default 
production, gnumake will try to use it to update the makefile itself,
meaning that gnumake will _always_ be invoked at least twice if there's
a DEFAULT production.

I think I've made my point that firing off commands if there are no 
dependencies, combined with DEFAULT productions, is a bad thing.  I'm 
not sure what the right fix would be, but it seems that if there are 
no dependencies, commands should only be executed if the target is PHONY.

	Steven
	...!ucbvax!grady
	grady@postgres.berkeley.edu

"But Calvin is no kind and loving god!  He's one of
the _old_ gods!  He demands sacrifice!"
Re: make 3.55 infinite loop
#390
Author: Fletcher Kittredge
Date: Thu, 31 Aug 1989 13:00
18 lines
1216 bytes
In article <1989Aug31.014333.18904@fxgrp.fx.com> grady@fxgrp.fx.com (Steven Grady) writes:
>It seems like the new feature that a production that has commands
>but no dependencies should always be executed is a mistake.

If you are talking about the feature that if I have the two line makefile

foo:
	@echo hello

that hello is echoed, then you are wrong that this is a new feature.  This
has been in every version of make I run across (many versions!). In addition,
it is documented in Feldman's orignal 1978 article describing make, "Make -
A Program for Maintaining Computer Programs".  For gmake not to include
this feature would break many makefiles and backwards compatability.

regards,
fletcher
Fletcher E. Kittredge  fkittred@bbn.com
Re: make 3.55 infinite loop
#396
Author: Steven Grady
Date: Fri, 01 Sep 1989 02:28
41 lines
1668 bytes
In article <45050@bbn.COM> fkittred@BBN.COM (Fletcher Kittredge) writes:
>In article <1989Aug31.014333.18904@fxgrp.fx.com> grady@fxgrp.fx.com (Steven Grady) writes:
>>It seems like the new feature that a production that has commands
>>but no dependencies should always be executed is a mistake.
>
>If you are talking about the feature that if I have the two line makefile
>
>foo:
>	@echo hello
>
>that hello is echoed, then you are wrong that this is a new feature.

No, I'm describing something else.  If I have the following makefile:

    bar: foo
	    @echo bar
    foo:
	    @echo foo

Also, assume "foo" already exists.

Sun's make and gnumake 3.54 do the same thing:
	% make
	bar

Gnumake 3.55 does this:
	% make
	foo
	bar

The important point is that before, a file without dependencies was 
considered up-to-date if it existed.  Now, it's never considered up-to-date
if there are any commands associated with the production.  The current
form is inconsistent with other versions of make.

	Steven
	...!ucbvax!grady
	grady@postgres.berkeley.edu

If God had wanted us to be concerned for the plight of the toads, he would
have made them cute and furry. 
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads