GNU Makeファイルにはどのシェルを使用する必要がありますか?

GNU Makeファイルにはどのシェルを使用する必要がありますか?

私はmakefileルールでecho、、、、mvifようなものを見ました。for一種のシェルコマンドが認識されるようです。これはカーニバルですか?どのシェルが使用されているか、および利用可能なキーワードの完全なリストをどのように知ることができますか?

答え1

それsh:

その後、実行行は引数として渡されたようにシェルによって実行されます。システム()相互作用

system()sh次のキーワードを使用できます。POSIX シェルコマンド言語、ホストプラットフォームで使用できるようにしたいキーワード以外のコマンド。

sh実際には、システム内の他のシェル(たとえばbash)の別の名前である可能性があります。この場合、より多くのオプションを使用できます。ただし、このmakefileは移植可能ではありません。

GNU makeについて具体的に質問するとき、私はまたGNU makeを使って次のことができることに言及しました。異なるシェルの指定makefile で使用されますが、makefile はmakePOSIX 規則に従ってshデフォルトで使用されます。

答え2

皆さんもぜひご覧くださいPolyGlot生成ファイル、特定のmakefileターゲットのシェル選択の簡単な説明です。

ここで bash というターゲットに対して bash を選択しました。

.ONESHELL:
bash: SHELL := bash
bash:
    # note: the double dollar-sign is required because Make substitues $variables
    export greeting="¡hola"
    echo "$${greeting}, bash!"

これはただ自慢することです:

.ONESHELL:
python: SHELL := python3
python:
    greeting = "hello"
    print(f"{greeting}, python!")

次にmake python「Hello、python!」を印刷します。

答え3

@Michael(+1)がすべてを話し、詳細についての指示を提供しました。それにもかかわらず、私は2つの詳細を強調したいと思います(修正してください):

  1. アクションを生成するには、「sh」を使用してください

  2. gnumakeに役立つ場合は、シェルをオーバーライドできます。

    シェル=バッシュ

そしてbashトリックを使用してください。

  1. (UNIXベースの環境では) -mvechoコマンド(すべてのシェルで使用可能)であり、ifsh for/ bashの依存関係です。

  2. シェルは引用(そしてglobとvarの拡張...)に関して異なる動作を持ち、makeいくつかの特別な動作もあります。

  3. Windowsなどでは、gnumakeコマンドとともに、ある種のUnixサバイバルツールキット(sh / bash、いくつかのフィルタ、fileutils、および一般的にmake操作に使用されるコマンド)をインストールすると便利です。

関連情報