Использование Heredoc в Makefile. Является ли это возможным?

Проблема, вероятно, заключается в специфическом форматировании вывода lsusb:

% usbid=1d6b:0001
% lsusb -d $usbid | awk '{ print "/dev/bus/usb/" $2 "/" $4 }'
/dev/bus/usb/001/001:

Обратите внимание на дополнительное двоеточие в конце. К счастью, вы можете легко удалить его как в awk, так и в оболочке, вот пример awk:

% usbid=1d6b:0001
% lsusb -d $usbid | awk '{ a = $4; sub(/:$/, "", a); print "/dev/bus/usb/" $2 "/" a }'
/dev/bus/usb/001/001
0
01.05.2019, 03:49
2 ответа

Если вы используете GNU make, вы можете использовать синтаксис defineдля многострочных -строковых переменных:

define message =
You can also include make macros like
    $$@ = $@
in a multi-line variable
endef

help:; @ $(info $(message)) :

Играя с функциейvalueи директивой export, вы также можете включить в свой Makefile целый скрипт, который позволит вам использовать многострочную команду -без глобального включения .ONESHELL:

define _script
echo SHELL is $SHELL, PID is $$
cat <<'EOF'
literally $SHELL and $$
EOF
endef
export script = $(value _script)

run:; @ eval "$$script"

даст

SHELL is /bin/sh, PID is 12434
literally $SHELL and $$
4
28.01.2020, 02:30

Простой ответ — «не по умолчанию». Но вы можете настроить GNU make, чтобы разрешить это, используя.ONESHELL:

Обычно каждая строка рецепта выполняется в отдельной оболочке. Что еще хуже, есть способ сделать многострочные команды -в make, используя \в конце строки для продолжения. К сожалению, это \также передается в оболочку , что менее проблематично для других команд, но для heredoc это действительно портит синтаксис.

Однако, если вы включите .ONESHELL:, эта логика изменится, и команды будут выполняться в одной оболочке, что позволит ему работать:

.ONESHELL:

all:
    cat << EOF
    aaa
    bbb
    EOF

Имейте в виду, что это повлияет на работу Make. В частности, Make может не заметить сбой одной строки сборки, если за ней следуют другие. Обычно проверяется результат каждой строки, но с .ONESHELL:make может видеть только результат всех строк.

3
28.01.2020, 02:30

Теги

Похожие вопросы