IMAKE(1) — UNIX Programmer’s Manual
名称
imake − C プリプロセッサの対 make ユーティリティインタフェース
形式
imake [ −Ddefine ] [ −Idirectory ] [ −T ] [ −f imakefile ] [ −s [ makefile ]] [ −v ] [ make options or arguments ]
解説
imake は、テンプレートと Imakefile を使用して、その上で C プリプロセッサを動作し、 /usr/tmp 内に一時的な makefile を作成します。 次に、この事前処理された makefile 上で make を動作します。 下記の実施詳細を参照。
デフォルトによって、 imake はまず現在の作業ディレクトリ内にある Imakefile と命名されたファイルを捜し、失敗した場合は、 imakefile と命名されたファイルを捜します。
オプション
−Ddefine
定義を行います。 この引数は、プリプロセッサ cpp に渡されます。 これは、環境変数 IMAKEINCLUDE でも行うことができます。
−Idirectory
ディレクトリを含めます。 この引数は、プリプロセッサ cpp に渡されます。 これは、環境変数 IMAKEINCLUDE でも行うことができます。
−T template
テンプレートファイル。 デフォルトファイルの Imake.template ではなく、cpp が最初に含むテンプレートファイルを指定します。
−f imakefile
ファイルします。 imake が使用するための 代わりの imakefile を指定します。
−s [ filename ]
表示します。 Imake は、imakefile を前処理し、それを標準出力宛に送ります。 make プログラムは、呼び出されません。 filename 引数が存在しない場合は、出力はその代わりに命名された ファイルに送られます。 通常これは、 −s Makefile です。
−v 多弁(おしゃべり)。 Imake は、使用するコマンド行を表示して、それを実際に実行する前に C プリプロセッサを 呼び出します。
環境変数
Imake は、次の3つの変数の環境を調べます。
IMAKEINCLUDE
この変数が定義されている場合は、これは C プリプロセッサに対して有効な include 引数でなければなりません。 例: “-I/usr/include/local”。 実際に、任意の有効な cpp 引数がここでも有効です。
IMAKECPP
この変数が定義されている場合は、これはプリプロセッサプログラムへの 有効なパスです。 例: “/usr/local/cpp”。 デフォルトによって、 imake は、/lib/cpp を使用します。
IMAKEMAKE
この変数が定義されている場合は、これは make プログラムへの有効な パスです。 例: “/usr/local/make”。 デフォルトによって、 imake は、 make プログラムが execvp(3) を使用して見つけたすべてのものを使用します。
インプリメンテーションの詳細
Imake はまず、Imakefile もしくは imakefile が存在するか否かに応じて、 コマンド行 −f フラグからか、あるいは現在のディレクトリの内容 から imakefile 名を決定します。 これを <imakefile> と呼びます。 imake はまた、コマンド行 −T フラグからか、あるいは デフォルトの Imake.template から、テンプレート名も決定します。 これを <template> と呼びます。
プログラムは次に、makefile を検査して、’#’ 文字で始まるあらゆる行を 捜します。 それが見つかった場合は、 #include、 #define、 #undef、 #ifdef、 #else、 #endif あるいは #if のセットに基づき、それが有効な C プリプロセッサの指示語であるか 否かをチェックします。 そうである場合は、 imake はそれを変更しません。 そうでない場合は、行の初めにナルの C コメント “/∗∗/” を埋め込み、 プリプロセッサがその行を実行しないようにします。 これは、 make スタイルの “#” コメントの使用を保存するのに役に立ちます。 いずれかの行を変更しなければならない場合は、/tmp/tmp-imake.∗ と 命名された一時ファイルが、"埋め込まれた" imakefile を受け取ります。 その行を変更する必要があってもなくても、このファイル を <input-imakefile> と呼びます。
次に、プログラムは次のコマンド行で C プリプロセッサを起動します。
/lib/cpp -I. -I/usr/lib/local/imake.includes -Uunix
これはおそらく IMAKEINCLUDE 環境変数をもつ引数のリスト、 すなわち −I および −D コマンド行引数を プリペンディングしています。 あるいは、プリプロセッサのプログラムを IMAKECPP 環境変数に変更します。 標準入力は、 imake プログラムから行われ、標準出力は、/usr/tmp/tmp-make.∗ 内の 一時ファイルに送られます。 すなわち、−s フラグに対する引数がない場合は、出力はその一時ファイルに 送られます。 このファイルを <makefile> と呼びます。 プリプロセッサに対する入力として用意されている最初の3行は 以下のとおりです。
#define IMAKE_TEMPLATE "<template>"
#define INCLUDE_IMAKEFILE "<input-imakefile>"
#include IMAKE_TEMPLATE
これは、テンプレートは最低限以下の行をもっていなければならないことを 暗示していることに注意してください。
#include INCLUDE_IMAKEFILE
次に、 imake はプリプロセッサの全出力をメモリ内に読み込み、入力時に現れる あらゆる2重の ’@’ 記号を取り除きます。 これは、 cpp が通常行う方法では単一行にまとめられない cpp 複数行マクロを書き込むのに 大変便利です。 さらに、あらゆる行での後続する空白行は捨てられ、 make が混乱しないようにします。 そして大半の空白も捨てられます。 たとえばマクロが、
#defineprogram_target(program, objlist)@@\
program:objlist@@\
$(CC) -o $@ objlist $(LDFLAGS)
program_target(foo, foo1.o foo2.o) とともに呼び出された場合は、以下のとおりに拡張します。
foo:foo1.o foo2.o
$(CC) -o $@ foo1.o foo2.o $(LDFLAGS)
最後に、 -s オプションが指定されなかった場合は、 imake は以下のプログラムを呼び出します。
make MAKE=<program> MAKEFILE=<imakefile> -f <makefile> makeargs
ここで “makeargs” は、コマンド行上で見つかったいずれかの引数と 置き換えられます。
ファイル
/usr/tmp/tmp-imake.nnnnnncpp に対する一時入力ファイル
/usr/tmp/tmp-make.nnnnnnmake に対する一時入力ファイル
/lib/cppデフォルトの C プリプロセッサ
/usr/lib/local/imake.includesインクルードファイルに対するデフォルトの ディレクトリ
関連事項
make(1)
S. I. Feldman Make − A Program for Maintaining Computer Programs
著者
Todd Brunhoff; Tektronix, inc. and Project Athena, MIT.
バグ
Sun 上で動く C プリプロセッサの Cpp は、マクロ展開内のあらゆるタブを 単一スペースに圧縮します。 これはまた、エスケープされた改行を削除しないでスペースと置き換えます。 コード内にはクラッジがあり、これを避けようと試みますが、それは あらゆるターゲットが行内のどこかに ’:’ をもっていて、ターゲットに対する あらゆるアクションは ’:’ をもっていないという事実に依存します。
make- スタイルの ’#’ コメントを Imakefile 内で使用することは できますが、テンプレートや他のインクルードファイル内では使用することは できません。 それらが必要な場合は、C のナルコメントである /∗∗/ を前につけなければ なりません。
NEWS-OSRelease 3.3