メイクファイル / Makefile
Makefileとは
Makefileは、複数のソースコードから構成されるプログラムをコンパイルするために、手順や関連ファイルを記述するファイル。
makefileが存在するディレクトリ内において、makeコマンドを実行することでMakefileの記述に基づいてソースコードがコンパイルされ、実行ファイルが生成される。
その都度、コンパイルのオプションなどを指定する手間を省くための手段。
メイクファイルにコンパイル方法を指定することができる。
メイクファイルを作成すれば、「make」コマンドを入力するだけで、指定したコンパイルが実行される。
メイクファイルの名前
コマンドが検索する順
- GNUmakefile
- makefile
- Makefile
makefileの種類
- Microsoft nmake (Windows)
- Borland make (Windows)
- GNU make (windows, UNIX 系)
- Solaris make (Solaris)
makeコマンド
nmake |
Visual C++のmakeコマンド
VisualC++のコマンドプロンプトで利用する「make」コマンド
オプション
- 「/NOLOGO」 ----- Microsoft のロゴ表示を抑制する。
- 「-a」 ----- リビルドに相当。
|
make |
makeは、依存関係のある複数のソースコードを一元的に一括してプログラムを生成するための仕組みを提供するプログラム。
Makefileと同じディレクトリに移動して「make」を実行。
|
make -f GNUmakefile |
メイクファイルを指定してのメイク
|
makeコマンドを実行するとMakefileが読み込まれる。
Makefileファイルに記述された実行規則に従ってコンパイル処理を実行する。
Makefileの作り方
ファイル名:「Makefile」
Makefile保存場所:ソースコードと同じディレクトリ
ルール
Makefile書式
ターゲット:依存ファイル、もしくは、ターゲット名
コマンド
- ターゲットとは
-
処理を行うために識別子を記述。
「make ターゲット」とコマンドライン入力することにより、ターゲットの選別も可能。
依存ファイルを指定する場合、ファイル名だけでも良いが、拡張子を含めた依存ファイル名を記述することも可能。
「ターゲット:別ターゲット名 別ターゲット名」と指定することにより、複数のターゲットの処理を同時に指定することができる。詳しくは、「タスク」を参照。
複数の依存ファイル・ターゲットを指定する場合は、「半角スペース」で区切る。
- コマンドとは
-
ターゲットが選択された際に、実行される処理内容。
コマンドは複数行を記述することも可能。
コマンド行の始まりは必ず「tab」指定。
コメント
Makefile内にコメントを記述する場合は、行頭に「#」を記述する。
# Hello Worldを出力する
all:
@echo Hello World!
記入例
ファイルを作成して、そのファイルに「message」というテキストを記述する。
all: a b
a:
touch a.txt
b:
echo message > b.txt
- 「all」=ターゲット
- 「a」=依存ファイル(タスク)
- 「b」=依存ファイル(タスク)
タスク
ターゲットとして、生成するファイルの識別子ではなく、作業を行うためのコマンド識別子を記述することが可能。
実際に存在しないファイル名を指定するので、「擬似ターゲット」「ダミーターゲット」と呼ばれもする。
「.PHONY」は,タスクターゲットを宣言するためのターゲット。
「phony」とは「偽の、まやかしの」という意味。
タスクターゲットは「.PHONY」ターゲットを使わず作ることもできます。
タスク名と同名のファイルやディレクトリがある場合に正常処理ができない可能性がある。
「.PHONY」というタスクターゲットを積極的に記述する方が良い。
記入例
.PHONY: タスク名
タスク名:依存ファイル
タスクを行うためのコマンド
複数のターゲットを1つのターゲットとして扱う場合、コマンド行を記述しないターゲットを定義することが可能。
「;」は、依存ターゲットとコマンド行のセパレータの意味する。
下記は、「clean」と「build」を行うことを定義。
.PHONY: rebuild
rebuild: clean build ;
分割 Makefile
プログラムが複雑になって, ディレクトリごとにソースコードを分けるなどしていくと, 一つの Makefile で管理するのは面倒になってくる. そんな時には, Makefile を分割することができる. 例えば, subdir というサブディレクトリの中に別の Makefile があるとした場合, カレントディレクトリの Makefile で:
subsystem:
cd subdir && $(MAKE)
または
subsystem:
$(MAKE) -C subdir
とする.
ターゲットの依存関係
ターゲットの依存関係とは、ターゲットを構成するために必要な部品となるターゲットを明記することで、ターゲット間の依存関係を解決して処理を行うことをいう。
makeコマンドは、ターゲットの更新日時を比較してコマンド行を実行すべきかどうかということを判断する。
makeコマンドを実行しても、依存ファイル等の更新日時が、出力した結果ファイルの更新日時より古い場合、makeコマンドは実行されない。
ターゲット: 依存ターゲット
コマンド
依存ターゲット:依存ファイル
コマンド
Makefile効率化
固定文字列を変数として定義し、Makefile内で変数として利用することができる。
マクロ
- マクロ定義
- マクロ名 = 値
- マクロの取り出し(変数の取り出し方法
-
$(マクロ名)
${マクロ名}
内部マクロ名 |
説明 |
$@ |
ターゲット名 |
$% |
ターゲットメンバ名
ターゲット名が「edajima.a(momo.o)の場合
$@=「edajima.a」
$%=「momo.o」
|
$< |
依存ファイルの先頭のファイル名 |
$? |
依存ファイルのうち、ターゲットより新しいファイルのリスト |
$^ |
依存ファイルのリスト |
$+ |
|
$* |
|
GNU make では, 定義済みマクロ
マクロ名 |
文字列 |
説明 |
AR |
ar |
アーカイブユーティリティ |
AS |
as |
アセンブラ |
CC |
cc |
Cコンパイラ |
CXX |
g++ |
C++コンパイラ |
CO |
co |
RCSファイルからリビジョンをチェックアウトする |
CPP |
$(CC) -E |
Cプリプロセッサ |
FC |
f77 |
Fortranコンパイラ |
GET |
get |
|
LEX |
lex |
lex |
PC |
pc |
pascalコンパイラ |
YACC |
yacc |
yacc |
YACCR |
yacc -r |
|
MAKEINFO |
makeinfo |
texinfo -> Info |
TEX |
tex |
Tex |
TEX12DVI |
tex12dvi |
Texinfo -> DVI |
WEACE |
weave |
|
CWEAVE |
cweave |
|
TANGLE |
tangle |
|
CTANGLE |
ctangle |
|
RM |
rm -f |
ファイルの削除 |
再定義可能なマクロ
マクロ名 |
文字列 |
説明 |
ARFLAGS |
rv |
ARの引数 |
ASFLAGS |
|
ASの引数 |
CFLAGS |
|
CCの引数 |
CXXFLAGS |
|
CXXの引数 |
COFLAGS |
|
COの引数 |
CPPFLAGS |
|
CPPの引数 |
FFLAGS |
|
FCの引数 |
GFLAGS |
|
GETの引数 |
LDFLAGS |
|
リンカIDの引数 |
LFLAGS |
|
LEXの引数 |
PFLAGS |
|
PCの引数 |
RFLAGS |
|
|
YFLAGS |
|
YACCの引数 |
自動変数
自動変数は、ターゲットや依存関係に基づいて値が計算・定義される変数。
$@ |
当該ルールのターゲット名
|
$? |
ターゲットより更新時刻が新しいすべての依存ターゲット名
|
$% |
ターゲットがアーカイブメンバだったときのターゲットメンバ名
|
$* |
サフィックスを除いたターゲット名
|
$< |
依存ターゲット名の先頭要素。
|
$^ |
すべての依存ターゲット名
|
$+ |
Makefileと同じ順番の依存するファイルの名前
|
サフィックスルール
サフィックスとは拡張子の意味で、ファイルの拡張子に反応して、自動的に生成コマンドを適用するルールをサフィックスルールという。
例えば「.c.o: 」というターゲットは、「.o」ファイルが必要になれば、これを「.c」ファイルからつくるというルールであり、C言語では必ず「.c」から「.o」ファイルが作られるということをルール化したもの。
自動変数である「$<(先頭の依存ターゲット)」とセットで使用する。
記述例
CC = gcc
.c.o:
$(CC) -c $< いつでもこのコマンドを使うこと