MakefileでHeredocを使用してください。可能ですか?

MakefileでHeredocを使用してください。可能ですか?

私が使用する基本的なステップMakefileは、他のオプションのヘルプドキュメントを印刷することです。EOF複数のセクションの代わりにセクションを1つだけ追加できれば幸いですecho。 bashスクリプトのように使用できますかEOFMakefile

答え1

GNU makeを使用している場合は、次のdefine構文を使用できます。複数行変数:

define message =
You can also include make macros like
    $$@ = $@
in a multi-line variable
endef

help:; @ $(info $(message)) :

遊びながらvalue関数和export.ONESHELLディレクティブを使用すると、Makefileにスクリプト全体を含めることもできます。これにより、グローバルに開かずに複数行のコマンドを使用できます。

define _script
echo SHELL is $SHELL, PID is $$
cat <<'EOF'
literally $SHELL and $$
EOF
endef
export script = $(value _script)

run:; @ eval "$$script"

減らす

SHELL is /bin/sh, PID is 12434
literally $SHELL and $$

答え2

簡単な答えは「基本的にではありません」です。ただし、GNU makeを設定して次のものを使用できるようにすることができます。.ONESHELL:

通常、レシピの各行は独自のシェルで実行されます。さらに悪いことは、makeで複数行のコマンドを作成する方法があるということです。\行の末尾に を使用して続行することです。 残念ながら、これは\シェルにも渡されます。これは他のコマンドでは大きな問題ではありませんが、heredocでは構文が実際に混乱します。

ただし、.ONESHELL:このロジックを有効にすると、コマンドは単一のシェルで実行されて動作する可能性があります。

.ONESHELL:

all:
    cat << EOF
    aaa
    bbb
    EOF

これはMakeの機能にさらに影響を与えることに注意してください。特に、Makeは、他のビルドラインが次に来ると、ビルドラインが失敗するかどうか気付かないかもしれません。通常は各行の結果を確認しますが、.ONESHELL:makeを使用するとすべての行の結果のみを表示できます。

関連情報