Tips & Information 今回のお題:
『make の使用法・初歩の初歩』


●概要

WonderWitch でプログラミングをするようになって、 やっぱり make とか使えないと不幸だな〜、とか思ったりするわけです。

> lcc86 -o hello.bin hello.c
> mkfent hello.cf

な〜んて、ソースを更新する度にタイプしたり何だりってのは、 やっぱり最強にかったるくてヘボまっていてガッデムです。

そこで我らがベル研の開発した、最強に強まったツール「make」を利用して、 「make」と一発打てば更新されたファイルのみに対して処理を実行し、 最短時間で .fx ファイルを生成して幸せな気分になろうという訳です。

● make とは

まず、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 に怒られます。

で、この文字列の意味はと言うと、

1 行目:
「hello.exe は、hello.c と hello.h から成る」
実際の処理としては、
「hello.exe と言うファイルを作る / 更新する処理をするのは、 hello.c というファイルか、hello.h というファイルが、 前のコンパイル以降に更新されているときで、」
2 行目:
「もし 1 行目に書いたファイルが更新されていたら実行するコマンドは、 『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 とかも書いた方が良いんだろうけど、 その辺まで行くと「初歩の初歩」でなくなってしまうので。


戻る