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…
,如何添加实际的规则(语法似乎不支持换行)?使用两种用途的示例进行编辑。是的,这很有效。不知道我以前做错了什么。非常感谢。