首页 > 解决方案 > 我可以使用什么来获取特定于模式的宏的值

问题描述

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

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

这样的事情可能吗?

标签: makefilegnu-make

解决方案


不,您不能:该模式%仅适用于规则匹配。基于的建议解决方案$*也不适用于所有情况。

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

  • 使用惰性评估 ( =) 将内容评估推迟到配方执行之前
  • 用于$(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

推荐阅读