Как установить переменную внутри рецепта с помощью оператора case? - PullRequest
0 голосов
/ 05 октября 2018

У меня есть следующий фрагмент кода, и я не могу понять, почему он не работает:

test-%:
    # this works
    case $* in a) echo A;; b) echo B;; esac
    # this doesn't
    $(eval MY_VAR := \
        $(shell case $* in a) echo A;; b) echo B;; esac ))
    echo $(MY_VAR)

Вывод:

$ make test-a
bash: -c: line 2: syntax error: unexpected end of file
case a in a) echo A;; b) echo B;; esac
A
echo B;; esac ))
bash: -c: line 0: syntax error near unexpected token `;;'
bash: -c: line 0: `echo B;; esac ))'
makefile:277: recipe for target 'test-a' failed
make: *** [test-a] Error 1

Я подозреваю, что мне нужно избежать некоторыхперсонажи, но я не знаю, какие.Я попытался \), который исправил подсветку синтаксиса в vim, но это все равно не сработало.

1 Ответ

0 голосов
/ 05 октября 2018

Вы не можете использовать ярлык оболочки для case, который позволяет опустить открывающую скобку, потому что $(eval …) нуждается в соответствующих скобках.Вместо этого вам нужно написать следующее:

    $(eval MY_VAR := \
        $(shell case $* in (a) echo A;; (b) echo B;; esac ))

(Также $(eval …), даже если он вложен в подобные рецепты, все равно будет анализироваться как фрагмент make-файла верхнего уровня, но, возможно, это то, что вам нужно.

...