9.プリプロセッサとメイクファイル

9-7. メイクファイルのマクロ

前回、書いたメイクファイル(LSI-C用)をBCCやGCCでコンパイルしようとするとかなり変更箇所があります。

そこで、変更箇所を最小限にできるように同じような記述の部分を省略できる部分は省略し、マクロを定義する事によって一括変更できるようにします。

プログラムの構成:
   ┌────┐┌────┐
   │file2.h ││file3.h │
   └────┘└────┘
    /  \  /  \
┌────┐┌────┐┌────┐
│file1.c ││file2.c ││file3.c │
└────┘└────┘└────┘

メイクファイル:
file.exe : file1.obj file2.obj file3.obj
lcc -o file.exe file1.obj file2.obj file3.obj

file1.obj : file1.c file2.h
lcc -c file1.c

file2.obj : file2.c file2.h file3.h
lcc -c file2.c

file3.obj : file3.c file3.h
lcc -c file3.c

まずこのメイクファイルの中でソースファイルとオブジェクトファイルの名前が同じ時(拡張子は省く)はコンパイルの定義しなくてもソースをを探し当てコンパイルしてくれます。

file1.obj を作る定義が無いときは file1.c を探してコンパイルします。

そのかわり、ヘッダーとの依存関係だけ定義する必要があります。
(さすがに、そこまでは理解できないから)

file1.obj : file2.h

file2.obj : file2.h file3.h

file3.obj : file3.h

また依存関係がまったく同じならさらにまとめる事ができます。

file1.obj : header.h

file2.obj : header.h

の場合、

file1.obj file2.obj : header.h

とできる。

次に、マクロ定義。
マクロ定義を使えば何度も記述する部分を短縮し、変更があった時も定義だけ更新すればよいのでメイクファイルの管理が簡単になります。

まず、環境によって違うのはコンパイラ。ということでコンパイラをマクロに定義します。

CC = lcc

そして、コマンド行は
$(CC) -o file.exe file1.obj file2.obj file3.obj

となります。違うコンパイラを使う時は cc = の右側だけ変更すれば済みます。

そして今度はオブジェクトファイル

OBJECT = file1.obj file2.obj file3.obj

とすれば、

file.exe : $(OBJECT)
$(CC) -o file.exe $(OBJECT)

になります。あと定義するとしたら実行ファイルの名前。

DOS/Windows では拡張子に exe を付けますが他のOSでは exe を付ける事はまずありません。よってココも定義する価値があります。

TARGET = file.exe

$(TARGET) : $(OBJECT)
$(CC) -o $(TARGET) $(OBJECT)

※おまけ
# は行末までのコメント記号として使えます。
 ただし、コマンドラインの行とマクロ定義の行では利用できません。

よって最終的にメイクファイルは
# Makefile
CC = lcc
TARGET = file.exe
OBJECT = file1.obj file2.obj file3.obj

# コメントです。
$(TARGET) : $(OBJECT) # 下のエコーで make が動作している事を表示
@echo “*** Making $(TARGET) ***”
$(CC) -o $(TARGET) $(OBJECT)

file1.obj : file2.h
file2.obj : file2.h file3.h
file3.obj : file3.h

となりました。

make についてはまだまだたくさんあります。一種のスクリプト言語のような深いものなのでとてもではないですが私の能力ではカバーしきれないところがあります。(普段VC++を利用していて make を使う事が無いのも一理あり)

また、C言語の学習ならばこの程度でも大丈夫という妥協も入っています。