我的目录中有文件名为data
and helpers
,我想用它们来创建目标文件result
.
目录结构如下:
data
+ A
| + file1
| + file2
| + ...
+ B
| + file1
...
helpers
+ file1
+ file2
...
目录结构在result
与中相同data
。因此,我想写下以下规则:
result/%: data/% helpers/% script
script $@ $(word 1,$^) $(word 2,$^)
这样做的问题是file1
, file2
等在helpers
目录不在子目录中。
我现在有以下选择:
- 为每个子目录编写一个单独的规则(不切实际,有 20 个)
- do a
foreach
包括创建规则的每个子目录(那么我如何访问先决条件列表?)
但是,我更愿意写以下内容之一:
result/%: data/% helpers/$(basename %) # this doesn't work
result/%: data/% helpers/$(basename $*) # this doesn't work either
有没有办法通过修改它匹配的词干来修改规则声明中的模式?
做你想做的事情的唯一方法是启用二次扩张 http://www.gnu.org/software/make/manual/html_node/Secondary-Expansion.html#Secondary-Expansion在你的 makefile 中。
Example:
请注意,目录前缀 (D),如隐式规则搜索算法中所述,被附加(扩展后)到先决条件列表中的所有模式。举个例子:
.第二扩展:
/tmp/foo.o:
%.o: $$(addsuffix /%.c,foo bar) foo.h
@echo $^
经过二次扩展和目录前缀重构后,打印的先决条件列表将为 /tmp/foo/foo.c /tmp/bar/foo.c foo.h。如果您对这种重建不感兴趣,可以在先决条件列表中使用 $$* 代替 %。
所以像这样的东西应该有效(未经测试):
.SECONDEXPANSION:
result/%: data/% helpers/$$(notdir %)
make's basename
和shell的不一样basename
(that 不断地让我绊倒)。
如果你想使用$(foreach)
虽然你想要类似的东西(未经测试):
define dirrule
result/$1/%: data/$1/% helpers/%
@echo cmd 1
@echo cmd 2
endef
$(foreach dir,subdir1 subdir2 ... subdir20,$(eval $(call dirrule,$(dir))))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)