さて、今回は GNU make です。と言いましても make は奥深いプ
ログラムでして、使い方を細かく書いていたらそれだけで本が一冊
書けてしまいます(あたしにゃ無理だけどぉ(^^;)。いつものごとく
emx版GNU make のインストール方法とごく簡単な使い方だけを書い
てみます(^^)
なお、今回用意したのは、GNU make 3.74 のemx版です。
実はmakeほど、その機能を一言で表すのが難しいコマンドはあり ません(^^; 某マニュアルには、「make -- 関連するプログラムお よびファイルの維持、更新、および再作成」と書かれています。う む、なかなか良い線いってます(^o^) でも、例を示してその雰囲気を垣間見せることはそれほど難しい ことではありません。例えば、main.cとfunc.cのふたつのC言語ソー スファイルから作成される bar.exe というプログラムがあったと します。この場合、オブジェクトモジュール(拡張子が.objまたは. o)が途中で作成されますので、
今回の例では、C言語の開発を例にとって示しましたが、およそ ファイル間に依存関係があり、作成ルールがあるものにはすべてこ のmakeを利用することができます。そういう意味でmakeとは何も開 発者のためのものということはありません。 また、開発で利用する場合でも、実行ファイルを作るためだけで はなくて、実行ファイル・ドキュメントのインストール、バックアッ プ、リリース用アーカイブの作成など、すべてひとつの"Makefile" に記述して行なったりします(^^)
emx版GNU make は gnumake.zip に入っています。Hobbes CD-ROM の場合、次の場所に入っています。
\disc1\dev32\gnumake.zip
gnumake.zip中のmake.exeをPATHの通ったディレクトリにコピー してください。
gnumake.zip中にmake.manというroffのman形式のドキュメントが あります。これをMANPATH下のman1にコピーしてください。この時、 拡張子は .man から .1 に変更しておいてください。
例) [C:\usr\src\make] copy make.man \local\man\man1\make.1
gnumake.zip中に make.texinfo と make-stds.texi(*1) という
ファイルがありますが、これがGNU make の texinfo形式ドキュメ
ントになります。makeinfo.exeを使って
[C:\usr\src\make] makeinfo --no-split make.info -o %INFOPATH%/make.info
環境変数INFOPATHに dir というファイルがあります。ここに makeの項目が存在しない場合、例えば次のような1行を追加します。
-----^
* make: (make). GNU `make'.
-----$
なお、emxの開発環境に標準でついてくる dir ファイルには上記エ
ントリは最初から記述されていますので、ここであらためて追加す
る必要はありません。
ということで、makeのinfoドキュメン トのインストールは終わりですが、man形式ドキュメントに比べ、 info形式ドキュメントの方が内容も豊富 で遥かに読みやすいです。読むならぜひこちらを読んでみてくださ い。英語ですけど....(^^;
*1:make-stds.texiはmake.texinfoの中から@includeされています。 make.texinfoをmakeinfoすると一緒に変換されます。
再コンパイルはgnumake.zipを展開したディレクトリで次のよう にして行うと良いでしょう。ただし、最初に入っていた、make.exe をPATHの通ったディレクトリに移動しておく必要があります。同じ ディレクトリにはいったままですと、link386に失敗します。
例)再コンパイルの実行例 [C:\usr\src\make] move make.exe \local\bin [C:\usr\src\make] make -f Makefile.os2 os2only
※上記方法でmakeした場合、リンカーとしてlink386を使用します。 link386をインストールしていない方は、システム設定フォルダー にある「システム構成 機能の追加」で「オブジェクトモジュー ルのリンク」をインストールしておいてください。
Makefileの名前は、指定せずにmakeを起動した場合、
Makefileの名前を指定する場合は、-fオプションを使います。 この時使われる名前は、例えば作成する実行ファイル名をfooとすると、
makeでよく使うオプションについて簡単に説明しておきます。
添付のinfoドキュメントに書いてある 事なのですが、C言語で開発する場合の、.hと.cの依存関係を自動 的に生成してくれる仕組みについて書いてみます。なお、この機能 を実現するためには、make、GCCの他 に sed が必要です。
main.c、func1.c、func2.cの三つのファイルから、foo.exe を作 る場合を考えてみます。Makefile は例えば次のようになるでしょ う。
-----^ Makefile
CC = gcc
O = .o
OFILES = main$O func1$O func2$O
.PHONY: all
all: make.exe
make.exe : $(OFILES)
$(CC) $(LDFLAGS) $(OFILES) -o $@
%$O: %.c
$(CC) -c $(CPPFLAGS) $(CFLAGS) $<
-----$
これに、次のような行を追加します。
-----^
%.d: %.c
$(CC) -M $(CPPFLAGS) $< | sed "s/$*\\.o[ :]*/& $@ /g" > $@
include $(OFILES:$O=.d)
-----$
※上記部分は、OS/2でのみ動作する事を期待して記述しています。 UN*X環境で使う時は、makeのinfoドキュ メントのオリジナルの書式を使用してください。"Automatic Dependencies"という章です。あ、OS/2でもオリジナルの書式のま ま使えるんだけど、sh.exeとかを用意しないといけないので....(^^ゞ
これにより、各.cファイル毎にそこで使用されている全てのインク ルードファイル(.h)との依存関係を記述した拡張子が .d のファイ ルを作成し、それをMakefileの中でインクルード(make自身のイン クルード機能)しているわけです。 これは、ccの -M オプションを利用しています。-Mオプション付 きでccを起動すると、
例)gccの-Mオプションを使ってみる [C:] gcc -M main.c main.o: main.c foo.h x:/emx/include/stdio.hの様に、「main.o:〜」の内容が標準出力に出力されます。これは、 Makefileのファイルの依存関係の記述に他なりません。これだけで も充分に利用価値があるのですが、sedを使って加工し、
main.o: main.d main.c foo.h x:/emx/include/stdio.h
のような内容のファイル .d を作っているわけです。
#include <stdio.h> /* <>で囲む書き方 */
#include "foo.h" /* ""で囲む書き方 */
のうち、後者の「""」で囲まれたヘッダファイルのみの依存関係を
書き出します。stdio/stdlib等システムで用意されているインクルー
ドファイルは全て、「<>」で囲み、自前で作成したインクルー
ドファイルは、「""」で囲むようにすると良いでしょう。更新され
る事を考慮しなくてよいインクルードのタイムスタンプをチェック
しなくなるため、makeの実行が効率良くなる事が期待されます。
今回紹介したmakeはあくまでも英語版です。日本語ファイル名 (含ディレクトリ名)が通る事は期待できません。もっともmakeが 日本語化してないと困るなんてこと、まずないと思いますけどね(^^)
make関係の文献は各種
(「make」、
「MAKEの達人」他多数)
出ています。どれでも適当なものを参考にすればよいでしょう。
GNU makeに特化した記述となると、前記infoドキュメントを日本
語化した書籍があります。アジソン・ウェスレイ発行、星雲社発売
の「GNUリファレンスマニュア
ルシリーズ MAKE」がそれです。ただ、内容としては多少
古いです。
というわけで今回は make でした。アプリユーザーにはあまり関 係ありませんが、開発者の方はMakefileくらいフルスクラッチから 書けるくらいの素養はつけておきましょうね(^_-)