【发布时间】:2018-05-31 19:57:50
【问题描述】:
我的 Makefile 正在捆绑配方以并行处理大量文件(make <recipe> -j8 等)。但在处理文件之前,需要使用find 找到它们。这是一个耗时的操作,所以我只想为用户调用的确切配方运行它。我可以这样做:
test: FILES=$(shell find "$(SEARCHDIR)/" -mindepth 3 -maxdepth 3 -type f ! -regex $(SOMEREGEX))
test: $(FILES)
$(FILES):
echo "do thing with file $@ here"
问题在于,由于文件本身已经存在,因此需要将它们声明为 .PHONY 才能运行配方,如下所示:
.PHONY: $(FILES)
但为了使其工作,FILES 变量需要存在并被填充,这需要我运行find 命令。这违背了我在调用test 之前不执行搜索以查找FILES 的目标。我需要的是这样的:
test: FILES=$(shell find "$(SEARCHDIR)/" -mindepth 3 -maxdepth 3 -type f ! -regex $(SOMEREGEX))
test: .PHONY: $(FILES)
test: $(FILES)
$(FILES):
echo "do thing with file $@ here"
但是test: .PHONY: $(FILES) 是无效的语法并且不起作用。
【问题讨论】:
-
明确一点,您的
$(FILES)配方实际上并没有生成特定于其目标的文件,对吗? -
@Beta 正确。它实际上删除了在
FILES中找到的文件,在其他情况下将符号链接转换为文件等。
标签: makefile