[bug #58420] PATH changes are not applied in $(shell) function

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

[bug #58420] PATH changes are not applied in $(shell) function

anonymous
URL:
  <https://savannah.gnu.org/bugs/?58420>

                 Summary: PATH changes are not applied in $(shell) function
                 Project: make
            Submitted by: srivasta
            Submitted on: Wed 20 May 2020 06:21:52 PM CDT
                Severity: 3 - Normal
              Item Group: Bug
                  Status: None
                 Privacy: Public
             Assigned to: None
             Open/Closed: Open
         Discussion Lock: Any
       Component Version: 4.3
        Operating System: None
           Fixed Release: None
           Triage Status: None

    _______________________________________________________

Details:

This was reported by a debian user. Please retain the CC to
[hidden email] to ensure your responses reach the reporter.



Given the following Makefile:

--- BEGIN ---
PATH := /nonexistent:$(PATH)

default:
        @echo "make variable PATH=$(PATH)"
        @echo "in target commands, PATH=$$PATH"
        @echo "in \$$(shell commands), PATH=$(shell echo "$$PATH")"
--- END ---

'make' generates the output for me:

make variable
PATH=/nonexistent:/home/ben/bin:/usr/lib/ccache:/usr/local/sbin:/usr/sbin:/sbin:/home/ben/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
in target commands,
PATH=/nonexistent:/home/ben/bin:/usr/lib/ccache:/usr/local/sbin:/usr/sbin:/sbin:/home/ben/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
in $(shell commands),
PATH=/home/ben/bin:/usr/lib/ccache:/usr/local/sbin:/usr/sbin:/sbin:/home/ben/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

I can't see any documentation that says the PATH variable is special, so I
think this is a bug.  I would guess that make defers evaluating the PATH
variable into the environment, in case it's recursively expanded, but only
re-evaulates it before running target commands.

Ben.





    _______________________________________________________

Reply to this item at:

  <https://savannah.gnu.org/bugs/?58420>

_______________________________________________
  Message sent via Savannah
  https://savannah.gnu.org/


Reply | Threaded
Open this post in threaded view
|

[bug #58420] PATH changes are not applied in $(shell) function

anonymous
Follow-up Comment #1, bug #58420 (project make):

I stand corrected. The actual CC should be [hidden email]

    _______________________________________________________

Reply to this item at:

  <https://savannah.gnu.org/bugs/?58420>

_______________________________________________
  Message sent via Savannah
  https://savannah.gnu.org/


Reply | Threaded
Open this post in threaded view
|

[bug #58420] PATH changes are not applied in $(shell) function

anonymous
Follow-up Comment #2, bug #58420 (project make):

$(shell) commands in a recipe... well, we've all seen it done.
 But, hang on, PATH doesn't behave specially for me:


martind@sirius:~/tmp/make-58420$ cat Makefile
NOT_PATH := /nonexistent:$(NOT_PATH)
$(shell echo during parsing NOT_PATH=$(NOT_PATH) 1>&2)

default:; @echo "make variable NOT_PATH=$(NOT_PATH)"; echo "in target
commands, NOT_PATH=$$NOT_PATH"; echo "in \$$(shell commands), NOT_PATH=$(shell
echo "$$NOT_PATH")"
martind@sirius:~/tmp/make-58420$ NOT_PATH=export-me make
during parsing NOT_PATH=/nonexistent:export-me
make variable NOT_PATH=/nonexistent:export-me
in target commands, NOT_PATH=/nonexistent:export-me
in $(shell commands), NOT_PATH=export-me
martind@sirius:~/tmp/make-58420$


(I put the recipe on one line because tabs often don't come out in the mail.)

Seeing:

Component Version: 4.3

I worried that it might be due to the new spawning code, but the results
above, which I think are consistent with the reporter's, were from make-4.1.
I get the same from 4.0 and even 3.81.

After puzzling over the code, I belatedly realized that my "during parsing"
line above isn't doing the same as the $(shell) in the recipe.  The former is
passing the Make variable's value to $(shell), where the latter is getting it
out of the environment given to $(shell).  The code-comment here appears
likely to pertain:

http://git.savannah.gnu.org/cgit/make.git/tree/src/function.c#n1727

... which points us at:

https://savannah.gnu.org/bugs/?func=detailitem&item_id=10593

I think this is a duplicate.

    _______________________________________________________

Reply to this item at:

  <https://savannah.gnu.org/bugs/?58420>

_______________________________________________
  Message sent via Savannah
  https://savannah.gnu.org/