[[BORLAND C++ CWCC]]
RETURN
CWCC#01 Compiler
コンパイラと言っても、コンパイラ本体を造る(造れるか!!そんなもの[怒])訳ではなくて、コンパイラを起動するプログラムを造ろうって事である。CWCCは、元々HelloWorldを10行以内で書く事を当初の目的にしているので、最初から分割コンパイルを念頭に置いたCoolLibとは違うのだ。これをやっておかないと、結局、『WindowsアプリのHelloWorldは結局10行以下では無理!』と言われてしまうのだ。

  • 改善すべき点
    さて、作業フォルダに、test.cppが有ったとしよう。基本的には、コマンドラインにて、
    >CWCC test.cpp[CR]

    と打ち込めば、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等(名前は未定)を、全てインクルードしてコンパイルしてしまうのだ。こうすれば、コンパイラはそのままの形で対応出来る訳である。
試験配布版パッケージのダウンロード
(含:ソースファイル)
2002/05/01
HomeSweetHome2
Ozzy's Software