特定于模式的宏的值可以使用什么

时间:2019-03-01 23:28:11

标签: makefile gnu-make

我希望特定于模式的宏的值基于模式的词干。

$(BINDIR)/%.gz: LOGFILE := %.dir/%.log

有这种可能吗?

2 个答案:

答案 0 :(得分:0)

否,您不能:模式%仅适用于规则匹配。基于$*的建议解决方案在所有情况下也无法正常工作。

以下内容看起来不太好,但是可以实现您想要的:

  • 使用惰性评估(=)将内容评估推迟到执行配方之前
  • 使用$(notdir $@)提取目标文件名的一部分
  • 使用$(basename ...)删除文件结尾
BINDIR := bin

.PHONY: all
all: $(BINDIR)/test1.gz $(BINDIR)/test2.gz

$(BINDIR)/%.gz: LOGFILE = $(basename $(notdir $@)).dir/$(basename $(notdir $@)).log

$(BINDIR)/test2.gz:
    @echo "logfile for $@ is $(LOGFILE)"

$(BINDIR)/%.gz:
    @echo "logfile for $@ is $(LOGFILE)"

试运行:

$ make
logfile for bin/test1.gz is test1.dir/test1.log
logfile for bin/test2.gz is test2.dir/test2.log

答案 1 :(得分:0)

为什么将自己与模式专用变量混淆?普通人会做,并使事情更容易引导。

在模式规则的食谱中,type DataFrame = Dataset[Row] 扩展为与规则中的$*相匹配的内容。 (在这里,我将使用静态模式规则,只是'因为它们比普通模式规则恕我直言更好。)

%

自然地,一个或两个变量可以使它更简洁:

${BINDIR}/test1.gz ${BINDIR}/test2.gz: ${BINDIR}/%.gz:
    @echo "logfile for $@ is $*.dir/$*.log"