Правила Makefile с использованием переменных в качестве входных данных - PullRequest
0 голосов
/ 31 октября 2011

Я хотел бы написать Makefile (gnu make), как показано ниже, т.е. для заданного списка значений, хранящихся в переменной, я хотел бы запустить команду.Возможно ли это, или мне нужно написать уродливый цикл?

Уродливые правила работают, а умные - нет.

SERVERS:=localhost
COMMAND:=uptime
OUTPUTS:=$(patsubst %, %.output ,$(SERVERS))

.PHONY: smart ugly

smart: $(OUTPUTS)

%.output: %
        ssh -n $^ $(COMMAND) > $@ || $(RM) $@

ugly:
        for s in $(SERVERS); do \
                ssh -n $$s $(COMMAND) > $$s.output || $(RM) $$s.output; \
        done

1 Ответ

1 голос
/ 31 октября 2011

Интеллектуальное правило ищет необходимый файл% (localhost в вашем примере), которого нет. Правило пропускается соответственно.

Итак, используйте:

%.output:

вместо этого и должно работать.

Также вы можете взглянуть на специальную цель .DELETEONERROR вместо того, чтобы делать || rm $@. В вашей нотации вышедший из строя SSH по-прежнему завершается с кодом выхода 0 (из rm), и весь процесс make завершается успешно или (когда% .output является зависимостью) успешно продолжается после сбоя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...