bug-make
[Top][All Lists]
Advanced

[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/




reply via email to

[Prev in Thread] Current Thread [Next in Thread]