!!!makefile コンソールよりバッチ的にファイルをビルドします。 ファイルの更新日時を元にコンパイルする・しないも自動で行われるため 便利です。 たとえば、[[簡単なコンソールアプリを作る|簡単なコンソールアプリを作る_bcc]] での「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は 重宝することになります。