make ユーティリティは、大きなプログラムのうちどの部分を再コンパイルする必要があるかを自動的に判断し、そのためのコマンドを発行してくれるツールです。本マニュアルでは、その GNU 版である GNU make について説明します。GNU make はリチャード・M・ストールマンとローランド・マグラスによって実装され、バージョン 3.76 以降はポール・D・スミスが開発を引き継いでいます。
GNU make は IEEE Standard 1003.2-1992(POSIX.2)の 6.2 項に準拠しています。
本書の例では、もっとも一般的な言語ということで C 言語のプログラムを取り上げています。しかし make は、シェルコマンドから起動できるコンパイラを持つ言語であれば、どんな言語にでも使えます。いえ、そもそもプログラムに限った話ですらありません。「あるファイルが変更されたら、それに合わせて別のファイルを自動的に更新したい」——そういう作業であれば何にでも応用できます。
make を使う準備として、makefile と呼ばれるファイルを書く必要があります。これは、プログラムを構成するファイル同士の関係と、各ファイルを更新するためのコマンドを記述したファイルです。たとえば典型的なプログラムでは、実行可能ファイルはオブジェクトファイルから作られ、そのオブジェクトファイルはソースファイルをコンパイルすることで作られます。
適切な makefile さえ用意できれば、ソースファイルを書き換えるたびに、次のシンプルなシェルコマンドを打つだけで済みます:
make
これだけで、必要な再コンパイルがすべて実行されます。make は makefile というデータベースと、各ファイルの最終更新時刻をもとに、どのファイルを更新すべきかを判断します。そして更新が必要なファイルごとに、データベースに記録されたレシピ(recipe、ルールの実行内容)を発行します。
どのファイルをどのように再コンパイルするかは、コマンドライン引数を make に渡すことで制御できます。makeの実行方法の章を参照してください。
make に初めて触れる方や、まずは全体像をつかみたいという方は、各章の最初のいくつかの節だけを読み、後ろの節は飛ばして構いません。どの章も、はじめのほうの節は入門的・概略的な内容で、後ろの節ほど専門的・技術的な内容になっています。例外は第2章「Makefile入門」で、こちらは全体が入門的な内容です。
他の make プログラムに慣れている方は、まずGNU makeの機能の章をご覧ください。GNU make が備える拡張機能の一覧があります。あわせて非互換な点と未実装の機能の章では、他の make にはあるが GNU make にはない、ごくわずかな点について説明しています。
手っ取り早く要点を知りたいときは、オプションの一覧、クイックリファレンス、それから特別な組み込みターゲット名の項を見てください。
GNU make で問題に遭ったり、バグを見つけたと思ったときは、ぜひ開発者に報告してください。必ず対応できるとは約束できませんが、できることなら直したいと考えています。
バグを報告する前に、それが本当にバグなのかを確かめてください。ドキュメントをもう一度よく読み直し、自分がやろうとしていることが本当にできると書かれているかを確認しましょう。できるはずなのかどうかがはっきりしない場合は、その点も報告してください。それはドキュメントのバグだからです!
バグを報告したり自分で直したりする前に、問題を再現できるできるだけ小さな makefile にまで切り詰めてみてください。そのうえで、その makefile と、make が実際に出力した正確な結果(エラーや警告のメッセージも含めて)を送ってください。メッセージは言い換えず、報告にそのまま貼り付けるのが一番です。なお、この小さな makefile を作るときは、レシピの中で非フリーなツールや特殊なツールを使わないようにしてください。たいていの場合、そういったツールの動きは単純なシェルコマンドで代用できます。最後に、自分が何を期待していたのかも必ず書き添えてください。問題が本当にドキュメント側にあるのかを判断する手助けになります。
問題を正確につかめたら、次のいずれかの方法で報告できます。電子メールを次のアドレスへ送るか:
bug-make@gnu.org
あるいは、次の Web ベースのプロジェクト管理ツールを使ってください:
https://savannah.gnu.org/projects/make/
上記の情報に加えて、使用している make のバージョン番号も必ず添えてください。バージョンは make --version というコマンドで確認できます。また、使っているマシンの種類と OS も忘れずに書いてください。これらは make --help の出力の最後のほうを見ても分かります。
コードの変更を提案したい場合は、README ファイルの「Submitting Patches」の節を参照してください。
(訳注: 上記の連絡先は原文どおりの本家(GNU)宛です。バグ報告は英語で書くのが望ましく、翻訳文そのものの誤りを GNU に報告しないでください。訳に関するご指摘は ecoop.net までお願いします。)