Как запустить make из make в l oop при изменении файла? - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть этот Makefile:

MAKE=make

ALL: pl/index.html

pl/index.html: pl/index.md template.html
    build.js -l pl -t template.html > pl/index.html

watch: pl/index.html
    @inotifywait -e close_write pl/index.md template.html | while read events; do $(MAKE); done

я хочу иметь make watch, который будет запускаться при каждом изменении файла. Но сделайте остановку родительской марки после того, как она будет завершена sh.

У меня есть этот вывод после редактирования файла:

$ LC_ALL=C make watch 
Setting up watches.
Watches established.
make[1]: Entering directory '/mnt/ssd/projects/jcubic/scheme/tutorial'
build.js -l pl -t template.html > pl/index.html
make[1]: Leaving directory '/mnt/ssd/projects/jcubic/scheme/tutorial'

Я также пробовал:

bash -c 'make' и `make` последний выдает ошибку:

/bin/sh: make[1]:: command not found
make: *** [Makefile:9: watch] Error 127

можно ли написать make watch?

Я пытался написать скрипт:

#!/bin/bash

make

, но вызов сценария с ./run показывает ту же ошибку:

/bin/sh: make[1]:: command not found
make: *** [Makefile:9: watch] Error 127

вызов bash -c './run' работает, но он останавливается после первого запуска, как показывается первая ошибка.

1 Ответ

1 голос
/ 08 апреля 2020

Ваша первоначальная попытка была правильной. Ваша проблема не имеет ничего общего с make или make-файлом ... вы просто неправильно вызвали inotifywait.

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

В этом случае документация для inotifywait проясняет:

Может произойти выход, как только произойдет событие, или постоянно выполнять и выводить события по мере их возникновения.

И:

-m, --monitor

Вместо выхода после получения одного события выполнить до бесконечности. Поведение по умолчанию - выход после первого события.

Таким образом, поведение, которое вы видите, точно такое, как задокументировано. Если вы хотите, чтобы inotifywait ждал вечно, используйте опцию -m.

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