make: выполнить действие для каждого условия - PullRequest
7 голосов
/ 27 октября 2011

Я бы хотел создать такое правило в моем Makefile:

log: test_A test_B
    ./test_A >> $@
    ./test_B >> $@

, но test_A и test_B являются частью переменной $(TESTS).

Итак, возможно ли выполнить действие (здесь: вызвать программу) для каждого условия в GNU / make?

Примечание: Как заставить правило make-файла выполнить его предварительные требования? не полностью решает эту проблему, поскольку требуется цель log (make log).

1 Ответ

19 голосов
/ 27 октября 2011

По сути, вы хотите перебрать все предпосылки. Очевидный способ сделать это - надуть снаряд:

log: test_A test_B
        for f in $^; do ./$$f; done

Или вы можете написать цикл как цикл GNU Make foreach, хотя вы должны быть осторожны, чтобы команды, которые являются результатом тела цикла, отображались в отдельных строках (через define) или заканчивались терминатор оболочки (т.е. точка с запятой, что проще):

log: test_A test_B
        $(foreach f,$^,./$(f);)

Наконец, в этом случае вы можете записать это более кратко и неясно как замену шаблона на каждом элементе, который будет зациклен:

log: test_A test_B
        $(patsubst %,./%;,$^)

(я уверен, что вы можете добавить перенаправление вывода и $(TESTS) переменную в зависимости от ситуации.)

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