I need to build targets with names like,
v1/thread4/foo v1/thread8/foo v1/thread16/foo
v2/thread4/foo v2/thread8/foo v2/thread16/foo
I want
It's pretty easy when you realise that $@
is v1/thread4/foo
(say),
to then pull out the bits you need.
In this case, something like:
v = $(firstword $(subst /, ,$@))
thread = $(notdir ${@D})
YMMV of course. leading to
targets := \
v1/thread4/foo v1/thread8/foo v1/thread16/foo \
v2/thread4/foo v2/thread8/foo v2/thread16/foo
all: ${targets}
v = $(firstword $(subst /, ,$@))
thread = $(notdir ${@D})
${targets}:
: '$@: v [$v] thread [${thread}]'
giving
$ make
: 'v1/thread4/foo: v [v1] thread [thread4]'
: 'v1/thread8/foo: v [v1] thread [thread8]'
: 'v1/thread16/foo: v [v1] thread [thread16]'
: 'v2/thread4/foo: v [v2] thread [thread4]'
: 'v2/thread8/foo: v [v2] thread [thread8]'
: 'v2/thread16/foo: v [v2] thread [thread16]'
There is no way to have multiple patterns in GNU make.
If your example above is actually reflective of what you want to do, it's simple enough, though:
VLIST := 1 2
TLIST := 4 8 16
TARGETS := $(foreach V,$(VLIST),$(foreach T,$(TLIST),v$V/thread$T/foo))
$(TARGETS): foo.cc $(HEADERS)
$(CXX) $(CXXFLAGS) -DTHREAD=$* -o $@ $< $(LDLIBS)