ソースファイルがたくさんになって来ると、コンパイル&リンク作業を 行なうのが複雑になって来る。この負担を軽減してくれるのが makeユーティリティである。make はプログラムを作る 過程で必要になったり、作成されたりするファイルの依存関係を元に、 各ファイルの更新時刻に応じて、その場その場で必要なコマンドを起動する。
2つのソースファイル main.c
と sub.c
から、
1つの実行ファイルmain
を作るときの依存関係は以下のようになる。
材料となるファイル | その成果物 |
---|---|
main.c | main.o |
sub.c | sub.o |
main.oとsub.o | main |
文章の形でまとめると、
main
だ
main
は、main.o
と sub.o
から作られる
main.o
は main.c
から作られる
sub.o
は sub.c
から作られる
上記の依存関係をmakeに教えておくと、makeを起動したときに適切な処理を
行なってくれる。makeに依存関係を教えるには作業ディレクトリに
Makefile
というファイルを置き、そこに依存関係を記述する。
Makefile
には、依存関係と作り方を以下の様式で列挙する。
ターゲット: 依存ファイル(群…)|
<TAB空白> それを作るためのコマンドライン
ターゲットとは別のファイルに何かの処理をして作られる目的となる
ファイルである。今回の main.c, sub.c
からできる依存関係を
Makefile
に記述すると以下のようになる。
#
# Makefile for main program
#
all: main
main: main.o sub.o
gcc -o main main.o sub.o
main.o: main.c
gcc -c main.c
sub.o: sub.c
gcc -c sub.c
注意
all
というターゲットを書き、
最終ターゲットをその右辺に書く
このような Makefile
を用意したら、make
コマンドを起動する。make
は、
% make ターゲット
という書式で起動する。make
は、指定されたターゲット
とその右辺に書かれた依存ファイル(群)のどちらが新しい(最近更新された)ファ
イルかを調べ、依存ファイルの方が新しい場合、ターゲットも更新が必要だと
判断し、次の行から始まるコマンドラインを起動する。上記の Makefile
で例を示すと、
make main
と起動された場合、make
は、Makefile
の
main: main.o sub.o
gcc -o main main.o sub.o
の部分に着目する。左辺に書かれたターゲットのmain
ファイルよりも、右辺に書かれた main.o sub.o
の方が
タイムスタンプが新しかったら次の行に書いてある
gcc -o main main.o sub.o
を実行する。ただし、その前に main.o sub.o
自体に関する依存関係も調べる。つまり、
main.o: main.c
gcc -c main.c
sub.o: sub.c
gcc -c sub.c
の部分を見て、
main.o
より main.c
のほうが新しければ
gcc -c main.c
を起動する
sub.o
より sub.c
のほうが新しければ
gcc -c sub.c
を起動する
という処理を適切に判断して行なう。以上のことから、もし
sub.c
を修正保存した場合に、make
を起動すると
gcc -c sub.c gcc -o main main.o sub.o
を連続して起動して、実行プログラム main
を作成してくれる。
make
起動時に、「ターゲット」を省略すると最初に書かれ
たターゲットを作るように動作するので、all:
ターゲットを
書いておくようにすれば、普段は
make
とだけ打てば必要なコマンドを起動してくれるので楽ができる。
make
では、デフォルトでは必ず Makefile
とい
うファイルを依存関係登録ファイルとして参照するので、make
を利用してコンパイルを行なう場合には作りたいものに対して一つの
ディレクトリを作成するようにする。したがって、今後何かのプログラムを
作るときにはその都度ディレクトリを作成し、そこに Makefile
を作成する。
mkdir newProject
cd newProject
(Makefileとソースファイルを作成)
make
以上のような流れで作業することになる。
ターゲットの右辺に書くべき依存ファイルを省略すると、次の行に書かれた コマンドを必ず起動するようになる。
慣習的に、clean
というターゲットを書くことが多い。
main: main.o sub.o
gcc -o main main.o sub.o
main.o: main.c
gcc -c main.c
sub.o: sub.c
gcc -c sub.c
clean:
rm -f *.o main
上記のような Makefile
を用意し、
make clean
と起動すると、必ず rm -f *.o main
を起動する。
rm
はファイルを消すコマンドで、-f
オプションを
付けると、そのファイルがなくても文句をいわず黙って消す。
C言語プログラミングでは、ソースプログラムさえ書いておけば
オブジェクトファイル(*.o
) や実行ファイルはいつでも作ること
ができるので、用が済んだらソース以外のものを消しておく方が節約になる。
そのほか、良く使うコマンドラインを Makefile
に
登録しておくと便利である。
例:
backup:
gtar zcf backup.tar.gz *.c
上記の例では、カレントディレクトリの *.c
ファイル全てを
圧縮して backup.tar.gz
ファイルにバックアップする。