Во-первых, переменные make и переменные оболочки - это разные вещи. Во-вторых, переменные оболочки в make сбрасываются при переходе к следующей строке; по сути, каждая строка - это отдельный shell-скрипт.
Расшифровка вашего Makefile:
#!шебанг
присвоить значение ppppppppppppppppppppppp make-переменной ds_0
присвоить значение ooooooooooooooooooooooo make-переменной ds_1
присвоить значение pppppppppppppppppppppppooooooooooooooooooooooo make-переменной ds_2
при вызове правила tsel:
вывести значение make-переменной ds_2
вывести и выполнить shell-команду "ds_3=pppppppppppppppppppppppooooooooooooooooooooooo". Присвоенное shell-переменной ds_3 значение будет потеряно при переходе к следующей строке, т.к. она считается новым скриптом.
вывести пустое значение несуществующей make-переменной ds_3
Единственный способ присвоить значение make-переменной внутри правила - это функция $(eval). Сами понимаете, eval - это очень нежелательная фича в любом языке.
Вместо этого вы можете вызвать вложенный make и передать переменную вглубь:
Во-первых, переменные make и переменные оболочки - это разные вещи. Во-вторых, переменные оболочки в make сбрасываются при переходе к следующей строке; по сути, каждая строка - это отдельный shell-скрипт.
Расшифровка вашего Makefile:
#!шебанг
присвоить значение ppppppppppppppppppppppp make-переменной ds_0
присвоить значение ooooooooooooooooooooooo make-переменной ds_1
присвоить значение pppppppppppppppppppppppooooooooooooooooooooooo make-переменной ds_2
при вызове правила tsel:
вывести значение make-переменной ds_2
вывести и выполнить shell-команду "ds_3=pppppppppppppppppppppppooooooooooooooooooooooo". Присвоенное shell-переменной ds_3 значение будет потеряно при переходе к следующей строке, т.к. она считается новым скриптом.
вывести пустое значение несуществующей make-переменной ds_3
Единственный способ присвоить значение make-переменной внутри правила - это функция $(eval). Сами понимаете, eval - это очень нежелательная фича в любом языке.
Вместо этого вы можете вызвать вложенный make и передать переменную вглубь:
не может же оно в самом деле сбрасываться. Тем более, что там оно дальше употребляется (там типа одострочный оператор, на что указывает перевод на другую строку). Мой пример- это этот вот вырожденный Makefile
Но всё равно никак не выводится.
В этом примере указание "\" в конце строки объединяет несколько строк в одну, так что dst сбрасывается только после "done". Но учтите, что dst - это shell-переменная, а не make-переменная. Функции make к ней доступа не имеют. Замените dst="..." ; \ на dst="..." ; echo "$$dst" ; \
Обратите внимание на удвоенный $. Без удвоения он будет интерпретироваться make, а не оболочкой.