Changing the subject a bit, I was unpleasantly surprised to learn while
following this discussion that "Except by explicit request, make exports a
variable only if it is either defined in the environment initially _or set
on the command line_". For years I've noticed a tendency for users to mark
variables for export indiscriminately in order to get them to some child
make. Sort of a "big hammer" approach, which I dislike for the same reason
global variables etc are deprecated: once every child process (not just
every child make) can see a variable, there's no way to know who depends on
it and the result is both harder to debug and harder to clean up. I
generally advise people that rather than:

export CFLAGS
...
$(MAKE) -C subdir ...

They should pass required variables on the command line:

$(MAKE) -C subdir CFLAGS="$(CFLAGS)"

to keep scoping under control. I still think that's a good plan, except
that now I find out it ends up exporting anyway. I'm sure it's too late to
change now but is there a reason for this (unfortunate IMHO) behavior?

The only workaround I can think of would be to rely on non-alphanumeric
names like $(C-FLAGS) but that's a long way from elegant or obvious.

-David



On Tue, Sep 20, 2016 at 11:24 AM, Paul Smith <psm...@gnu.org> wrote:

> On Tue, 2016-09-20 at 15:28 +0000, Pietro wrote:
> > Hi,
> >
> > I have noticed that there is a difference between the two scenarios
> > listed below:
> >
> > i) make  CC=arm-linux-gnueabihf-gcc CPPFLAGS=[..]
> >
> > ii) export CPPFLAGS=[..] [RET]
> >     make CC=arm-linux-gnueabihf-gcc
> >
> > I was told that the difference is that in the second case Make
> > will append stuff to the CPPFLAGS variable exported while in the
> > first case the command line argument will override the settings
> > contained in the makefile itself.
>
> That is definitely not true.  Whether or not the values here replace or
> append to any value of CPPFLAGS in the makefile depends entirely on how
> the variable is set in the makefile.
>
> GNU make has a hierarchy of precedence when it comes to how variables
> are set.  The weakest setting is values that are built-in to make.
>  Next highest is values taken from the environment.  Those are
> overridden by values set in the makefile itself.  And finally values
> set on the command line have the highest precedence.
>
> So if you have a makefile like this:
>
>   CPPFLAGS = -Wall
>
>   all: ; echo 'CPPFLAGS=$(CPPFLAGS)'
>
> Then if you run:
>
>   $ CPPFLAGS=-Werror make
>   CPPFLAGS=-Wall
>
> and the makefile setting overrides the environment setting.  But:
>
>   $ make CPPFLAGS=-Werror
>   CPPFLAGS=-Werror
>
> command line settings take precedence over makefile settings.  In
> neither case will the value in the environment or command line be
> appended to the value in the makefile: it always replaces the value.
>
> There are ways you can manipulate the priority, using the -e command
> line option and the override specifier on variable assignment (see the
> GNU make manual for this).
>
> > The following example, literally pasted from another thread could
> > clarify the matter :
> >
> > var := $(shell echo "echo hi" >say_hi.sh; chmod +x say_hi.sh;
> > say_hi.sh)
> > all: ; @echo $(var)
>
> This actually just adds a lot of confusion and doesn't clarify it at
> all, because (a) you're using PATH environment variable here which is
> "special", at least nominally and (b) you're using $(shell ...) not
> recipes, and the behavior of the shell function with respect to the
> environment is different from that of recipes.  This example seems to
> me to be completely different than what you asked about above, such
> that you can't really compare them.
>
> > I have posted a question at the general make mailing list and I was
> > told that this might be a bug, I would love to have a clarification -
> > is it a bug ?
>
> I think this is more a matter of you wanted to do something and you
> followed a path and got stuck, so you asked about what got you stuck.
>
> I think you should back up and ask about what you are really trying to
> do in the first place, with an example, because likely the path you
> followed is not the one you want so discussing where you're stuck won't
> really help.
>
> _______________________________________________
> Bug-make mailing list
> Bug-make@gnu.org
> https://lists.gnu.org/mailman/listinfo/bug-make
>
_______________________________________________
Bug-make mailing list
Bug-make@gnu.org
https://lists.gnu.org/mailman/listinfo/bug-make

Reply via email to