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の両方で問題なく実行され、makeGNUと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')

ゲストアドインをインストールしていないため、コピーする必要がありますが、2回確認すると正確でなければなりません。

ベストアンサー1

使用中のシェルパーサーが破損しています...

背景:解析が$(command)正しく機能するには、再帰解析が必要です。

完全な式は$(command)単一の文字列でなければならず、command非常に複雑です。コマンドの終わりを見つけるために、最新のシェルはパーサーを再帰的に呼び出し、最初の冗長構文で停止するようにします)mkshその後、バイナリ構文ツリーは、再帰パーサーが読み取った文字をバッファーに混在させながらコマンドにbosh戻ります。ksh93

(POSIX(実際にksh88)は、時にはこれがケースラベルの前に)追加された要件を計算して追加する単純な文字列パーサーで使用できると信じています。(

あなたのコマンドがPOSIXで見なされているものと一致しないので、以下を変更して再試行することができます。

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

入力する:

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

そして

* ) echo Unrecognized ;; \

入力する

( * ) echo Unrecognized ;; \

シェルがそのような生のカウントパーサーを使用している場合は、変更を受け入れることができるはずです。

おすすめ記事