[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[bug #43363] Variable is broken after $(eval) within recipe
From: |
Konstantin Demin |
Subject: |
[bug #43363] Variable is broken after $(eval) within recipe |
Date: |
Mon, 06 Oct 2014 06:49:40 +0000 |
User-agent: |
Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.101 Safari/537.36 |
URL:
<http://savannah.gnu.org/bugs/?43363>
Summary: Variable is broken after $(eval) within recipe
Project: make
Submitted by: rockdrilla
Submitted on: Пнд 06 Окт 2014 06:49:39
Severity: 3 - Normal
Item Group: Bug
Status: None
Privacy: Public
Assigned to: None
Open/Closed: Open
Discussion Lock: Any
Component Version: 4.0
Operating System: POSIX-Based
Fixed Release: None
Triage Status: None
_______________________________________________________
Details:
I'm trying to implement prerequisite feedback via environment
backpropagation.
Here's "test.1":
( http://pastebin.com/ZiEJpEhr )
--- [ test.1 ] ---
:: T=a b c d e
:: .PHONY: $(T)
:: $(T):
:: $(if $($(@)_BRINGBACK),$(eval $($(@)_BRINGBACK)))
:: $(if $($(@)_BRINGBACK),@echo '>' $@':' $(@)_BRINGBACK =
$($(@)_BRINGBACK))
:: $(if $(LDFLAGS),@echo '>' $@':' LDFLAGS = $(LDFLAGS))
:: @echo '>' $@':'$(if $+, $+)$(if $|, '|' $|)
::
:: .DEFAULT: a
:: a: b | c
:: b: d
:: c: e
:: e_BRINGBACK = LDFLAGS += -lz
--- [ test.1 ] ---
--- [ test.1 output ] ---
:: d:
:: b: d
:: e: e_BRINGBACK = LDFLAGS += -lz
:: e: LDFLAGS = -lz
:: e:
:: c: LDFLAGS = -lz
:: c: e
:: a: LDFLAGS = -lz
:: a: b | c
--- [ test.1 output ] ---
Append global environment variable to "test.1" and name it "test.2":
( http://pastebin.com/JqUN36ZP )
--- [ test.2 ] ---
:: LDFLAGS = -lm
--- [ test.2 ] ---
--- [ test.2 output ] ---
:: d: LDFLAGS = -lm
:: d:
:: b: LDFLAGS = -lm
:: b: d
:: e: e_BRINGBACK = LDFLAGS += -lz
:: e: LDFLAGS = -lm -lz
:: e:
:: c: LDFLAGS = -lm -lz
:: c: e
:: a: LDFLAGS = -lm -lz
:: a: b | c
--- [ test.2 output ] ---
Append target environment variable to "test.1" and name it "test.3":
( http://pastebin.com/z9L17eaJ )
--- [ test.3 ] ---
:: a: LDFLAGS = -lm
--- [ test.3 ] ---
--- [ test.3 output ] ---
:: d: LDFLAGS = -lm
:: d:
:: b: LDFLAGS = -lm
:: b: d
:: e: e_BRINGBACK = LDFLAGS += -lz
:: e: LDFLAGS = -lm
:: e:
:: c: LDFLAGS = -lm
:: c: e
:: a: LDFLAGS = -lm
:: a: b | c
--- [ test.3 output ] ---
Append slightly different target environment variable to "test.1" and name it
"test.4":
( http://pastebin.com/jGaz8H8t )
--- [ test.4 ] ---
:: a: LDFLAGS += -lm
--- [ test.4 ] ---
--- [ test.4 output ] ---
:: d: LDFLAGS = -lm
:: d:
:: b: LDFLAGS = -lm
:: b: d
:: e: e_BRINGBACK = LDFLAGS += -lz
:: e: LDFLAGS = -lm -lz -lm
:: e:
:: c: LDFLAGS = -lm -lz -lm
:: c: e
:: a: LDFLAGS = -lm -lz -lm
:: a: b | c
--- [ test.4 output ] ---
Append target variable and global variable to "test.4" and name it "test.5":
( http://pastebin.com/5hv5jzFq )
--- [ test.5 ] ---
:: LDFLAGS += -lbz2
--- [ test.5 ] ---
--- [ test.5 output ] ---
:: d: LDFLAGS = -lbz2 -lm
:: d:
:: b: LDFLAGS = -lbz2 -lm
:: b: d
:: e: e_BRINGBACK = LDFLAGS += -lz
:: e: LDFLAGS = -lm -lz -lm
:: e:
:: c: LDFLAGS = -lm -lz -lm
:: c: e
:: a: LDFLAGS = -lm -lz -lm
:: a: b | c
--- [ test.5 output ] ---
I've rebuilt make with DEB_BUILD_OPTIONS="nostrip noopt" and debugged with
file "test.5".
I've discovered two moments which determine such behavior:
1) appending to variable in "$(eval ...)" takes only first value in chain.
e.g.:
LDFLAGS defined in global context as "LDFLAGS += 1" and in target "A" as
"LDFLAGS += 2", then actual value for "A" and all it's prerequisites will be
"1 2".
Calling "$(eval LDFLAGS += 3)" in recipe of target "A" or any prerequisite
defines "LDFLAGS" as "2 3".
2) variable assignment during "$(eval ...)" in recipe sets new value in
top-most variable without setting "variable.recursive = 0".
i.e.:
LDFLAGS after "$(eval ...)" equals "2 3" and defined in global context, but
it's still recursive, that's why LDFLAGS is equal "2 3 2".
Imho, there're several points to fix:
1) variable manipulations during "$(eval)" in recipe context may be handled in
same way as variable assignment in recipes (i.e. "A: LDFLAGS += X");
2) variable assignment during "$(eval)" may grab entire value instead of first
non-empty value in chain;
3) variable's flag "recursive" may be set to "0" if value was overwritten.
PS: this bug is reproducible in 3.81 too.
--
SY,
Konstantin Demin
_______________________________________________________
Reply to this item at:
<http://savannah.gnu.org/bugs/?43363>
_______________________________________________
Message sent via/by Savannah
http://savannah.gnu.org/
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [bug #43363] Variable is broken after $(eval) within recipe,
Konstantin Demin <=