在 OpenBSD 上调试 Makefile 中的语句

在 OpenBSD 上调试 Makefile 中的语句

我不清楚错误从何而来,Makefile代码如下:

platform_id = $$( uname -s )

platform = $$( \
    case $(platform_id) in \
        Linux | FreeBSD | OpenBSD | NetBSD ) echo $(platform_id) ;; \
        * ) echo Unrecognized ;; \
    esac )

Makefile 中的第一个目标是:

check:
    echo $(platform); echo

在 Linux Mint 19.0 和 FreeBSD 11.2 上,它都可以毫无问题地运行,并且经过 GNUmake和 BSD测试make。我的意思是在这两个系统上都有gmake, 和bmake

我是 OpenBSD 6.4 的新手,无法找到错误原因令人沮丧。

该命令的错误消息如下:

echo $(  case $( uname -s ) in Linux | FreeBSD | OpenBSD | NetBSD ) echo $( uname -s ) ;; * ) echo Unrecognized ;;  esac ); echo
/bin/sh: syntax error: ';;' unexpected
*** Error 1 in /root (Makefile:47 'check')

由于我还没有安装访客添加项,所以我必须进行转录,但检查了两次,它应该是正确的。

答案1

您使用的 shell 解析器已损坏......

背景:解析$(command)需要递归解析器才能正常工作。

请注意,完整的表达式$(command)需要位于单个字符串中,并且command可能非常复杂。为了找到命令的结尾,现代 shell 递归地调用解析器并让它停在第一个多余的).mksh然后bosh将二进制语法树转换回命令,同时将ksh93递归解析器读取的字符打乱到缓冲区中。

POSIX(实际上是 ksh88)有时相信这可以与一个简单的字符串解析器一起使用,该解析器只是计数 (并添加了在 case 标签之前)添加的要求 。(

由于您的命令与 POSIX 认为的内容不符,您可以通过更改重试:

    Linux | FreeBSD | OpenBSD | NetBSD ) echo $(platform_id) ;; \

进入:

    ( Linux | FreeBSD | OpenBSD | NetBSD ) echo $(platform_id) ;; \

* ) echo Unrecognized ;; \

进入

( * ) echo Unrecognized ;; \

如果您的 shell 使用这样的原始计数解析器,它应该可以适应该更改。

相关内容