【问题标题】:How do I set a variable inside a recipe using a case statement?如何使用 case 语句在配方中设置变量?
【发布时间】:2018-10-05 16:18:43
【问题描述】:

我有以下代码 sn-p 并且无法弄清楚为什么它不起作用:

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 中的语法突出显示,但仍然不起作用。

【问题讨论】:

    标签: shell makefile switch-statement gnu-make


    【解决方案1】:

    您不能使用case 的shell 快捷方式,它允许您省略左括号,因为$(eval …) 需要匹配的括号。相反,您需要这样写:

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

    (还有$(eval …),即使嵌套在这样的配方中,仍将被解析为顶级makefile片段,但也许这就是你想要的。

    【讨论】:

    • 或者你可以使用花括号作为 eval:${eval MY_VAR := ...} 但我总是使用匹配的括号版本的case,即使在 shell 脚本中也是如此。
    • 谢谢@Florian。这样可行。我不确定我是否理解您的顶级 makefile 片段注释,但代码现在可以按我的意愿工作。
    • $(eval) 将在 make 扩展配方时被解析。如果配方从未被调用,它将不会被解析。此外,eval 将在第一行传递到 shell 之前 进行扩展,因此将其埋在配方中间有点误导。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多