带有目标变量的Makefile模式规则

时间:2014-10-21 13:17:26

标签: makefile gnu-make

我正在使用Gnu Make 3.81,并且在尝试匹配其中也包含变量的模式规则时出错。

这是我能提出的最小的例子:

YYMMDD:=$(shell date +%y%m%d)
TMP_DIR:=/tmp/$(YYMMDD)

# create a temporary directory, and put a "source" file in it
$(TMP_DIR):
    mkdir $(TMP_DIR)
    echo something > $(TMP_DIR)/somefile.orig

# to build an "object" file in the temp dir, process the "source" file
$(TMP_DIR)/%.new: $(TMP_DIR)/%.orig
    wc -l $< > $@

atarget: $(TMP_DIR) $(TMP_DIR)/somefile.new

然后当我运行make atarget时,我得到:

mkdir /tmp/141021
echo something > /tmp/141021/somefile.orig
make: *** No rule to make target `/tmp/141021/somefile.new', needed by `atarget'.  Stop.

这不应该吗?似乎模式规则应该匹配这个就好了。

1 个答案:

答案 0 :(得分:1)

这是因为make不知道.orig文件存在:您有一个构建$(TMP_DIR)的规则,但make不知道此规则也构建$(TMP_DIR)/somefile.orig。因此,当make尝试匹配模式规则时,它将看到.orig文件不存在,并且它没有任何方式知道如何制作该文件,因此模式不匹配,之后就无法构建.new文件。

你应该写:

$(TMP_DIR)/%.orig:
        mkdir -p $(TMP_DIR)
        echo $* > $@

然后它会起作用。