Makefile:修改模式规则中的stem

Makefile:修改模式规则中的stem,makefile,Makefile,我在名为data和helpers的目录中有文件,我想使用这两个目录在result中创建目标文件 目录结构如下所示: data + A | + file1 | + file2 | + ... + B | + file1 ... helpers + file1 + file2 ... result/%: data/% helpers/$(basename %) # this doesn't work result/%: data/% helpers/$(basename $*)

我在名为
data
helpers
的目录中有文件,我想使用这两个目录在
result
中创建目标文件

目录结构如下所示:

data
 + A
 | + file1
 | + file2
 | + ...
 + B
 | + file1
 ...
helpers
 + file1
 + file2
 ...
result/%: data/% helpers/$(basename %) # this doesn't work
result/%: data/% helpers/$(basename $*) # this doesn't work either
结果
中的目录结构与
数据
中的目录结构相同。因此,我想写下以下规则:

result/%: data/% helpers/% script
    script $@ $(word 1,$^) $(word 2,$^)
问题是
助手
目录中的
文件1
文件2
等不在子目录中

我现在有以下选择:

  • 为每个子目录编写单独的规则(不切实际,共有20个)
  • 对每个子目录执行
    foreach
    以创建规则(那么我如何访问先决条件列表?)
但是,我更愿意写以下内容之一:

data
 + A
 | + file1
 | + file2
 | + ...
 + B
 | + file1
 ...
helpers
 + file1
 + file2
 ...
result/%: data/% helpers/$(basename %) # this doesn't work
result/%: data/% helpers/$(basename $*) # this doesn't work either

有没有办法通过修改与规则声明匹配的词干来修改规则声明中的模式?

唯一的方法是在makefile中启用

例如:

请注意,如隐式规则搜索算法中所述,目录前缀(D)将(在展开后)附加到先决条件列表中的所有模式。例如:

.第二次扩展:

/tmp/foo.o:

%.o: $$(addsuffix /%.c,foo bar) foo.h
        @echo $^
在二次扩展和目录前缀重建之后,打印的先决条件列表将是/tmp/foo/foo.c/tmp/bar/foo.c foo.h。如果您对此重建不感兴趣,可以使用$$*而不是先决条件列表中的%

因此,类似的方法应该有效(未经测试):

make的
basename
与shell的
basename
不一样(这经常让我绊倒)

如果您想要使用
$(foreach)
,尽管您想要类似(未测试)的东西:


我不确定我是否完全理解二次扩展。在上面的例子中,他们是如何实现我想要做的事情的?对于
$(foreach…
,如何添加实际的规则(语法似乎不支持换行)?使用两种用途的示例进行编辑。是的,这很有效。不知道我以前做错了什么。非常感谢。