コンパイラと言っても、コンパイラ本体を造る(造れるか!!そんなもの[怒])訳ではなくて、コンパイラを起動するプログラムを造ろうって事である。CWCCは、元々HelloWorldを10行以内で書く事を当初の目的にしているので、最初から分割コンパイルを念頭に置いたCoolLibとは違うのだ。これをやっておかないと、結局、『WindowsアプリのHelloWorldは結局10行以下では無理!』と言われてしまうのだ。
- 改善すべき点
さて、作業フォルダに、test.cppが有ったとしよう。基本的には、コマンドラインにて、
と打ち込めば、test.exeが生成される様にしたいのである。必要なファイルを同じフォルダに用意して、makefileを書き換えて…では、いけないのである。
勿論,ユーザ側のプログラムが、既に複数のファイルであり、分割コンパイルが必要な場合は、当然makefile等によるビルドを考えるであろうから、このコンパイラは必要無いのである。後々、サンプル等でどの様にコンパイルするべきかは説明するつもり
- さて、どうすれば?
簡単に言ってしまおう!BC++という開発環境が既にインストールされていると考えれば、こいつの考え方は至って簡単である。上記の様に実行された場合、
- パッケージデータファイルから、CWCC.obj,CWCC.h,CWCC.rc,CWCC.rhを切り出して、作業フォルダにセーブする。
- もし、作業フォルダに、CWCC.icoが無ければ、パッケージデータファイルから切り出して、作業フォルダにセーブする。
- 指定された、ターゲットファイル名を埋め込んで、MAKEFILEを生成する。
但し、MAKEFILEが既に在る場合はバックアップ(ファイル名を変更)する。
- SHELLでMAKEを実行する。
- 作成したファイルを消去し、MAKEFILEをバックアップしていれば、ファイル名を変更して元に戻す。
- 終了
を順次行えば良いのである。これで、見かけ上、CWCCコンパイラにより、コンパイルが実行されたと思われる訳である。
- コンパイラ本体
まぁ、とりあえず、上記手順を踏めば、何とかなると思う。
但し、CWCC本体と、名前がダブるので、ソースファイルは、CWCCC.cppとして、実行ファイル名をCWCC.EXEとする。
そこで、コンパイラで使用する小技を紹介するのである。
ユーザフレンドリと考えれば、コンパイラ本体と、パッケージは、パスの通ったフォルダ(...\BCC55\BIN等)に保存しておく事になるであろう。(同じフォルダにインストールする事が条件とすれば良い)しかしながら、作業フォルダに移動して、さてコンパイル…となると、パッケージを置いたパス(コンパイラと同じフォルダ)が特定出来ないのである。仕方ないので、main関数の第2引数,
void main(int argc,char **argv)
の*argv[0]にあたる文字列を使用する。ここには、自分自身へのパスが入るので、例えば、コンパイラが、C:\Borland\Bcc55\Binに置かれていれば、argv[0]には、"C:\Borland\Bcc55\Bin\CWCC.EXE"が入るのである。この文字列の、CWCC.EXE部分をCWCCLIB.PKGに置き換えれば、これが即ち、パッケージファイル名となるのである。
- インクルードファイル(CWCC.h)
次に、インクルードファイルであるが、試作版では、
#include "cwcc.h"
の様に記述したが、ユーザ側としても、同一ディレクトリに、cwcc.hが無いのに、この様に記述するのは、気持ちが悪いと思うので、cwcc.hだけは、予め、…\include\cwcc\cwcc.h等にセーブしておいて貰えば、
#include <cwcc\cwcc>
の様に、記述出来るので、ユーザ側にもスッキリする。勿論,作業フォルダに、cwcc.hも生成するので、『どちらでもOK』という事にしたい。
- パッケージャも造らなければ…。
こうなってくると、パッケージャも造らなければいけないのだ。まず、ファイル名とファイルフォーマットを決めなければならない。
ファイル名は、CWCCLIB.PKGとするのだ。
パッケージャのファイル名は、CWCCPKG.EXEとする。
パッケージデータファイルのフォーマット構造は、以下の通りなのだ。
名称 | サイズ | 備考
|
---|
バージョン情報 | 16バイト | char*型
| CWCC.objサイズ | 4バイト | long型(obj_size)
| CWCC.hサイズ | 4バイト | long型(h_size)
| CWCC.rcサイズ | 4バイト | long型(rc_size)
| CWCC.rhサイズ | 4バイト | long型(rh_size)
| CWCC.icoサイズ | 4バイト | long型(ico_size)
| CWCC.obj本体 | obj_sizeバイト | バイナリ保存
| CWCC.h本体 | h_sizeバイト | バイナリ保存
| CWCC.rc本体 | rc_sizeバイト | バイナリ保存
| CWCC.rh本体 | rh_sizeバイト | バイナリ保存
| CWCC.ico本体 | ico_sizeバイト | バイナリ保存
|
※バージョン情報は、パッケージする時に指定する。
例>CWCCPKG 1.0.0
- CWCC.objの分割コンパイルは?
CWCCがクラスを使いはじめ、構造が複雑になってくると、1個のファイルでは扱い切れなくなりそうなのだ。分割してコンパイルすると、CWCC1.obj,CWCC2.obj…になってしまうのだが、コンパイラとしては、CWCC.objは1個のファイルで扱いたいので、擬似的な分割コンパイル方法を採用する。即ち、メインはCWCC.cppであり、これに、CWCCCLIB.cpp,CWCCCLIB.hpp,CWCCTLIB.cpp,CWCCTLIB.hpp等(名前は未定)を、全てインクルードしてコンパイルしてしまうのだ。こうすれば、コンパイラはそのままの形で対応出来る訳である。
試験配布版パッケージのダウンロード
(含:ソースファイル)
|