Make

在 OpenBSD 上調試 Makefile 中的語句

  • October 23, 2018

我不清楚錯誤來自哪裡,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')

由於我還沒有安裝來賓添加,我必須轉錄但檢查了兩次,它應該是正確的。

您正在使用帶有損壞解析器的外殼….

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

請注意,完整的表達式$(command)需要在單個字元串中,並且command可能非常複雜。為了找到命令的結尾,現代 shell 遞歸地呼叫解析器並讓它在第一個多餘的). mksh然後bosh將二進制語法樹轉換回命令,同時ksh93將遞歸解析器讀取的字元打亂到緩衝區中。

POSIX(實際上是 ksh88)有時認為這將與一個簡單的字元串解析器一起工作,該解析器只計算 (並在案例標籤之前)添加了一個添加要求 。(

由於您的命令不符合 POSIX 的信念,您可以通過更改重試:

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

進入:

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

* ) echo Unrecognized ;; \

進入

( * ) echo Unrecognized ;; \

如果您的 shell 正在使用這樣的原始計數解析器,它應該可以處理該更改。

引用自:https://unix.stackexchange.com/questions/477189