Makefile: объявить цели PHONY как обязательное условие рецепта - PullRequest
0 голосов
/ 31 мая 2018

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

1 Ответ

0 голосов
/ 01 июня 2018

Ваш make-файл уже не работает, даже без .PHONY;просто:

test: FILES=$(shell find "$(SEARCHDIR)/" -mindepth 3 -maxdepth 3 -type f ! -regex $(SOMEREGEX))

$(FILES):
        echo "do thing with file $@ here"

завершается неудачно, потому что $(FILES) в цели правила расширяется до пустой строки, когда make анализирует make-файл, прежде чем он запустит цель test.

Я рекомендую вам использовать рекурсивную make здесь;напишите свой make-файл так:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...