我的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
命令。这违背了我的目标,即在调用FILES
之前不执行搜索以查找test
。我需要的是这样的事情:
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)
语法无效且不起作用。
答案 0 :(得分:2)
即使没有.PHONY
内容,您的makefile也无法正常工作;只是:
test: FILES=$(shell find "$(SEARCHDIR)/" -mindepth 3 -maxdepth 3 -type f ! -regex $(SOMEREGEX))
$(FILES):
echo "do thing with file $@ here"
失败,因为在$(FILES)
解析makefile之前,规则目标中的make
会扩展为空字符串,然后才开始运行test
目标。
我建议你在这里使用recursive make;像这样写你的makefile:
FIND_FILES :=
FILES :=
ifneq ($(FIND_FILES),)
FILES := $(shell find "$(SEARCHDIR)/" -mindepth 3 -maxdepth 3 -type f ! -regex $(SOMEREGEX))
endif
test:
$(MAKE) test-recurse FIND_FILES=1
test-recurse: $(FILES)
$(FILES):
echo "do thing with file $@ here"
.PHONY: test test-recurse $(FILES)