回答:
一般的な考え方は、make
(合理的に)最小限の再構築をサポートすることです。つまり、プログラムのどの部分が他のどの部分に依存しているかを伝えます。プログラムの一部を更新すると、それに依存する部分のみが再構築されます。シェルスクリプトを使用してこれを行うことはできますが、多くの作業(すべてのファイルの最終変更日を明示的に確認するなど)になります。シェルスクリプトを使用する唯一の明らかな代替策は、毎回すべてを再構築することです。小さなプロジェクトの場合、これは完全に妥当なアプローチですが、大きなプロジェクトの場合、完全な再構築には1時間以上かかるmake
可能性があります-を使用すると、同じことを1〜2分で簡単に達成できます...
また、少なくともほぼ同様の機能を持つようにするための代替案はかなり多くあることも付け加えておきます。特に、大規模なプロジェクトで少数のファイルのみが再構築される場合、それらのいくつか(例:Ninja)は、多くの場合、作成よりもかなり高速です。
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
チェックが必要になります。
rsync -r -c -I $SOURCE $DEST_DIR
シェルでこのようなものを使用します。
上記と同様に、Makeは宣言型(-ish)の並列プログラミング言語です。
変換する4,000のグラフィックファイルと4つのCPUがあるとします。CPUを飽和させながら確実に実行する10行のシェルスクリプト(ここでは寛大です)を書いてみてください。
おそらく本当の問題は、なぜ人々がシェルスクリプトを作成するのかわからないことでしょう。