imake(1) make ユーティリティに対する C プリプロセッサのインタフェース

書式

imake [ -Ddefine ] [ -Idir ] [ -Udefine ] [ -Ttemplate ] [ -f filename ] [ -C filename ] [ -s filename ] [ -e ] [ -v ]

説明

imake は、テンプレート、cpp マクロ関数群、Imakefile と呼ばれるディ レクトリごとの入力ファイルから Makefile を生成する。これを使うこ とにより、プログラムを構築するための様々な要素の記述から、マシンに依存 する部分(コンパイラのオプション、異なるコマンド名、特別な make の規則など)を切り離すことができる。

オプション

以下のコマンド行オプションは imake に渡される。
-Ddefine
このオプションは直接 cpp に渡される。このオプションは通常、ディ レクトリ固有の変数をセットするために使われる。例えば、Xウィンドウシス テムはこのフラグを使って、TOPDIR にコアディストリビューションの 最上位ディレクトリの名前をセットし、CURDIR には最上位ディレクト リからカレントとディレクトリへの相対パスをセットする。
-Idirectory
このオプションは直接 cpp に渡される。このオプションは通常、 imake のテンプレートや設定ファイルがあるディレクトリを指定するた めに使われる。
-Udefine
このオプションは直接 cpp に渡される。このオプションは通常、 imake の設定ファイルをデバッグするときに変数をセット解除するため に使う。
-Ttemplate
このオプションは、cpp が使うマスターテンプレートファイル(通常は -I で指定されたディレクトリに置かれる)の名前を指定する。 デフォルト値は Imake.tmpl である。
-f filename
このオプションは、ディレクトリごとに置く入力ファイルの名前を指定する。 デフォルト値は Imakefile である。
-C filename
このオプションは、カレントディレクトリに作られる .c ファイルの名前を指 定する。デフォルト値は Imakefile.c である。
-s filename
このオプションでは、生成される make 記述ファイルの名前を指定する が、このオプションを指定しても make が実行されることはない。 filename がダッシュ(-)ならば、出力は stdout に対して行わ れる。デフォルトの動作では Makefile を生成するが、実行はしない。
-e
このオプションを指定すると、imake は生成した Makefile を実 行する。デフォルトでは、Makefile の実行はユーザに任されている。
-v
このオプションを指定すると、imakeMakefile の生成に使う cpp のコマンド行を表示する。

imake の動作

imake は、コマンド行で -I オプションや -D オプ ションを渡してcpp を起動し、次の内容を持つファイル名を渡す。

                #define IMAKE_TEMPLATE "Imake.tmpl"
                #define INCLUDE_IMAKEFILE <Imakefile>
                #include IMAKE_TEMPLATE

このとき、Imake.tmpl の部分はコマンドの -T オプションで書 き換えられることがあり、Imakefile の部分は -f オプション で書き換えられることがある。

IMAKE_TEMPLATE は通常、マシン依存のパラメータ(cpp のシンボルで指 定する)が書かれたファイル、サイト特有のパラメータファイル、変数を定義 するファイル、make を生成するための cpp のマクロ関数が書か れたファイル、カレントディレクトリの Imakefile (INCLUDE_IMAKEFILE で指定する)を読む。Imakefile は、このマクロ関 数を用いて生成すべき対象を示す。imake は、責任を持って適切な規則 を生成する。

Imake の設定ファイルは、2つのタイプの変数を持つ。すなわち、imake 変数と make 変数である。imake 変数は imake を実行した際に cpp によって解釈される。慣習により、imake 変数の名前は 大文字と小文字が混ざった形となる。make 変数は Makefile に書き込まれ、後で make に解釈される。 慣習により、make 変数の名前は大文字で書かれる。

規則ファイル(通常は設定ディレクトリの Imake.rules)には、現在のプ ラットフォームにしたがって設定された cpp マクロ関数群が記述され ている。マクロが複数行の make 規則を生成できるように、 imake は文字列 ``@@'' が現れると、これを改行に置き換える。 例えば、次のマクロ

 #define  program_target(program, objlist)        @@\
 program: objlist                                 @@\
          $(CC)  -o  [email protected]  objlist  $(LDFLAGS)
は、 program_target(foo, foo1.o foo2.o) で呼ばれたとき、
 foo:     foo1.o  foo2.o
          $(CC)  -o  [email protected]  foo1.o  foo2.o  $(LDFLAGS)
