気の向くままに辿るIT/ICT/IoT
UNIX/Linux

UNIX/Linuxコマンド make

ホーム前へ次へ
UNIX/Linuxのmakeコマンドとは?

UNIX/Linux makeコマンドとmakefile/Makefile

makeコマンド

 UNIX/Linux及びシェルにおいてmakeコマンドとは、makefileに書かれたルールを実行するコマンドです。

 makeはそれだけがその持てる機能ではありませんが、configure(あらゆる環境でmakeが利用できるようにする為のソフトウェアautoconfによって作成できるshスクリプト)と併用してOSを含め、アプリケーションのインストール時の環境構築用自動セットアッププログラムのようにも使われますし、特定の環境下ではmakeだけで個人ベースから大規模なシステム開発プロジェクトに至るまでファイル管理とコンパイル作業を自動化し、大幅な時間短縮に貢献するという側面も持つUNIX/Linux、そしてシェル環境において最も効率的且つ有用なコマンドの1つでもあります。

makeとgmake

 伝統的なUNIXにはmakeが、Linuxを含むその派生ディストリビューションにはmakeとFSFのGNUが開発したgmake(GNU make)が採用されていることが多いと思われます。

 いずれの場合もmakeコマンドの実行は、たいてい

 make  

 make ターゲット 

 make -f original_makefile 

のいずれかです。

makefileとMakefileとGNUmakefile

 伝統的なUNIXのmakeは、デフォルト(既定)では実行時に検索パス上(基本的にカレントディレクトリ)にある

 makefile、Makefileの順に検索 

しますが、gmakeは、

 GNUmakefile、makefile、Makefileの順に検索 

します(BSDにもBSDmakefileを既定の探索に含めるものもあるようです)。

 ただでさえmakeも環境によっていろいろあります(バージョン確認も-v/-V/-version/--version...etc.)から汎用性を考えると敢えて環境依存したいなど利用する理由がなければGNUmakefileにこだわる必要はないでしょう。

makefileとMakefile

 というわけでmakeする際に利用するのはmakefileかMakefileのいずれかお好みの方ということになりますが、業務プロジェクトなどではMakefileを推奨しているところも結構あるように思われます。

 おそらくこれは、UNIX/Linuxのベースがアルファベット小文字であり、環境変数などのように大文字にすることで明瞭化できるということもあり、頭文字だけとはいえ、makefileよりもMakefileの方が、他のファイルと区別しやすいということからでしょう。

 その背景にはmakeはコンパイルや複数のディレクトリ内のファイルを一括削除するようなルールを記述することは極一般的なので大変なことになる可能性ということも懸念されるからでしょう。

 ここではmakefileの方を使用しますが、Makefile派の場合は適宜読み替えてください。

makefileの特徴

 makefileの魅力の1つは、それが単なるテキストファイルであることで、UNIX/Linuxでは極めて普通のことではありますが、強いて言えば同じテキストファイルであり、コンパイル不要のインタプリタスクリプトと似ていると考えてもよいかもしれません。

 コンパイル作業の自動化という前提でmakefileを書くにあたってmakefileの性質を理解しておくのは重要な第一歩。

 その大きな特徴は3点で、makefileは、

 1.「依存関係」 

を見て

 2.「(複数の)元ファイルと作成するファイルの更新日時を勘案、必要なファイルのみコンパイル」 

し、それを活かす為の

 3.「ルール」 

をmakefileの少ない規則を守りながら記述します。

 ちなみに何らかのプロジェクトに参加していて既にホームディレクトリ作業ディレクトリにmakefileがある場合、往々にしてそれだけで用をなすように書かれている場合もあります。

makefileの記述内容と記述方法

 makefileの記述内容は、極めてシンプルで

 * つまるところファイルの依存関係と必要なコマンドを書く 

のたった1つでmakefileの記述方法も、かなりシンプルで

 * 空白を入れずにターゲットをTARGET:とコロンを付けて書く 

 * コロンに続けてTARGETに依存するファイルやターゲットを書く 
    実は省略も可(だからフォニーターゲットとしても使える*後述)

 * 必要に応じて改行、1つのタブの後TARGETごとのコンパイルコマンドを書く 
    強いて言えばあらゆるUNIX・Linuxコマンド、当然makeコマンドも記述可
    もちろん必要なければ書かなくてもよいし、複数あれば複数記述できる

 * コマンドを書く行の先頭は、誰が何と言おうと必ず絶対どうしても
    「1つのタブ」で始めなければならない 
    間違えて空白にしようもんなら後で泣きを見る(意外と気付かない)

というわけで実際にmakefileを作成してみましょう。

LINK

ホーム前へ次へ