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,
