Мой 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)
имеет неверный синтаксис и не работает.