web-dev-qa-db-ja.com

シェルスクリプトでmakeを使用する理由

Makeは、コマンドライン引数を少し簡単に処理できるシェルスクリプトのように思えます。

./make.shの代わりにmakeを実行するのが標準である理由

98
HoboBen

一般的な考え方は、makeが(合理的に)最小限の再構築をサポートすることです。つまり、プログラムのどの部分が他のどの部分に依存するかを伝えます。プログラムの一部を更新すると、onlyはそれに依存する部分を再構築します。 couldこれをシェルスクリプトで行うと、lotより多くの作業になります(すべてのファイルの最終変更日を明示的にチェックするなど)。シェルスクリプトの代替方法は、毎回すべてを再構築することです。小さなプロジェクトの場合、これは完全に合理的なアプローチですが、大きなプロジェクトの場合、完全な再構築には1時間以上かかることがあります-makeを使用すると、同じことを1、2分で簡単に達成できます...

107
Jerry Coffin

Makeはエキスパートシステム

シェルスクリプトで行うのが難しいmakeにはさまざまなことがあります...

  • もちろん、ビルドに必要なものだけをビルドするために、何が古くなっているかを確認します
  • topological sortまたは他の種類のツリー分析を実行しますすべての依存関係の前にすべての前提条件が構築され、一度だけ構築されるように、何が古いものを構築するために何にどの順序に依存するかを決定します。
  • これは宣言型プログラミングの言語です。新しい要素は、命令型の制御フローにマージする必要なく追加できます。
  • ルール、パターン、日付を処理するための推論エンジン 、これは、特定のMakefileのルールと組み合わせると、makeがエキスパートシステムに変わるものです
  • マクロプロセッサを搭載しています。
  • 以前のmakeの要約も参照してください。
57
DigitalRoss

上記と同様に、Makeは宣言型(-ish)並列プログラミング言語です。

4,000個のグラフィックファイルを変換し、4個のCPUがあるとします。 CPUを飽和させながら確実に実行する10行のシェルスクリプトを作成してみてください(ここでは寛大です)。

おそらく本当の疑問は、なぜ人々がシェルスクリプトを書くのを煩わせるのかということでしょう。

7
bobbogo

Makeは、ソースファイルに変更を加えたときに、必要なファイルのみが再コンパイルされるようにします。

例えば:

final : 1.o 2.o
    gcc -o final 1.o 2.o

1.o : 1.c 2.h
    gcc -c 1.c

2.o : 2.c 2.h
    gcc -c 2.c

ファイルを変更した場合2.hのみ&makeを実行し、3つのコマンドすべてを逆の順序で実行します。

ファイルを変更した場合1.cのみ&makeを実行します。最初の2つのコマンドを逆順でのみ実行します。

独自のシェルスクリプトでそれを達成しようとすると、多くのif/elseチェック。

7
user191776

makeは依存関係を処理します:makefileはそれらを記述します:バイナリはオブジェクトファイルに依存し、各オブジェクトファイルはソースファイルとヘッダーに依存します... 。

Makefileに記述されているすべてをビルドするのではなく、1つのターゲットを直接呼び出すことができます。

さらに、make構文は置換、vpathを提供します

これらはすべて、シェルスクリプトで記述できます。これにより、既に持っています。

3
philant