Ответ 1
С
FILES = $(shell ls)
с отступом под all
, как это, это команда сборки. Таким образом, это расширяет $(shell ls)
, затем пытается запустить команду FILES ...
.
Если FILES
предполагается переменной make
, эти переменные должны быть назначены вне части рецепта, например:
FILES = $(shell ls)
all:
echo $(FILES)
Конечно, это означает, что FILES
будет настроен на "вывод из ls
" перед запуском любой из команд, которые создают файлы .tgz. (Хотя в качестве примечаний Kaz переменная повторно расширяется каждый раз, поэтому в конечном итоге она будет включать файлы .tgz, а некоторые из вариантов имеют FILES := ...
, чтобы избежать этого, для эффективность и/или правильность. 1)
Если FILES
предполагается как переменная оболочки, вы можете установить его, но вам нужно сделать это в shell-ese без пробелов и процитировать:
all:
FILES="$(shell ls)"
Однако каждая строка запускается отдельной оболочкой, поэтому эта переменная не сохранится до следующей строки, поэтому вы должны немедленно ее использовать:
FILES="$(shell ls)"; echo $$FILES
Это немного глупо, так как оболочка будет расширять *
(и другие выражения оболочки оболочки) для вас в первую очередь, поэтому вы можете просто:
echo *
в качестве вашей команды оболочки.
Наконец, как общее правило (на самом деле не применимое к этому примеру): как esperanto примечания в комментариях, использование вывода из ls
не полностью (некоторые детали зависят от имен файлов, а иногда и от версии ls
, некоторые версии ls
пытаются в какой-то мере дезинформировать вывод). Таким образом, как l0b0 и idelic обратите внимание, что если вы используете GNU make, вы можете использовать $(wildcard)
и $(subst ...)
для выполнения всего внутри make
(избегая проблем с "странными символами в имени файла" ). (В сценариях sh
, включая часть рецептов make файлов, другой метод заключается в использовании find ... -print0 | xargs -0
, чтобы избежать отключения над пробелами, символами новой строки, управляющими символами и т.д.)
1GNU Сделайте еще документацию о том, что POSIX добавляет ::=
в 2012 году. Я не нашел ссылку для ссылки на документ POSIX для этого, и я не знаю, что поддерживает make
варианты ::=
, хотя GNU make делает сегодня с тем же значением, что и :=
, т.е. выполните задание прямо сейчас с расширением.
Обратите внимание, что VAR := $(shell command args...)
также может быть записано VAR != command args...
в нескольких вариантах make
, включая все современные варианты GNU и BSD, насколько я знаю. Эти другие варианты не имеют $(shell)
, поэтому использование VAR != command args...
превосходит как сокращение, так и работу в большем количестве вариантов.