(Updated 2013-07-20: Correctly describe the issue and provide examples)
Make has several useful built-in functions, among which $(patsubst pattern,replacer,string). The pattern can contain the character % which is a wildcard meaning any string and that can be referred in the replacer parameter. Only the first occurrence of % is treated with this special meaning, just as the manual says.
What the manual doesn't say is thatonly the form %bla works, while the form bla% does NOT work GNU Make's '%' is not analogous to shell's '*', so you can't expect to remove substrings in the middle of a string without knowing the exact string until the part you want to remove.
This does not work if you want to obtain '../some/CPU12/include' in OTHERPATH:
Make has several useful built-in functions, among which $(patsubst pattern,replacer,string). The pattern can contain the character % which is a wildcard meaning any string and that can be referred in the replacer parameter. Only the first occurrence of % is treated with this special meaning, just as the manual says.
What the manual doesn't say is that
This does not work if you want to obtain '../some/CPU12/include' in OTHERPATH:
PATH := ../some/prefCPU12/includeThe result will be:
OTHERPATH := $(patsubst pref%,%,$(PATH))
default:
@echo "OTHERPATH = $(OTHERPATH)
OTHERPATH = ../some/prefCPU12/includeThis bahaviour is somewhat asymetric to how subst behaves and how one would expect it to, considering '%' is explained as a glob pattern:
0 eddy@heidi /tmp $ cat makefileNot sure what make developers would say about this, and I am not sure if having % work as a glob pattern and using it, instead of invoking sed would be better for performance, but sure I would like to have the option :-) .
PATH := ../some/prefCPU12/include
OTHERPATH := $(patsubst pref%,%,$(PATH))
SPATH := $(subst pref,,$(PATH))
default:
@echo "PATH = $(PATH)"
@echo "OTHERPATH = $(OTHERPATH)"
@echo "SPATH = $(SPATH)"
0 eddy@heidi /tmp $ make
PATH = ../some/prefCPU12/include
OTHERPATH = ../some/prefCPU12/include
SPATH = ../some/CPU12/include