トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

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.