ものづくりのブログ

うちのネコを題材にしたものづくりができたらいいなと思っていろいろ奮闘してます。

GNU Make - Makefile のルールをまとめてみる

アプリの初期構築を Makefile を使って作成してましたが、ルールをすぐに忘れてしまうためここにメモしておきます。

Makefile とは

makeコマンドを実行した時に、コンパイル、リンク、インストール等の実行方法を記載するようなファイルが Makefile です。

基本

コメント

Makefile は,#から行末までがコメントです。

#
# コメント記入
#

改行

ある1行のコマンドを改行したい場合はバックスラッシュを使って分けることができます。

以下のように記述の場合

echo Hello World \
> hello.txt

make は改行を無視して以下のように解釈します。

echo Hello World > hello.txt

ルール

Makefile のルールは,次のような構造になっています。

target(ファイル名) :[prerequisites(前提条件)]
  recipe(コマンド行)

ルールの中にある[ファイル名]のことをターゲットと呼びます。
前提条件は省略可能です。
recipe にはタブ1文字を入れることが必要です。

名前 説明
target プログラムによって生成されるファイルの名前
prerequisites ターゲットを作成するための入力として使用されるファイル
複数ファイルも可
省略可
reciperecipe makeが実行するアクション
複数行可(行を分割する場合は\を使う)
行頭にタブ文字必須

タスク

ターゲットとして,実際に存在しないファイル名を指定することができます。
擬似ターゲットと呼んだり,ダミーターゲットと呼ばれたりしているようです。
タスクターゲットは,ある特定のファイルを作るためではなく,作業を行うコマンドとして利用したい場合に用いられます。

.PHONY: [実行したいタスク名]

[実行したいタスク名]:
	[そのタスクを行うためのコマンド行]

.PHONYは,タスクターゲットを宣言するためのターゲットです。

変数

変数の呼び出し

変数の呼び出しは以下のようなイメージです。

$(name)

ルール内で機能する自動変数

自動変数とはターゲットと前提条件を呼び出すときに使用できる記法です。省略形として使えるだけではなく、条件に合わせて、必要なものだけ参照する機能を持つものもあります。

自動変数 機能
$@ ターゲット名
$ 依存関係の最初の名前
$^ ターゲットのすべての依存関係の名前
$? ターゲットよりタイムスタンプが新しい依存関係の名前
$+ ターゲットの全ての依存関係の名前
$* ターゲットのパターンマッチに一致した部分

Makefileのデバッグ方法

  • n オプションを使用するとMakefileのコマンドを実行せずに出力します。
# ===Makefileの定義===
# CC = gcc
# OBJ = hoge.c
# CFLAGS = -c $(OBJ)
# ===================

$ make -n
gcc -c hoge.c -o hoge