对于某些场景,由GNU-Make创建的automatic variables非常方便:
.SECONDEXPANSION:
%-processed.md: $$(wildcard $$*.m4) $(wildcard macros/*.m4) %.md
m4 $^ > $@然而,当有人试图在makefile中的其他地方添加依赖项时,这个idilic世界就会爆炸:
.PHONY: force
force: ;
mybook-processed.md: force现在m4突然抱怨说"force“不是一个有效的输入文件。当然不是,但它显示在$^变量中,因为它被附加到先决条件列表中。
有没有办法只访问直接配方定义中定义的前提条件,而忽略其他前提条件?
发布于 2017-02-15 22:10:48
不不可能。这些信息甚至在make的内部结构中都不可用。
不过,我不会使用您的示例解决方案。如果您的命令只接受某些类型的文件,我将使用filter来确保它只看到这些类型的文件:
.SECONDEXPANSION:
%-processed.md: $$(wildcard $$*.m4) $(wildcard macros/*.m4) %.md
m4 $(filter %.m4 %.md,$^) > $@发布于 2017-02-15 22:28:30
您可以为伪目标(比如MAGIC/force )采用一种命名约定。然后是$(filter-out MAGIC/%,$^) --仍然有点重复,但并不是那么糟糕。
发布于 2017-02-15 15:54:54
到目前为止,我找到的唯一方法是停止使用自动变量,并编写我自己的变量。我真的希望有人能提出一个更好的答案,但这是我目前的解决方案:
.SECONDEXPANSION:
process_prereqs = $(wildcard $1.m4) $(wildcarad macros/*.m4)
%-processed.md: %.md $$(call process_prereqs,$$*)
m4 $(call process_prereqs,$$*) $< > $@这样,只使用了更稳定的$<自动变量,而另一个变量更具可预测性,但代码有点重复。
https://stackoverflow.com/questions/42243547
复制相似问题