我正在使用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.
这不应该吗?似乎模式规则应该匹配这个就好了。
答案 0 :(得分:1)
这是因为make不知道.orig
文件存在:您有一个构建$(TMP_DIR)
的规则,但make不知道此规则也构建$(TMP_DIR)/somefile.orig
。因此,当make尝试匹配模式规则时,它将看到.orig
文件不存在,并且它没有任何方式知道如何制作该文件,因此模式不匹配,之后就无法构建.new
文件。
你应该写:
$(TMP_DIR)/%.orig:
mkdir -p $(TMP_DIR)
echo $* > $@
然后它会起作用。