Make
在 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 上,它都可以正常工作,並通過 GNU
make
和 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 正在使用這樣的原始計數解析器,它應該可以處理該更改。