В духе .ONESHELL в сложных средах .ONESHELL можно подобраться довольно близко:
define _oneshell_newline_
endef
define oneshell
@eval "$$(printf '%s\n' '$(strip \
$(subst $(_oneshell_newline_),\n, \
$(subst \,\/, \
$(subst /,//, \
$(subst ','"'"',$(1))))))' | \
sed -e 's,\\n,\n,g' -e 's,\\/,\\,g' -e 's,//,/,g')"
endef
Пример использования будет примерно таким:
define TEST
printf '>\n%s\n' "Hello
World\n/$$$$/"
endef
all:
$(call oneshell,$(TEST))
Это показывает результат (при условии, что pid 27801):
>
Hello
World\n/27801/
Такой подход позволяет использовать некоторые дополнительные функции:
define oneshell
@eval "set -eux ; $$(printf '%s\n' '$(strip \
$(subst $(_oneshell_newline_),\n, \
$(subst \,\/, \
$(subst /,//, \
$(subst ','"'"',$(1))))))' | \
sed -e 's,\\n,\n,g' -e 's,\\/,\\,g' -e 's,//,/,g')"
endef
Эти параметры оболочки будут:
- Распечатайте каждую команду по мере ее выполнения
- Выйти по первой неудачной команде
- Считать использование неопределенных переменных оболочки ошибкой
Скорее всего, напрашиваются другие интересные возможности.
export ANNOUNCE_BODY
устанавливает только переменную внутри правил - это не позволяет ссылаться на $$ ANNOUNCE_BODY для определения других переменных.