help-make
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

BUG?: BASH_ENV as a target-specific variable is inherited by the target'


From: Cook, Malcolm
Subject: BUG?: BASH_ENV as a target-specific variable is inherited by the target's prerequisites even if marked "private"
Date: Mon, 4 Dec 2023 16:50:57 +0000

By my reading of the documentation, when SHELL is /bin/bash, defining a make 
target having BASH_ENV exported as a target-specific variable should cause that 
target's recipe to be executed in an shell where the file BASH_ENV points has 
been sourced.

And indeed this works in my hands.

However, by my sights, marking the target-specific exported BASH_ENV to be 
private  should cause it to not be inherited by any prerequisites, and thus 
recipes of any prerequisites should NOT source this file.

Running the following t.mk demonstrates that this is not the case.  

File: t.mk
--------------------
.SILENT:
.DEFAULT_GOAL:=test
.ONESHELL:
SHELL := /bin/bash

.PHONY test:
test:
        @echo Running $@ of $(MAKEFILE_LIST) in a clean environment with 
$$($(MAKE) --version | head -n 1)
        env -i $(MAKE) -f $(MAKEFILE_LIST) -B myTarget

.PHONY: myTarget
myTarget: private export BASH_ENV:=desiredEnvironment.sh
# I would expect that using the "private modifier" here would causes
# BASH_ENV to "not be inherited by prerequisites".
myTarget: itsPrerequisite desiredEnvironment.sh
        echo Running recipe for: $@
        echo BASH_ENV=$${BASH_ENV}
        echo myVariable=$${myVariable}

.PHONY: itsPrerequisite
itsPrerequisite: 
        echo Running recipe for: $@
        echo BASH_ENV=$${BASH_ENV}
        echo myVariable=$${myVariable}

desiredEnvironment.sh:
        echo Running recipe for: $@
        printf 'echo sourcing $@\n' > $@
--------------------

My expectation is that running it should have myTarget run in a shell with the 
desiredEnvironment.sh having been sourced, but itsPrerequiste would run in a 
shell without such. 

However, the following transcript demonstrates the surprising (to me) fact that 
the shell in which itsPrerequisite is running does in fact see, and source, 
BASH_ENV.

make -f t.mk
Running test of t.mk in a clean environment with GNU Make 4.4
sourcing desiredEnvironment.sh
Running recipe for: itsPrerequisite
BASH_ENV=desiredEnvironment.sh
myVariable=myValue
sourcing desiredEnvironment.sh
Running recipe for: desiredEnvironment.sh
sourcing desiredEnvironment.sh
Running recipe for: myTarget
BASH_ENV=desiredEnvironment.sh
myVariable=myValue

Thanks for any insight as to whether this is a bug in the Make, its 
documentation, or my understanding of the same.

~ Malcolm Cook

PS: discussion on this issue began here: 
https://stackoverflow.com/a/64991443/415228




reply via email to

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