WonderWitch でプログラミングをするようになって、 やっぱり make とか使えないと不幸だな〜、とか思ったりするわけです。
> lcc86 -o hello.bin hello.c
> mkfent hello.cf
な〜んて、ソースを更新する度にタイプしたり何だりってのは、 やっぱり最強にかったるくてヘボまっていてガッデムです。
そこで我らがベル研の開発した、最強に強まったツール「make」を利用して、 「make」と一発打てば更新されたファイルのみに対して処理を実行し、 最短時間で .fx ファイルを生成して幸せな気分になろうという訳です。
まず、make とはなんぞやということですが、一言で言えば 「ファイルの更新状況を見ながら処理を行うツール」になるんでしょうか。
例えば、hello.c というプログラムの本体と、mylib.c というライブラリがあるとします。 これをコンパイルして hello.exe を作る手順としては、
lcc -c mylib.c
lcc hello.c mylib.obj
というのが一般的でしょうか。
ですが、もし mylib.c には何の変更もなくて、hello.c だけに変更があったとしたら、 mylib.c をコンパイルするのは時間の無駄です。 さらに、こんなコマンドを、ソースを弄る度に打つのは面倒です。 ヒストリ機能があっても、2 行のうち間違った方を実行してしまったりします。
そこで make の登場となるわけです。make は、
といった特徴を持ったツールで、UNIX のシェルスクリプトや、
MS-DOS のバッチファイルの仲間になります……たぶん。
指定したファイルに記述されている動作を次々と行っていく、
一種のインタプリタと言えるでしょう……たぶん。
makeのusageは
> make
だけ知ってれば OK です。
これで、カレントディレクトリ内の「makefile」(拡張子無し)というファイルを読んで処理を行います。
で、makefile の内容ですが、 以下のようなモノがいくつも書かれています。
hello.exe: hello.c hello.h
lcc hello.c
「lcc ……」の手前にあるのはタブです。このタブが無かったり、 ただのスペースだったりすると、make に怒られます。
で、この文字列の意味はと言うと、
lcc hello.c
』だ」といった感じです。
二行目の「実行するコマンドは……」ってのはいくつでも追加できます。 例えば、こんな感じ。
# コンパイルして転送形式に変換してWonderWitchへ送信
hello.fx : hello.c hello.cf
lcc86 -o hello.bin hello.c
mkfent hello.cf
c:\WWitch\bin\wwPutw.exe /rom0 hello.fx
「#」から行末まではコメントになります。コマンドは上のモノから順に実行されていきます。
こういったモノをいくつも繋げて、
dirproc.exe : dirproc.obj nutsclib.obj
lcc -o dirproc.exe dirproc.obj nutsclib.obj
dirproc.obj : dirproc.c nutsclib.h
lcc -c dirproc.c
nutsclib.obj : nutsclib.c nutsclib.h
lcc -c nutsclib.c
とかしてやると、その通りの処理をしてくれるわけです。
こうやっていくつもの処理を繋げていく場合は、「親玉」を一番上に書きます。
上ので言うと、「dirproc.exe」が親玉で、それを構成する「dirproc.obj」
と「nutsclib.obj」が子分です。子分に対する処理は、より下の方に書きます。
もっと複雑な階層構造になっているときも、「より親玉」がより上にきます。
で、マクロなんかも使えて、例えば、以下のような内容だと、
NAME = hello
$(NAME).fx : $(NAME).bin $(NAME).cf
mkfent $(NAME).cf
$(NAME).bin: $(NAME).c
lcc86 -o $(NAME).bin $(NAME).c
3 行目以降の「$(NAME)」は全て「hello」に置き換えられて実行されます。 マクロは「マクロ名 = 値」で定義されて、「$(マクロ名)」で参照できると。
ちょくちょく行われるのが、
CC = lcc
#CC = bcc32 # BC++を使うときはこっち
hello.exe: hello.c hello.h
$(CC) hello.c
って奴です。コンパイラの切り替えを簡単に。
make にはいろんな種類というか、「○○版make」ってのがありまして、
ある make では通るのに、別の make だと通らないってのが良くあります。
LSI-C の kmmake だと通るけど、BC++ の make だと通らない、とか。
詳しくはお手持ちのコンパイラのマニュアルをご覧下さい。(爆
\WWitch\lsic86ww\man\wonderwitch.man の 2051 行目〜 を読む方が解り易かったかも。(苦笑
でもまぁ、こんなモンでしょ。本当なら make clean とかも書いた方が良いんだろうけど、
その辺まで行くと「初歩の初歩」でなくなってしまうので。