web-dev-qa-db-ja.com

Makefileでの印刷:@echo vs $(info)

Makefileのこれら2つのコマンドの違いは何ですか?

@echo "Hello World"
$(info Hello World)

どうやら、echoinfoは同じ出力を出力しますが、違いはどこにありますか?そして、いつどれを使うのですか?

6
V. L.

さて、echoはシェルコマンドです。したがって、レシピに入れると、シェルが呼び出されて実行され、シェルコマンドが出力を生成します。

foo: ; @echo "Hello World"

実行/bin/sh -c 'echo "Hello World"'。レシピでのみ使用できます。これは、どのバージョンのmakeでも、どのPOSIXシェルでも機能します。シェルを呼び出すため、引用の問題などに注意する必要がある場合があります(もちろんこの単純な例ではありません)。

infoはGNU make関数です。makeによって直接処理されます。シェルは呼び出されません。レシピだけでなく、makefileのどこにでも表示できます。そうではありません。他のバージョンのmakeに移植可能です。シェルが呼び出されないため、引用の問題はありません。

ただし、infoはmake関数であるため、シェルが呼び出される前にmakeによって解析されます。つまり、レシピ内に設定されているシェル変数を表示することはできません。例えば:

foo: @for i in a b c d; do $(info $$i); done

動作しません。ここではechoを使用する必要があります。

9
MadScientist