[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: [bug #18641] GNUmake 3.81, $(error ) sometimes unable to stop make p
From: |
Martin Dorey |
Subject: |
RE: [bug #18641] GNUmake 3.81, $(error ) sometimes unable to stop make process |
Date: |
Sat, 30 Dec 2006 22:44:25 -0800 |
> Suggest rewriting the last two lines as:
Sorry for that unnecessary nonsense. I'm not sure why I invented that
superstition.
Now I'm at a proper computer (and can read the documentation and try
things out), I can reproduce the behavior observed by the OP. A
potentially relevant difference in behavior between 3.80 and 3.81 can be
observed with a simpler makefile:
-include Makefile1
Makefile1:
false
-include Makefile2
Makefile2:
false
$ make #3.81
false
false
make: *** No rule to make target `Makefile1'. Stop.
$ make-3.80
false
make-3.80: *** [Makefile2] Error 1
$
If I remove the "-" from "-include", then make-3.81 stops after the
first failure to update a makefile. The 3.81 behavior of -include seems
consistent with the documentation - that make shouldn't stop if the
makefile can't be remade. So I think I'd say that the difference in
behavior is due to a bug with 3.80's -include which is fixed in 3.81.
The OP said:
>> $(error ) function unable to stop the whole make process
But there are two make processes. One was stopped and the other carried
on, as it was (arguably) instructed to do by the "-" on the "-include"
directive.
Double apologies if I've got the wrong end of the stick again but I felt
duty bound to correct my earlier mistake... and then duty bound to try
to make some more useful contribution. I have to admit that I haven't
fully understood the attached makefiles. Hopefully --debug=all gave me
enough insight.
-------------------------------------
Martin's Outlook, BlueArc Engineering
-----Original Message-----
From: address@hidden
[mailto:address@hidden On Behalf Of Martin
Dorey
Sent: Saturday, December 30, 2006 7:05
To: address@hidden; address@hidden;
address@hidden; address@hidden; address@hidden;
address@hidden
Subject: Re: [bug #18641] GNUmake 3.81,$(error ) sometimes unable to
stop make process
To get the behavior you want, you need the rule for $(_p_SubprjsMade) to
fail when its invocation of ${MAKE} -f $(_p_mk_MakeSubPrjs) fails.
Suggest rewriting the last two lines as:
@${MAKE} -f $(_p_mk_MakeSubPrjs) && \
touch $@
(echo -n "" > $@ is fine - touch $@ is just more usual and shorter.)
This way, the parent make will stop when the sub-make fails.
As to why make-3.81 behaves differently to make-3.80, that requires a
deeper knowledge of make's internals than I have. All I can say is that
I have noticed make-3.81 seeming to reassess the list of targets which
need building "more often" than 3.80 but someone else might chime in
with a fuller explanation.
----- Original Message -----
From: address@hidden
<address@hidden>
To: Jun Chen <address@hidden>; address@hidden
<address@hidden>; address@hidden <address@hidden>;
address@hidden <address@hidden>; address@hidden
<address@hidden>
Sent: Sat Dec 30 06:03:44 2006
Subject: [bug #18641] GNUmake 3.81, $(error ) sometimes unable to stop
make process
URL:
<http://savannah.gnu.org/bugs/?18641>
Summary: GNUmake 3.81, $(error ) sometimes unable to
stop
make process
Project: make
Submitted by: chjfth
Submitted on: Saturday 12/30/2006 at 22:03
Severity: 3 - Normal
Item Group: Bug
Status: None
Privacy: Public
Assigned to: None
Open/Closed: Open
Discussion Lock: Any
Component Version: 3.81
Operating System: Any
Fixed Release: None
_______________________________________________________
Details:
I think I've found in GNUmake 3.81 a hard-to-realize bug. This bug
causes
$(error ) function unable to stop the whole make process. I encountered
this
bug recently when I'm developing an auto-building system based on
GNUmake(called GnumakeUniproc), and I have isolate the smallest
makefile(filename: eGmu.makefile, 30 effective lines, see the attached
file)
that can reproduce this problem.
Be aware, in order to see this bug, you have to `rm
_MainPrjBuildStart.gmu.ckt' before invoking my makefile, -- honestly,
you
just have to do it.
Output from make 3.81:
===============
[chj @vchjsuse101 ~/test/clear381]
$ make381 -f eGmu.makefile
make381[1]: Entering directory `/home/chj/test/clear381'
_SubprjsAttr.gmu.mki:1: *** ====== Hey! you should stop here!
[./_MakeSubPrjs.gmu.mk] ======. Stop.
make381[1]: Leaving directory `/home/chj/test/clear381'
_SubprjsAttr.gmu.mki:1: *** ====== Hey! you should stop here!
[eGmu.makefile]
======. Stop.
===============
You can see that `` <some-makefile>:<line-number>: *** <error message>.
Stop.'' appears more than once, which is not the correct behavior.
GNUmake 3.80 does not have this bug however. Output from make 3.80:
===================
[chj @vchjsuse101 ~/test/clear381]
$ make380 -f eGmu.makefile
make[1]: Entering directory `/home/chj/test/clear381'
_SubprjsAttr.gmu.mki:1: *** ====== Hey! you should stop here!
[./_MakeSubPrjs.gmu.mk] ======. Stop.
make[1]: Leaving directory `/home/chj/test/clear381'
make: *** [_SubprjsMade.gmu.ckt] Error 2
===================
My testing environment:
* SuSE Linux 10.1 with stock make 3.80.
* And I build make 3.81 from official source on SuSE Linux 10.1 with
command
./configure && make .
###############################################################
Finally, I also post my eGmu.makefile here:
================================================
_IsP1OlderThanP2 = $(if $(wildcard $1),$(shell (if [ $1 -ot $2 ];then
echo -n
'1';fi)),1)
# If file $1 not exist or older than $2, 1 is returned, else
null is
returned.
# If $2 does not exist, result is undetermined.
_IsOlderThanPrjStart = $(call _IsP1OlderThanP2,$1,$(_p_MainPrjStart))
_ClearFile = echo -n "" > $(1)
gmu_Gd_PRJ_GMUTMP = .
_StartupSignatureFile = _MainPrjBuildStart.gmu.ckt
ifeq ($(MAKELEVEL),0)
export _p_MainPrjStart = $(CURDIR)/$(_StartupSignatureFile)
# Important! User should first delete it before invoking the
makefile of
the main-project!
#Otherwise, the build can be incomplete.
ifeq (,$(wildcard $(_p_MainPrjStart))) # Do these only if the
main-prj-start signature does not exist.
# The first thing here is to create the main-prj-start
signature, so that
the code
# in this if/endif will only execute once during one whole
build process.
_temp := $(shell if (echo -n "" > $(_p_MainPrjStart)) ; then echo -n
'';
\
else echo __GMU_ex_ERROR; fi; )
ifneq (,$(_temp))
$(error !GMU!Error: Cannot create start-up signature
file($(_StartupSignatureFile)) in current dir)
endif
endif # ifeq (,$(wildcard $(_p_MainPrjStart)))
endif # ifeq ($(MAKELEVEL),0)
_p_mki_SubprjAttr = $(gmu_Gd_PRJ_GMUTMP)/_SubprjsAttr.gmu.mki
_p_SubprjsAttrMade = $(gmu_Gd_PRJ_GMUTMP)/_SubprjsAttrMade.gmu.ckt
_p_mk_MakeSubPrjs = $(gmu_Gd_PRJ_GMUTMP)/_MakeSubPrjs.gmu.mk
_p_SubprjsMade = $(gmu_Gd_PRJ_GMUTMP)/_SubprjsMade.gmu.ckt
-include $(_p_SubprjsMade)
$(_p_SubprjsMade): $(_p_MainPrjStart)
@$(call _ClearFile,$(_p_mk_MakeSubPrjs))
@echo -e "include $(_p_mki_SubprjAttr)\n" >>
$(_p_mk_MakeSubPrjs)
@${MAKE} -f $(_p_mk_MakeSubPrjs)
@echo -n "" > $@
ifeq ($(call _IsOlderThanPrjStart,$(_p_SubprjsAttrMade)),1)
# $(warning %%%%%%%%%%%%%%%%% [$(MAKELEVEL)] [$(MAKE_RESTARTS)]
%%%%%%%%%%%%%%%)
-include $(_p_SubprjsAttrMade)
else
# $(warning +++++++++++++++++ [$(MAKELEVEL)] [$(MAKE_RESTARTS)]
+++++++++++++++)
include $(_p_mki_SubprjAttr)
endif
$(_p_SubprjsAttrMade): $(_p_MainPrjStart)
@$(call _ClearFile,$(_p_mki_SubprjAttr))
@echo "\$$(error ====== Hey! you should stop here!
[\$$(firstword
\$$(MAKEFILE_LIST))] ======)" >> $(_p_mki_SubprjAttr)
@echo -n "" > $@ # touch it
================================================
_______________________________________________________
File Attachments:
-------------------------------------------------------
Date: Saturday 12/30/2006 at 22:03 Name: make381-error-not-stop.tar.gz
Size: 1kB By: chjfth
<http://savannah.gnu.org/bugs/download.php?file_id=11631>
_______________________________________________________
Reply to this item at:
<http://savannah.gnu.org/bugs/?18641>
_______________________________________________
Message sent via/by Savannah
http://savannah.gnu.org/
_______________________________________________
Bug-make mailing list
address@hidden
http://lists.gnu.org/mailman/listinfo/bug-make