While exploring pattern rules I believe I have found some issues with
automatic variable expansion. I've documented them inline, in the comments.
I've compared the behavior between 3.8.2 and 4.4.

```
.SECONDEXPANSION:
.SUFFIXES:

.PHONY: all

.DEFAULT_GOAL := all

all: test01.cpp src/test01.o src/test02.o

%.o : %.cpp

# given src/test.o
# $* => src/test
# expr => test.d
# fixed in make 4.4: yes
#%.o : %.cpp $$*.d

# given src/test.o
# $* => src/test
# expr => foo/test.d
# fixed in make 4.4: yes
#%.o : %.cpp foo/$$*.d

# given src/test.o
# $@ => src/test.o
# expr => src/test.o.d
# fixed in make 4.4: n/a (not broken)
#%.o : %.cpp [email protected]

# given src/test.o
# $@ => src/test.o
# expr => foo/src/test.o.d
# fixed in make 4.4: n/a (not broken)
#%.o : %.cpp foo/[email protected]

# given src/test.o
# $@ => src/test.o
# patsubst => src/src/test.o
# fixed in make 4.4: no
#%.o : %.cpp $$(patsubst %.o,%.d,$$@)

# given src/test.o
# $@ => src/test.o
# patsubst => src/foo/src/test.o
# fixed in make 4.4: no
#%.o : %.cpp foo/$$(patsubst %.o,%.d,$$@)

# given src/test.o
# $< => src/test.cpp
# expr => src/test.o.d
# fixed in make 4.4: maybe? $< is now empty
#%.o : %.cpp $$<.d

# given src/test.o
# $< => src/test.cpp
# expr => foo/src/test.o.d
# fixed in make 4.4: maybe? $< is now empty
#%.o : %.cpp foo/$$<.d

# given src/test.o
# $@ => src/test.o
# expr => hangs
# fixed in make 4.4: maybe? triggers an unrelated error
#%.o : %.cpp $$(@:.o=.d)

# given src/test.o
# $@ => src/test.o
# expr => hangs
# fixed in make 4.4: maybe? triggers an unrelated error
#%.o : %.cpp foo/$$(@:.o=.d)

%.o : %.cpp foo/$$(@).d
@echo "@:       $@"
@echo "(@D):    $(@D)"
@echo "(@F):    $(@F)"
@echo "(*D):    $(*D)"
@echo "(*F):    $(*F)"
@echo "^:       $^"
@echo "<:       $<"
@echo "*:       $*"
@echo

foo/%.d:
@echo "touch/slash $@"

foo-%.d:
@echo "touch-dash $@"

%.d:
@echo "catch-all $@"
```

Thanks,

Reply via email to