Как вывести значение переменной в make?

Модератор: Модераторы разделов

Аватара пользователя
жучара
Сообщения: 969
ОС: астралинукс

Как вывести значение переменной в make?

Сообщение жучара »

Друзья! Вот Makefile:

Shell

#!/usr/bin/make -f

ds_0=ppppppppppppppppppppppp
ds_1=ooooooooooooooooooooooo
ds_2=$(ds_0)$(ds_1)

tsel:
$(info $(ds_2))
ds_3=$(ds_0)$(ds_1)
$(info ${ds_3})
А вывод такой:

Shell

$ make
pppppppppppppppppppppppooooooooooooooooooooooo

ds_3=pppppppppppppppppppppppooooooooooooooooooooooo
$
Ерунда какая-то вообще. Надо чтобы переменная ds_3 выводилась безо всяких там этих артефактов. Спасибо, кто откликнется.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5325
ОС: Gentoo

Re: Как вывести значение переменной в make?

Сообщение /dev/random »

Во-первых, переменные 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 и передать переменную вглубь:

Код: Выделить всё

foo:
	$(MAKE) bar=qwerty baz
baz:
	$(info $(bar))
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 969
ОС: астралинукс

Re: Как вывести значение переменной в make?

Сообщение жучара »

/dev/random писал:
05.07.2024 09:45
Во-первых, переменные 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 и передать переменную вглубь:

Код: Выделить всё

foo:
	$(MAKE) bar=qwerty baz
baz:
	$(info $(bar))
Мне вот в этом вот стороннем Makefile надо отследить переменную dst. Вопрос- как?

Shell

#!/usr/bin/make -f

SIG_DIR := debian/signatures/grub-efi-amd64-bin

%:
dh $@

override_dh_auto_install:
set -e ; \
find "$(SIG_DIR)" -name '*.sig' -printf '%P\n' | \
while read sig; do \
dst="debian/tmp/$${sig%/monolithic/*}-signed/$${sig##*/}ned" ; \
install -m 0755 -d "$${dst%/*}" ; \
install -m 0644 "/$${sig%.sig}" "$$dst" ; \
sbattach --attach "$(SIG_DIR)/$$sig" "$$dst" ; \
done

override_dh_install:
dh_install --sourcedir=debian/tmp .
не может же оно в самом деле сбрасываться. Тем более, что там оно дальше употребляется (там типа одострочный оператор, на что указывает перевод на другую строку). Мой пример- это этот вот вырожденный Makefile
Но всё равно никак не выводится.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5325
ОС: Gentoo

Re: Как вывести значение переменной в make?

Сообщение /dev/random »

жучара писал(а):
05.07.2024 10:00

Код: Выделить всё

override_dh_auto_install:
	set -e ; \
	find "$(SIG_DIR)" -name '*.sig' -printf '%P\n' | \
	while read sig; do \
		dst="debian/tmp/$${sig%/monolithic/*}-signed/$${sig##*/}ned" ; \
		install -m 0755 -d "$${dst%/*}" ; \
		install -m 0644 "/$${sig%.sig}" "$$dst" ; \
		sbattach --attach "$(SIG_DIR)/$$sig" "$$dst" ; \
	done
В этом примере указание "\" в конце строки объединяет несколько строк в одну, так что dst сбрасывается только после "done". Но учтите, что dst - это shell-переменная, а не make-переменная. Функции make к ней доступа не имеют. Замените dst="..." ; \ на dst="..." ; echo "$$dst" ; \

Обратите внимание на удвоенный $. Без удвоения он будет интерпретироваться make, а не оболочкой.
Спасибо сказали: