Функция $(word)
разделяется на пробелы. Не пробелы, пробелы.
В вашем макросе A
нет пробелов, поэтому ничто не становится разделенным.
Добавить временное пространство на линии 1
или ведущее место на линии 2
, и вы получите ожидаемое поведение.
Это согласуется с GNU make 3.81, 3.82, 4.0 и 4.1 в некоторых быстрых тестах здесь.
Причина, по которой вы видите «разлив», как вы ее назвали, объясняется тем, как определяется определение. Он расширяется буквально, newline и все. (Думайте о расширении шаблона.)
Таким образом, make расширяет определение в вызове до $(word 1,...)
, а затем расширяет этот результат (целое определение, включая новую строку), в шаблон рецепта и заканчивается двумя строками, которые он выполняет в качестве рецепта.
Рассмотрим макрос так:
define somecommands
echo foo
echo bar
echo baz
endef
all:
$(somecommands)
Что бы ожидать, чтобы это произошло здесь? Сколько строк является телом all
? Сколько снарядов работает здесь? Какие команды выполняются? Ответ - три строки, три оболочки и три команды эха.
Если новые строки не были подсчитаны, то вы бы эффективно работать echo foo echo bar echo baz
в одной команде и получить foo echo bar echo baz
в качестве выходного сигнала вместо ожидаемого (и гораздо более полезным) foo
, bar
и baz
на трех различных линиях.
Я не спрашивая о '$ (word)' функции. Я прошу объяснить сообщение об ошибке «make: 2: Command not found». Меня интересует, как/почему «2» появился вне функции и попал в конвейер выполнения make. Это вопрос, который я задал. – Dummy00001
Вы спрашивали о том, как «часть' $ (A) 'разлилась вне функции $ (word)". Я просто ответил на этот вопрос ... хотя теперь я вижу, как ответ не полностью объяснен в том, что я написал (хотя он есть). Оставайтесь на линии. –
Нет. На самом деле это не ответ. Это в основном экстраполяция официальной (неопределенной по предметной) документации, которая вообще не затрагивает двусмысленность. Я начинаю думать, что это просто ошибка в реализации многострочных определений. Например, попробуйте добавить точку с запятой в конце команды 'echo' и посмотреть, как изменяется сообщение об ошибке. (Если под Linux, запустите с помощью 'strace -ff -e execve', чтобы увидеть всю бессмыслицу во всей красе.) – Dummy00001