のように展開される。

imake は ``XCOMM'' が現れると、これを ``#'' 文字に置換する。 これにより、プリプロセッサに ``invalid directive'' エラーを出させるこ となく Makefile にコメントを置くことができる。

複雑な imake の場合、生成される make 変数がマクロのそれぞ れの呼び出しにおいて局所性が必要なことがある。これはしばしば、その値 がマクロに渡されるパラメータに依存するために起こる。 このような変数は、XVARdefn の形式の imake 変数を使っ て作ることができる。ここで、n は1桁の数字である。 一意に決まる make には代入が行われる。後で変数 XVARusen が現れたとき、これは対応する XVARdefn によって生成された変数に置き換えられる。

cpp が複数のタブや空白を1つの空白に減らすようなシステムにおいて は、imake は必要なタブを戻そうと試みる(make はタブと空白の 違いに大変厳しい)。このため、コマンド行ではコロン(:)の前にバックス ラッシュ(\)を置かなければならない。

X ウィンドウシステムでの利用

X ウィンドウシステムは、ソースからのシステム全体の構築と外部ソフトウェ アの構築の両方で imake を広く用いる。先に述べたように、相対パス 名を用いたファイルの参照を容易にするために2つの特別な変数 TOPDIRCURDIR がセットされる。例えば、lib/X/ における Makefile を作るため、次のコマンドが自動的に生成される(ソースの最 上位ディレクトリからの相対パス):

          %  ../.././config/imake  -I../.././config  \
                -DTOPDIR=../../.   -DCURDIR=./lib/X

ソースツリーに含まれない X のプログラムを構築する際には、特殊なシンボ ル UseInstalled が定義され、TOPDIRCURDIR は無視 される。設定ファイルが正しくインストールされていれば、スクリプト xmkmf(1) を使うことができる。

入力ファイル

X に使われるときに imake が読むファイルについての概略を示す。 字下げは、他のファイルをインクルードすることを示す。
    Imake.tmpl                一般的な変数
        site.def              サイト固有、BeforeVendorCF が定義される
        *.cf                  マシン固有
            *Lib.rules        共有ライブラリの規則
        site.def              サイト固有、AfterVendorCF が定義される
        Imake.rules           規則
        Project.tmpl          X 特有の変数
            *Lib.tmpl         共有ライブラリについての変数
        Imakefile
            Library.tmpl      ライブラリについての規則
            Server.tmpl       サーバについての規則
            Threads.tmpl      マルチスレッドについての規則

site.def は2度インクルードされる点に注意せよ。1度目は *.cf ファイルの前で、次はこのファイルの後である。サイトにおけるカスタマイズ のほとんどは *.cf ファイルの後でなければならないが、コンパイラの 選択のように先に指定しなければならないものもある。他の変数設定がこれら に依存しているからである。

最初に site.def をインクルードしたときには変数 BeforeVendorCF が定義され、2度目にインクルードしたときには変数 AfterVendorCF が定義さ れる。site.def の全てのコードはどちらかのシンボルについての #ifdef の内側に置かれているはずである。

ファイル

Imakefile.c                  cpp の入力に使う一時ファイル

/tmp/Imf.XXXXXX             -s のための一時的な Makefile

/tmp/IIf.XXXXXX             指定した Imakefile が # 形式のコメントを使っている場合の一時的な Imakefile

/lib/cpp                    デフォルトの C プリプロセッサ

環境変数

以下の環境変数を設定することができる。ただし、これらは imake が 実行されるときに容易にはわからない依存関係をもたらすため、あまり使わな いほうがよい。
IMAKEINCLUDE
この環境変数が定義された場合、C プリプロセッサにインクルードの引き数 ``-I'' を渡すことを指定。例: ``-I/usr/X11/config''.
IMAKECPP
この環境変数が定義された場合、これはプリプロセッサのプログラムの有効な パスでなければならない。 例: ``/usr/local/cpp''. デフォルトでは、 imake は /lib/cpp を用いる。
IMAKEMAKE
この環境変数が定義された場合、これは ``/usr/local/make'' のような make プログラムの有効なパスでなければならない。 デフォルトでは、 execvp(3) を使って見つけた make を使用する。 この環境変数が使用されるのは、``-e'' オプションが指定されたときだけで ある。

著者

Todd Brunhoff, Tektronix and MIT Project Athena; Jim Fulton, MIT X Consortium