*
Am I missing anything?

Yes.  The recipe's text, which you can see with eg:

mad@shuttle:~/tmp/colomar-2025-09-10$ make -n -p 2>&1 | grep -A26 ^all:
all:
#  Implicit rule search has not been done.
...
# Load=8/32=25%, Rehash=0, Collisions=1/12=8%
#  recipe to execute (from 'Makefile', line 5):
       echo $(foo)

Mad@shuttle:~/tmp/colomar-2025-09-10$

... doesn't contain the value of foo but a reference to it.  Recipe definition 
is evaluated like recursively-expanded assignment (=), rather than 
simply-expanded assignment (:=).  Perhaps this is best documented by 
https://www.gnu.org/software/make/manual/html_node/Variables-in-Recipes.html, 
although perhaps 
https://www.gnu.org/software/make/manual/html_node/Recursive-Assignment.html 
gets more to the heart of the matter, with "This flavor of variable is the only 
sort supported by most other versions of make", which I might take to mean that 
anything that doesn't explicitly talk about this newfangled := assignment isn't 
using it.  You can see the... legacy of history in the way "The Two Flavors of 
Variables" at https://www.gnu.org/software/make/manual/html_node/Flavors.html 
has four subsections rather than the titular two, one of which talks about the 
really newfangled (POSIX Issue 8 only being standardized in 2024) :::= 
assignment.

________________________________
From: bug-make-bounces+martin.dorey=hds....@gnu.org on behalf of Alejandro 
Colomar
Sent: Wednesday, September 10, 2025 13:33
To: bug-make@gnu.org
Subject: [BUG] undefined variable used in recipe before undefine directive

Hi,

I think this looks like a bug, unless I'm forgetting some details about
how variables are expanded within recipes.

        alx@debian:~/tmp/bug$ ls
        Makefile
        alx@debian:~/tmp/bug$ cat Makefile | nl -ba
             1   MAKEFLAGS += --warn-undefined-variables
             2
             3   foo := foo
             4
             5   all:; echo $(foo)
             6
             7   undefine foo
        alx@debian:~/tmp/bug$ make
        Makefile:5: warning: undefined variable 'foo'
        echo

As I understand it, the variable foo is expanded immediately in the
definition of the recipe, and make(1) shouldn't care if I undefine it
after the definition of the recipe, right?  make(1) should create the
recipe with the contents of the variable, and not with the variable
itself.

Am I missing anything?

I'm using Debian Sid:

        $ make --version | head -n1
        GNU Make 4.4.1



Have a lovely night!
Alex


--
<https://www.alejandro-colomar.es>
Use port 80 (that is, <...:80/>).

Reply via email to