TOP : About EMX : GNU make
Previous: sed
Next: diffutils

GNU make

 さて、今回は GNU make です。と言いましても make は奥深いプ ログラムでして、使い方を細かく書いていたらそれだけで本が一冊 書けてしまいます(あたしにゃ無理だけどぉ(^^;)。いつものごとく emx版GNU make のインストール方法とごく簡単な使い方だけを書い てみます(^^)
 なお、今回用意したのは、GNU make 3.74 のemx版です。

●makeとは何か?

 実はmakeほど、その機能を一言で表すのが難しいコマンドはあり ません(^^; 某マニュアルには、「make -- 関連するプログラムお よびファイルの維持、更新、および再作成」と書かれています。う む、なかなか良い線いってます(^o^)  でも、例を示してその雰囲気を垣間見せることはそれほど難しい ことではありません。例えば、main.cとfunc.cのふたつのC言語ソー スファイルから作成される bar.exe というプログラムがあったと します。この場合、オブジェクトモジュール(拡張子が.objまたは. o)が途中で作成されますので、

main.c→main.o func.c→func.o main.o+func.o→bar.exe
(図) ファイルの依存関係例
のような依存関係があります。bar.exeを作るためには、main.oと func.oが必要で、main.oを作るためにはmain.cが必要で...etcとい うわけですね。この関係を記述したファイルを Makefile と言いま す。
 ここで、一度 bar.exe を作成した後、bug fixを行なって、 func.c だけ修整したとします。main.cには変更が無いので、 func.cだけ再コンパイルするのが効率的ですね。そのためにはどう するかというと make は Makefileの記述に従って各ファイルのタ イムスタンプ(更新日時)を調べます。func.cとfunc.oを比較すると func.cの方が新しくなっているので、func.cをコンパイルし、 func.oを作ります。次にmain.cとmain.oを比較しますが、main.oの 方が、新しいままなのでこちらはコンパイルしません。次に、 main.o/func.oとbar.exeを比較します。今度はfunc.oがbar.exeよ りも新しくなっているので、bar.exeの再作成を行う.....makeとは およしこのような感じを行うためのものです。

 今回の例では、C言語の開発を例にとって示しましたが、およそ ファイル間に依存関係があり、作成ルールがあるものにはすべてこ のmakeを利用することができます。そういう意味でmakeとは何も開 発者のためのものということはありません。  また、開発で利用する場合でも、実行ファイルを作るためだけで はなくて、実行ファイル・ドキュメントのインストール、バックアッ プ、リリース用アーカイブの作成など、すべてひとつの"Makefile" に記述して行なったりします(^^)

●gnumake.zipのありか

 emx版GNU make は gnumake.zip に入っています。Hobbes CD-ROM の場合、次の場所に入っています。

	\disc1\dev32\gnumake.zip

●インストール方法

 gnumake.zip中のmake.exeをPATHの通ったディレクトリにコピー してください。

●man形式ドキュメント

 gnumake.zip中にmake.manというroffのman形式のドキュメントが あります。これをMANPATH下のman1にコピーしてください。この時、 拡張子は .man から .1 に変更しておいてください。


	例)
		[C:\usr\src\make] copy make.man \local\man\man1\make.1

●infoドキュメント

 gnumake.zip中に make.texinfo と make-stds.texi(*1) という ファイルがありますが、これがGNU make の texinfo形式ドキュメ ントになります。makeinfo.exeを使って info 形式のドキュメントに変換しましょう。  makeのinfoドキュメントは例えば、次のようになります。

  1. makeinfoでinfo形式ドキュメントに変換
    
      [C:\usr\src\make] makeinfo --no-split make.info -o %INFOPATH%/make.info
    
  2. 環境変数INFOPATHの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すると一緒に変換されます。

●make.exeの再コンパイル

 再コンパイルは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の名前

 Makefileの名前は、指定せずにmakeを起動した場合、

  1. makefile
  2. Makefile
の順序でカレントディレクトリから検索されます。 小文字で始まるmakefileの方が検索順位が高いのですが、 通常は、大文字で始まるMakefileという名前で作成する事が多いようです。

 Makefileの名前を指定する場合は、-fオプションを使います。 この時使われる名前は、例えば作成する実行ファイル名をfooとすると、

  • foo.mak
  • foo.mk
  • などにすることが多いようです。

    ●makeのオプション

     makeでよく使うオプションについて簡単に説明しておきます。

    -f FILE
    --file=FILE
    --makefile=FILE
    Makefileの名前をFILEで指定します。
    -k
    --keep-going
    このオプションを指定するとmakeの途中でエラーが発生しても そのエラーに直接関係しない部分についてはmake処理を続行します。 指定しなかった場合は、エラーが発生した段階ですぐにmake処理を 中断します。
    -n
    --just-print
    --dry-run
    --recon
    実行予定のコマンドの表示のみを行ないます。
    -h
    --help
    オプションの一覧を表示します。

    ●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 を作っているわけです。
     gccにはこの-Mオプションに加え、標準ccには無い、-MMオプショ ンというものがあります。この -MM オプションは、Cプリプロセッ サの#includeの二つの書式、
    
    	#include <stdio.h>              /* <>で囲む書き方 */
    	#include "foo.h"                /* ""で囲む書き方 */
    
    のうち、後者の「""」で囲まれたヘッダファイルのみの依存関係を 書き出します。stdio/stdlib等システムで用意されているインクルー ドファイルは全て、「<>」で囲み、自前で作成したインクルー ドファイルは、「""」で囲むようにすると良いでしょう。更新され る事を考慮しなくてよいインクルードのタイムスタンプをチェック しなくなるため、makeの実行が効率良くなる事が期待されます。

    ●日本語ファイル名について

     今回紹介したmakeはあくまでも英語版です。日本語ファイル名 (含ディレクトリ名)が通る事は期待できません。もっともmakeが 日本語化してないと困るなんてこと、まずないと思いますけどね(^^)

    ●参考文献

     make関係の文献は各種 (「make」、 「MAKEの達人」他多数) 出ています。どれでも適当なものを参考にすればよいでしょう。
     GNU makeに特化した記述となると、前記infoドキュメントを日本 語化した書籍があります。アジソン・ウェスレイ発行、星雲社発売 の「GNUリファレンスマニュア ルシリーズ MAKE」がそれです。ただ、内容としては多少 古いです。

     というわけで今回は make でした。アプリユーザーにはあまり関 係ありませんが、開発者の方はMakefileくらいフルスクラッチから 書けるくらいの素養はつけておきましょうね(^_-)


    TOP : About EMX : GNU make
    Previous: sed
    Next: diffutils
    hedghog@ibm.net
    最終更新日:1997.04.15