make入門 #3 自動変数とパターンルール

前回(make入門 #2 複数のルール)は、複数のルールからなるMakefileについて説明しました。 その際に気づいた方もいるかもしれませんが、ファイル名などが反復して使用されています。 今回は、反復した記述を少なくし、よりシンプルにMakefileを記述するための機能である自動変数とパターンルールを説明します。

自動変数を使って記述

以下は前回のMakefileです。
prog2: main.o sub.o
        gcc -o prog2 main.o sub.o

main.o: main.c sub.h
        gcc -c -o main.o main.c

sub.o: sub.c sub.h
        gcc -c -o sub.o sub.c
これを自動変数を使うと次のように記述することができます。$@$^のように$から始まる単語が自動変数です。 それぞれの意味を下の表に示します。
prog2: main.o sub.o
        gcc -o $@ $^

main.o: main.c sub.h
        gcc -c -o $@ $<

sub.o: sub.c sub.h
        gcc -c -o $@ $<
自動変数 説明
$@ ターゲット(入力)ファイル(コロンの左側)
$^ すべての依存(出力)ファイル(コロンの右側のファイル全て)
$< 最初の依存ファイル(コロンの右側の最初のファイル)
このMakefileをカレントディレクトリに配置してmakeを実行すると以下のように自動変数が、具体的なファイル名に置換されて実行されていることが分かります。
$ make
gcc -c -o main.o main.c
gcc -c -o sub.o sub.c
gcc -o prog2 main.o sub.o

パターンルール

上記の自動変数を使ったMakefileでmain.oとsub.oを作成するコマンドが同じになっています。ソースコードが増えていっても、同様の記述になるでしょう。 Makefileは、*.cから*.oを作成するような同じコマンドになるルールを共通化する仕組みを持っています。この仕組みをパターンルールと呼びます。 パターンルールを使って、記載したMakefileの例を以下に記載します。
prog2: main.o sub.o
        gcc -o $@ $^

%.o: %.c
        gcc -c -o $@ $<

main.o: main.c sub.h
sub.o: sub.c sub.h

青字で示した%.o: %.cという行があります。これは、*.cから*.oを作るルールという意味です。 そのコマンドとして、gccを使ったコンパイル処理が記述されています。ここでの$@$<は 実際のファイルに置換されるため、自動変数を使うとファイル名だけ異なる類似の処理をひとつのコマンドとして記載できます。

また、main.oとsub.oのルールにはコマンドがありません。具体的なコマンドはパターンルールで定義してあるため、 ここでは入出力(依存)関係のみを記述すればよくなります。

まとめ

本記事では、自動変数とパターンルールについて説明しました。

以下には、make入門の全記事がリストアップされています。

0 件のコメント: