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


128

Makeは、コマンドライン引数の処理が少し簡単なシェルスクリプトにすぎないようです。

なぜ./make.shの代わりにmakeを実行するのが標準的なのですか


逆の質問:なぜmakeよりもシェルスクリプトを使用するのか(コマンドライン引数の処理が明らかに容易であるため)、特にシステム管理者のタスクについては、こちらをご覧ください:unix.stackexchange.com/a/497601/1170
lesmana

回答:


125

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

また、少なくともほぼ同様の機能を持つようにするための代替案はかなり多くあることも付け加えておきます。特に、大規模なプロジェクトで少数のファイルのみが再構築される場合、それらのいくつか(例:Ninja)は、多くの場合、作成よりもかなり高速です。


66

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

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

  • もちろん、ビルドに必要なものだけをビルドするために、何が古いかを確認します
  • これは、実行トポロジカルソートや、すべての前提条件がすべての依存関係の前に建てられ、一度だけ構築されているように、期限切れのものを構築するために何を、どのような順序に依存決まりツリー解析の他のいくつかの並べ替えを。
  • 宣言型プログラミング用の言語です。新しい要素は、それらを命令型制御フローにマージする必要なく追加できます。
  • ルール、パターン、日付を処理する推論エンジンが含まれておりこれを特定のMakefileのルールと組み合わせると、makeがエキスパートシステムになります。
  • マクロプロセッサを搭載しています。
  • 参照:以前のmakeの概要

2
ただし、エキスパートシステムとしてはかなり制限されています。たとえば、各推論は同じルールを1回だけ使用できます。
reinierpost 2010

1
ポイント2)をより平易なエンジニアリング用語で詳しく説明するために、シェルスクリプトは線形順序付けを適用しますが、メイクファイルはツリーのようです。これにより、不要な年代順の依存関係が削除されます(実際には、makeプロセスは直線的に実行されます)。
Sridhar Sarnobat 2014年

2
...シェルスクリプトでのMakefileの問題は、JavaScriptでのCSSの問題に類似していると思います。各ノードが実行される時系列の順序はそれほど明白ではありません。少なくともMakefileを使用しても、実際のシェルコマンドを確認できます。CSSでさえ、それは抽象化されます。
Sridhar Sarnobat 2014年

私はいくつかのコメントがあります。誰かがそれらを明確にしてくれれば感謝します。1 /最初のポイントと2つのポイントは関連していませんか。そのトポロジーのソートは、増分ビルドがどのように実装されるかという意味です。2 /関数構成を使用して実装された3番目のポイントも指定できません。3 / MakeFileエンドユーザーにとっての4と5の利点、およびシェルコマンドを一緒に構成することでこれらの利点を実装できない理由について
詳しく知りたい

私がMakeをエキスパートシステムとして説明したのはこれが初めてです。エキスパートシステムを構築した人としては、私が考えたことではありません。Makeには、makefileで指定された宣言ルールを使用してプログラムを構築する方法を推定する推論エンジンがありますが、(リーフ)ルールはファクトではなく実行されるシェルコマンドであるため、ナレッジベースのシステムであることは明白ではありません。また、「エキスパートシステム」という用語は、世界クラスの専門家の専門知識をうまく獲得したシステムを指すために使用されますが、そうではありません。陪審はまだ私のために出ています。
デニス

9

ソースファイルを変更するときに、必要なファイルだけが再コンパイルされるようにします。

例えば:

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チェックが必要になります。


またはrsync -r -c -I $SOURCE $DEST_DIRシェルでこのようなものを使用します。
Spartacus9

9

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

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

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


1
はい、全体の線形順序を緩和して、よりツリーのような順序にします。
Sridhar Sarnobat 2014年

4

makeは依存関係を処理します:makefileはそれらを記述します:バイナリはオブジェクトファイルに依存し、各オブジェクトファイルはソースファイルとヘッダーに依存します... makeが実行されると、ファイルの日付が比較され、何を再コンパイルする必要があるかが決定されます。

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

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

これらはすべてシェルスクリプトで記述できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.