使文件模式在多个目录上匹配



我有一个*.abc文件的make目标,然后需要触发DIR/%.xyz。问题是DIR是作为目录列表传入的。%。xyz是唯一的,并且只存在于一个地方。我试过用前臂,但没有成功。任何帮助都将不胜感激。

OtherDir:=dir1 dir2 dir3
${SOURCE_DIR}/%.abc: $(foreach dir, OtherDir, $(if ${dir}/%.xyz,,$(info Match found in ${dir}))

编辑-找到一个可能的解决方案。它不是存储到${dir}/$*.xyz的路径,而是直接传递到编译步骤。OtherDir:=dir1 dir2 dir3

${SOURCE_DIR}/%.abc:
$(call status, Do the stuff)
3rd_party_compile_tool $(foreach dir, ${OtherDir}, $(wildcard ${dir}/$*.xyz))

您想要执行的foreach需要二次展开,以便在设置阀杆(%零件(时对其进行评估。考虑以下Makefile:

SOURCE_DIR := src
OtherDir := dir1 dir2 dir3
.SECONDEXPANSION:
$(SOURCE_DIR)/%.abc: $$(foreach dir,$(OtherDir),$$(wildcard $$(dir)/$$*.xyz))
echo Making $@ from $^

具有给定的文件结构:

.
./dir1
./dir2
./dir2/foo.xyz
./dir3
./dir3/bar.xyz
./Makefile

它将匹配基于stem的适当先决条件:

$ make -s src/foo.abc src/bar.abc
Making src/foo.abc from dir2/foo.xyz
Making src/bar.abc from dir3/bar.xyz

因此,对于初学者来说,你尝试做事的方式听起来像是你的整体make设计中有一个缺陷(特别是,如果你在多个目录中有两个名称相同的%.xyz,这会给你带来问题——虽然你现在可能没有,但这是一个尖锐的问题(。

如果你确实想这样做,你可以使用template/eval为每个目录生成一个单独的模式规则。Make将在尝试构建%.abc时选择第一个匹配的模式。

OtherDir:=dir1 dir2 dir3
define abc_rule
${SOURCE_DIR}/%.abc: $(1)/%.xyz
@3rd_party_compile_tool $^
endef
$(foreach dir,${OtherDir},$(eval $(call abc_rule,${dir})))

(请注意,由于依赖关系,您更新后发布的解决方案将出现问题(。

最新更新