Как L oop через текстовый файл в Makefile (GNU)? - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть список идентификаторов внутри текстового файла: pid.txt, разделенный пробелом. Я хочу запустить python программу для каждого из этих идентификаторов. Что в основном означает, что я хочу выполнить следующие команды:

python ./program.py id1
python ./program.py id2
python ./program.py id3
...

Я создаю make-файл для этого. Но я не могу написать соответствующий код. Я пробовал много вещей, таких как:

target:
       $(foreach var,$(pid.txt),python ./program.py $(var);)

Но ни один из подходов не работает. Кроме того, я хочу распараллелить это. Использование -j.

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

С готовым рецептом это выполнимо:

ID-INPUT := $(file < pid.txt)

define CREATE-PHONY-PYTHON =
PHONY: $1
$1:
        @echo calling Python with $1
        python ./program.py $1


endef

PHONY: all
all: $(ID-INPUT)

$(info $(foreach ID,$(ID-INPUT),$(call CREATE-PHONY-PYTHON,$(ID))))
$(eval $(foreach ID,$(ID-INPUT),$(call CREATE-PHONY-PYTHON,$(ID))))

Вызов $(info) только для того, чтобы проверить, что генерация рецепта работает, как ожидалось - удалите его, когда в производстве. Распараллеливание должно работать, как и ожидалось, но я не мог это проверить. Вы можете взглянуть на набор инструментов таблицы GNUmake для более сложной обработки конфигурации внутри make.

PS: функция $(file <) работает только в GNUmake> 4.1, насколько я помню

1 голос
/ 26 февраля 2020

Я бы не стал пытаться использовать конструкции make, просто вызову простой сценарий оболочки. Например:

target:
        for id in $$(cat pid.txt); do python ./program.py "$$id"; done

В зависимости от желаемого поведения, вы, вероятно, захотите выполнить:

...; do python ./program.py "$$id" || exit 1; done, чтобы прервать работу в случае сбоя.

...