makefile_bcc
makefile
コンソールよりバッチ的にファイルをビルドします。ファイルの更新日時を元にコンパイルする・しないも自動で行われるため便利です。
たとえば、簡単なコンソールアプリを作るでの「main.cpp」をコンパイル・リンクする作業をmakefileで記述してみます。
makefileのファイル名は「makefile.mak」としています。
# makefile.mak # 2004.09.05 - 2004.09.05 # Yutaka Yoshisaka CC = bcc32 LINKER = ilink32 INCLUDE = -I"i:\User\bcc program" LIB = -L"h:\program files\Borland\Bcc55\lib;i:\User\bcc program" #コンソールアプリケーションのためのコンパイルオプション CFLAGS = -O2 -w -tWC LFLAGS = /Tpe TARGET = main.exe OBJS = main.obj ALL : $(TARGET) # -- objファイルの作成 main.obj: main.cpp $(CC) $(CFLAGS) -c main.cpp # -- exeファイルの作成 $(TARGET): $(OBJS) $(LINKER) $(LFLAGS) $(LIB) $(OBJS) c0x32.obj,$(TARGET),,cw32.lib import32.lib clean: del *.obj del *.tds del *.il* del *.map
コメントは「#」から始まる行を示します。「#」以降がコメントになります。コンパイルとリンクは分けて処理し、コンパイルしてオブジェクトファイルを作成するツールは「bcc32.exe」、リンクするツールは「ilink32.exe」になります。
CC = bcc32 LINKER = ilink32
なお、「XXX = yyy」の部分は「yyy」の記述を「XXX」に置き換えていることをあらわします。実際の代入時は「$(XXX)」のように指定することになります。
includeファイルの検索位置を「i:\User\bcc program」、ライブラリの検索位置を「h:\program files\Borland\Bcc55\lib」と「i:\User\bcc program」としています。
INCLUDE = -I"i:\User\bcc program" LIB = -L"h:\program files\Borland\Bcc55\lib;i:\User\bcc program"
コンパイル時のコンパイラオプションとして「CFLAGS」を、リンク時のリンカオプションとして「LFLAGS」を定義しています。
CFLAGS = -O2 -w -tWC LFLAGS = /Tpe
「-O2」は速度優先で最適化、「-w」はコンパイル時の警告を表示、「-tWC」はコンソールアプリケーションの作成、を意味します。LFLAGSでの「/Tpe」はWindowsのEXEファイルを作成します。オプションの詳細は、BCCのヘルプファイルを参照してください。結構詳しく乗ってます。
「TARGET」は最終的に作成するEXEファイル名の指定、「OBJS」はEXEファイル作成時のオブジェクトファイルを(複数ある場合は)スペースで区切りながら列挙します。
TARGET = main.exe OBJS = main.obj
「ALL : EXEファイル名」にて、ビルド対象のEXEファイルを列挙します。複数のEXEをビルド時はスペースで区切って指定します。(※「:」とEXEファイル名の間は必ずスペースを1つ以上空けるようにしてください。そうしないとエラーになります)
ALL : $(TARGET)
「xxx.obj: xxx.cpp」とすることで、ファイル更新日付が右(xxx.cpp)のほうが新しい場合に次の行の処理を実行します。なお、次の行ではスペースを1つ空けてから記述します。「$(CC) $(CFLAGS) -c main.cpp」はmain.cppをコンパイルしてmain.objを作成する処理に値します。(※「:」とxxx.cppの間は必ずスペースを1つ以上空けるようにしてください。そうしないとエラーになります)
main.obj: main.cpp $(CC) $(CFLAGS) -c main.cpp
複数のソースファイルをコンパイルしてobjを作成する場合は、この記述を複数行います。
最後にobjファイルの日付がEXEファイルよりも新しい場合はリンク処理を行います。以下はコンソールアプリの場合の例ですが、Windows GUIの場合はobjとライブラリのリンクが若干変化します。
$(TARGET): $(OBJS) $(LINKER) $(LFLAGS) $(LIB) $(OBJS) c0x32.obj,$(TARGET),,cw32.lib import32.lib
「c0x32.obj」はコンソール用のスタータ機能を提供(BCCに付属のもの)、「cw32.lib」はWindowsアプリを実装するために必要なライブラリ、「import32.lib」はWindowsAPIを呼び出すのに必要なライブラリです(ともにBCCに付属のもの)。
リンカオプションやオブジェクトファイルはスペースで区切りながら指定し、コンマの後にEXEファイル名を記述します。その後、コンマを2つつけてから「cw32.lib import32.lib」のようにライブラリを列挙します。
「clean:」の記述は、メイクファイルを「make」で指定する場合に「clean」を最後につけると、この処理が行われます。ここでは、作業用のファイルを削除しています。
clean: del *.obj del *.tds del *.il* del *.map
コンソールでは以下のように指定することになります。
make -f makefile.mak clean
makefileの実行
以上、make処理はコンソールにて「make」で行います。
make -f makefile.mak
これで、問題なければobjファイルを作成後にexeファイルができます。1つのソースをビルドする場合はあまり便利に思えないかもしれませんが、複数をビルドしたりライブラリをリンクしたり、となるとmakefileは重宝することになります。
Future's Laboratory 技術格納庫 2004-2013 Yutaka Yoshisaka.