简体   繁体   中英

Unset an env variable on a makefile

I have a makefile that runs some other make target by first setting some variables:

make -C somedir/ LE_VAR=/some/other/stuff LE_ANOTHER_VAR=/and/so/on

Now I need to unset LE_VAR (really unset, not just override the value with "").

Is there any way to do it so on GNU Make 3.81 ?

Thanks!

Assuming your makefile contains something like this to invoke a sub-make:

submake:
         $(MAKE)

You need to modify the magical variable MAKEOVERRIDES , like this:

MAKEOVERRIDES := $(filter-out LE_VAR=%,$(MAKEOVERRIDES))
unexport LE_VAR

submake:
        $(MAKE)

Check this out unexport variable . From gnu manual

export variable

export variable-assignment

unexport variable

Tell make whether or not to export a particular variable to child processes

Refer https://www.gnu.org/software/make/manual/html_node/Quick-Reference.html

Thank you very much for your replies, this was quite tricky.

When executing make, and setting vars in the parameters, like:

make -C le/path install ONEVAR=one OTHERVAR=two

We have both ONEVAR and OTHERVAR on the env and the subtasks ran by the first command. This kind of puzzled me because I added to the task (at le/path) to execute a simple bash script that only did:

echo $ONEVAR
unset ONEVAR

And by my surprise the var $ONEVAR was actually "one" (so it was on the env) and the unset actually cleared it. But, adding an "echo $(ONEVAR)" on the makefile still outputs "one".. This is due to MAKEOVERRIDES, and in fact, as suggested by Communicating Options to a Sub-make :

The command line variable definitions really appear in the variable MAKEOVERRIDES, and MAKEFLAGS contains a reference to this variable. If you do want to pass flags down normally, but don't want to pass down the command line variable definitions, you can reset MAKEOVERRIDES to empty, like this: MAKEOVERRIDES =

Or as MadScientist suggested above :)

But this was not enough, since this var was still being passed to the other subtasks below (in this situation some nodejs modules that were being compiled on a local folder, and by bad luck, both a js file from phantomjs and some other makefiles where using a var with the same name (eg, $ONEVAR).

unexport variable Tell make whether or not to export a particular variable to child processes. GNU Make Appendix A Quick Reference

What I did was:

DESTDIR_BUFFER=$(DESTDIR)
MAKEOVERRIDES := $(filter-out DESTDIR=%,$(MAKEOVERRIDES))
unexport DESTDIR

And only then make npm install.

At the end of this task I export DESTDIR with the value at DESTDIR_BUFFER and all the other consequent tasks still work.

Thanks a lot for your help!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM