Почему $ (shell ls) раскрывается в начале задачи makefile? - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть следующий код:

foo:

    touch foo

    $(foreach f, $(shell ls | grep foo), \
        echo $f; \
    )

не будет отображать файл foo, созданный touch foo выше, будет отображаться, если файл foo уже существует до запуска задачи, например:

$ make foo # first time call, file 'foo' doesn't exists yet

$ make foo # second time call, file 'foo' already exists
  foo

Есть ли способ оценить ls после выполнения всех вышеперечисленных команд?

1 Ответ

0 голосов
/ 09 сентября 2018

Вот так работает Make. Makefile анализируется и вызываются все функции Makefile, затем оценивается один или несколько рецептов.

Есть ли причина, по которой вы не просто используете цикл оболочки?

foo:
    touch foo
    for f in *foo*; do \
         echo "$$f"; \
    done

Обратите внимание, как знак доллара нужно удвоить, чтобы избежать его оценки make, а также как переменные оболочки обычно должны заключаться в двойные кавычки, если вам специально не требуется, чтобы оболочка выполняла токенизацию пробелов и расширение подстановочного знака для значения .

С другой стороны, более гибкий подход заключается в явном документировании любых зависимостей.

.PHONY: all
all: foo
     printf '%s\n' $^
foo:
     touch $@

Теперь all зависит от foo, поэтому Make знает, что он должен создать foo, прежде чем сможет выполнить рецепт all, если foo не существует или устарел по отношению к своему собственному. зависимости (которых, конечно, в настоящее время нет).

Переменная make $^ относится к зависимостям текущей цели, а $@ расширяется до текущей цели рецепта. Сценарий оболочки printf - это просто более экономичный способ печати одной вещи в строке без цикла.

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