UNIX/Linux及びシェルにおいてmakeコマンドとは、makefileに書かれたルールを実行するコマンドです。
makeはそれだけがその持てる機能ではありませんが、configure(あらゆる環境でmakeが利用できるようにする為のソフトウェアautoconfによって作成できるshスクリプト)と併用してOSを含め、アプリケーションのインストール時の環境構築用自動セットアッププログラムのようにも使われますし、特定の環境下ではmakeだけで個人ベースから大規模なシステム開発プロジェクトに至るまでファイル管理とコンパイル作業を自動化し、大幅な時間短縮に貢献するという側面も持つUNIX/Linux、そしてシェル環境において最も効率的且つ有用なコマンドの1つでもあります。
伝統的なUNIXにはmakeが、Linuxを含むその派生ディストリビューションにはmakeとFSFのGNUが開発したgmake(GNU make)が採用されていることが多いと思われます。
いずれの場合もmakeコマンドの実行は、たいてい
make
make ターゲット
make -f original_makefile
のいずれかです。
伝統的なUNIXのmakeは、デフォルト(既定)では実行時に検索パス上(基本的にカレントディレクトリ)にある
makefile、Makefileの順に検索
しますが、gmakeは、
GNUmakefile、makefile、Makefileの順に検索
します(BSDにもBSDmakefileを既定の探索に含めるものもあるようです)。
ただでさえmakeも環境によっていろいろあります(バージョン確認も-v/-V/-version/--version...etc.)から汎用性を考えると敢えて環境依存したいなど利用する理由がなければGNUmakefileにこだわる必要はないでしょう。
というわけでmakeする際に利用するのはmakefileかMakefileのいずれかお好みの方ということになりますが、業務プロジェクトなどではMakefileを推奨しているところも結構あるように思われます。
おそらくこれは、UNIX/Linuxのベースがアルファベット小文字であり、環境変数などのように大文字にすることで明瞭化できるということもあり、頭文字だけとはいえ、makefileよりもMakefileの方が、他のファイルと区別しやすいということからでしょう。
その背景にはmakeはコンパイルや複数のディレクトリ内のファイルを一括削除するようなルールを記述することは極一般的なので大変なことになる可能性ということも懸念されるからでしょう。
ここではmakefileの方を使用しますが、Makefile派の場合は適宜読み替えてください。
makefileの魅力の1つは、それが単なるテキストファイルであることで、UNIX/Linuxでは極めて普通のことではありますが、強いて言えば同じテキストファイルであり、コンパイル不要のインタプリタなスクリプトと似ていると考えてもよいかもしれません。
コンパイル作業の自動化という前提でmakefileを書くにあたってmakefileの性質を理解しておくのは重要な第一歩。
その大きな特徴は3点で、makefileは、
1.「依存関係」
を見て
2.「(複数の)元ファイルと作成するファイルの更新日時を勘案、必要なファイルのみコンパイル」
し、それを活かす為の
3.「ルール」
をmakefileの少ない規則を守りながら記述します。
ちなみに何らかのプロジェクトに参加していて既にホームディレクトリや作業ディレクトリにmakefileがある場合、往々にしてそれだけで用をなすように書かれている場合もあります。
makefileの記述内容は、極めてシンプルで
* つまるところファイルの依存関係と必要なコマンドを書く
のたった1つでmakefileの記述方法も、かなりシンプルで
* 空白を入れずにターゲットをTARGET:とコロンを付けて書く
* コロンに続けてTARGETに依存するファイルやターゲットを書く
実は省略も可(だからフォニーターゲットとしても使える*後述)
* 必要に応じて改行、1つのタブの後TARGETごとのコンパイルコマンドを書く
強いて言えばあらゆるUNIX・Linuxコマンド、当然makeコマンドも記述可
もちろん必要なければ書かなくてもよいし、複数あれば複数記述できる
* コマンドを書く行の先頭は、誰が何と言おうと必ず絶対どうしても
「1つのタブ」で始めなければならない
間違えて空白にしようもんなら後で泣きを見る(意外と気付かない)
というわけで実際にmakefileを作成してみましょう。