開発効率化3:自動コンパイル

前回,プログラミング作業の効率化のためソースファイルを分割したが, かえってコンパイル作業が面倒なことになっていた. そこで今回は,makeコマンドを利用し,分割コンパイルを自動化しよう.

教科書の該当範囲:なし
参考書の該当範囲:なし

コンパイルの自動化

基本的な技については, とりあえず こちら (昨年度の授業内容)を参考に学習してください.


Makefile の技

複数のオブジェクトの生成を1個のコンパイルコマンドに統合

...

.SUFFIXES: .c .o
.c.o:
	cc  -c  $<  -Wall	# ファイル.c から ファイル.o を作る共通のコマンド

file1.o: file1.c hdr1.h

file2.o: file2.c hdr2.h

...

ついでに,ファイル間の依存関係の記述が面倒なので, 自動生成してしまおう:

$ cc  -MM  *.c
file1.o: file1.c hdr1.h
file2.o: file2.c hdr2.h
...

$ cc  -MM  *.c  >>  Makefile

複数のプログラムをまとめて1回でコンパイル

.PHONY: all ...

all:  プログラム1  プログラム2  ...

プログラム1:  オブジェクト11.o  オブジェクト12.o ...
	cc  ...  -o  プログラム1

プログラム2:  オブジェクト21.o  オブジェクト22.o ...
	cc  ...  -o  プログラム2

...
$ make  all

なお,引数なしで make コマンドを実行すると, Makefile 内の最初のターゲットを生成しようとする. というわけで,all ターゲットについては, Makefile の先頭あたりに最初のエントリとして書いておくと良い. また,プログラムが1個だけの場合でも,all を書いておくと良い.

配布用圧縮ファイルを生成

...

.PHONY: distclean dist ...

distclean: ...
	-rm ...

dist: distclean
	( cd  ..; tar  zcvf  ファイル.tgz  ディレクトリ )

混乱を避けるため,tgz のファイル名とディレクトリ名とは同じものにしておくと良い.

$ make  dist
...
$ ls  ..
ディレクトリ/
ファイル.tgz
...

コマンドtar の使用方法:


本日の課題

前回の練習問題の成果物 pendraw/ (2個のプログラム pendrawpdcl のソースファイルを含むディレクトリ) に対して, Makefile を作成せよ.

実行例:

$ ls
pendraw/
...
$ cd  pendraw/

$ make  distclean
rm  *.o
rm  pdcl  pendraw
$ ls
Makefile
img.c	img.h
main.c
pdcl.c
pen.c	pen.h

$ make  all
...
$ ls
Makefile
img.c	img.h	img.o
main.c	main.o
pdcl
pdcl.c	pdcl.o
pen.c	pen.h	pen.o
pendraw

$ make  distclean
$ make  pdcl
$ ls
Makefile
img.c	img.h
main.c
pdcl
pdcl.c	pdcl.o
pen.c	pen.h

$ make  distclean
$ make  pendraw
$ ls
Makefile
img.c	img.h	img.o
main.c	main.o
pdcl.c
pen.c	pen.h	pen.o
pendraw

$ make  dist
$ cd  ..
$ ls
pendraw/
pendraw.tgz
...
えーと,pdcl は分割していないので, pdcl.o は作らない流儀でも OK.

提出:


(c) 2018, yanagawa@kushiro-ct.ac.jp