短い答え:なぜなら make
良くないから。Cのフロントでも、多くの選択肢がポップアップ表示されます。
長い答え:make
Cのコンパイルにはほとんど適さず、Javaのコンパイルにはまったく適さない欠点がいくつかあります。必要に応じて強制的にJavaをコンパイルすることもできますが、問題が発生する可能性があるため、適切な解決策や回避策がないものもあります。ここにいくつかあります:
依存関係の解決
make
本質的に、ファイルは互いにツリーのような依存関係を持っていると想定しています。1つのファイルは、他のファイルをいくつかビルドした結果の出力です。ヘッダーファイルを処理するとき、これはすでにCで逆効果です。ヘッダーファイルに対するCファイルの依存関係を表すために-固有のインクルードファイルを生成するmake
必要があるmake
ため、後者を変更すると、以前のファイルが再構築されます。ただし、Cファイル自体は再作成されない(単に再構築される)ため、makeは多くの場合、ターゲットを次のように指定する必要があります。.PHONY
ます。幸い、GCCはこれらのファイルの自動生成をサポートしています。
Javaでは、依存関係は循環的になる可能性があり、make
形式でクラスの依存関係を自動生成するツールはありません。ant
のDepend
タスクでは、代わりに、クラスファイルを直接読み取り、インポートするクラスを決定し、古いものがある場合はクラスファイルを削除できます。これがないと、重要な依存関係があると、クリーンビルドを繰り返し使用せざるを得なくなり、ビルドツールを使用する利点がなくなります。
ファイル名のスペース
JavaもCもソースコードファイル名にスペースを使用することを推奨していませんmake
が、スペースがファイルパスにある場合でも問題になる可能性があります。たとえば、ソースコードがにあるかどうかを検討しますC:\My Documents\My Code\program\src
。これは壊れるのに十分でしょうmake
。これは、make
ファイル名を文字列として扱うためです。ant
パスを特別なオブジェクトとして扱います。
ビルド用のファイルをスキャンしています
make
ターゲットごとにビルドするファイルを明示的に設定する必要があります。ant
ソースファイルを自動スキャンするフォルダを指定できます。少し便利に思えるかもしれませんが、Javaでは新しいクラスごとに新しいファイルが必要になることを考慮してください。プロジェクトにファイルを追加すると、すぐに大きな手間がかかります。
そして最大の問題make
:
makeはPOSIXに依存します
Javaのモットーは、「どこでも一度コンパイルする」です。しかし、そのコンパイルを、Javaサポートが実際に最悪のPOSIXベースのシステムに制限することは意図されていません。
のビルドルールmake
は基本的に小さなbash
スクリプトです。make
Windowsへのポートがありますが、それが正しく動作するbash
ためには、ファイルシステムのPOSIXエミュレーションレイヤーを含むのポートにバンドルする必要があります。
これには2つの種類があります。
MSYS
これはPOSIX変換をファイルパスに制限しようとするため、専用に作成されていない外部ツールを実行するときに不快な問題が発生する可能性があります。
cygwin
完全なPOSIXエミュレーションを提供します。ただし、結果として得られるプログラムは、依然としてそのエミュレーション層に依存する傾向があります。
そのため、Windowsでは、標準のビルドツールはまったく同じmake
ではなくMSBuild
、XMLベースのツールであり、原則としてに近いツールですant
。
対照的に、ant
はJavaで構築されており、あらゆる場所で実行でき、プラットフォームに依存しない方法でファイルを操作してコマンドを実行するための「タスク」と呼ばれる内部ツールが含まれています。を使用するant
よりも、実際にWindowsでCプログラムを作成するほうが簡単なほど、用途は広いですmake
。
そして最後のマイナーなもの:
Cプログラムでさえmakeをネイティブに使用しない
最初はこれに気付かないかもしれませんが、Cプログラムには通常、が同梱されていませんMakefile
。それらは、実際のを生成するCMakeLists.txt
、またはbash
構成スクリプトとともに出荷されますMakefile
。対照的に、使用して構築されたJavaプログラムのソースは、事前に作成ant
されたant
スクリプトとともに出荷されます。A Makefile
は他のツールの製品です-それだけでmake
は、それだけでビルドツールになるのに不適切です。ant
スタンドアロンであり、追加の要件や依存関係なしに、Javaビルドプロセスに必要なすべてを扱います。
ant
任意のプラットフォームで実行すると、Just Works(tm)になります。あなたはそれを得ることができませんmake
。信じられないほどプラットフォームと構成に依存しています。
make
。また、1つのシステムでのみ機能するmakefileを使用することは、クロスプラットフォーム言語にはあまり適していません。