我用来make
获取网站上每天更新的一组文件。我想做的是将文件放入以日期命名的文件夹中,然后使用 make 对文件进行其他处理。我试过这个:
SUFFIXES = .csv
FILES = file1.csv file2.csv file3.csv
BASE_DIR = some/dir
DATE = $(shell date +"%Y%m%d")
SOURCE_FILES = $(patsubst %,$(BASE_DIR)/$(DATE)/%,$(FILES))
ACTIVE_FILES = $(patsubst %,$(BASE_DIR)/%,$(FILES))
all: $(BASE_DIR)/$(DATE) $(ACTIVE_FILES)
$(BASE_DIR)/%.csv: $(BASE_DIR)/$(DATE)/%.csv
rm -f $@
ln $(BASE_DIR)/$(DATE)/%
$(BASE_DIR)/$(DATE):
mkdir $@
$(BASE_DIR)/$(DATE)/%.csv:
cd $(BASE_DIR)/$(DATE); wget http://example.com/data/%.csv
问题出在最后一行。我不知道如何将文件名传递给 wget,因为“%.csv”在此上下文中无效。我怎样才能实现我所追求的目标?
答案1
我相信你想使用自动变量$*
。来自 GNU make 的文档:
$*
隐式规则匹配的词干。如果目标是
dir/a.foo.b
且目标模式是a.%.b
则词干是dir/foo
。词干对于构建相关文件的名称很有用。在静态模式规则中,主干是与%
目标模式中的 匹配的文件名的一部分。
在您的具体情况下, wget 规则可以重写为:
$(BASE_DIR)/$(DATE)/%.csv:
cd $(BASE_DIR)/$(DATE); wget http://example.com/data/$*.csv