How to match double stem in target like %/% or other way?

白昼怎懂夜的黑 提交于 2019-12-31 05:11:14

问题


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 to match the thread% and v%, because for my code, the threadNum=? and the Version=? are the Macros need to define in the compile time. so in the result, I hope to get a layout like, and the foo is the executable name

v1-|thead4/foo
   |thead8/foo
   |thead16/foo
v2-|thead4/foo
   |thead8/foo
   |thead16/foo

I've tried ways like, it doesn't work

%/%/foo: foo.cc $(HEADERS)
    $(CXX) $(CXXFLAGS) -DTHREAD=$* -o $@ $< $(LDLIBS)

回答1:


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]'



回答2:


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)


来源:https://stackoverflow.com/questions/58404646/how-to-match-double-stem-in-target-like-or-other-way

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!