IMAKE(1) — NEWS-OS Programmer’s Manual
名称
imake − make ユーティリティに対する C プリプロセッサインターフェース
形式
imake [ −Ddefine ] [ −Idir ] [ −Ttemplate ] [ −f filename ] [ −s filename ] [ −e ] [ −v ]
解説
imake は、 cpp のマクロ機能の集合である テンプレートから Makefiles を作成するのに用いられます。 ディレクトリごとの入力ファイルは Imakefile と呼ばれます。 これにより、構築のための様々な項目の記述から 計算機依存の部分 (コンパイラオプションやコマンド名の違い、特別な make ルールなど) を分離しておくことを可能にします。
オプション
以下のコマンド行オプションが受け付けられます。
−Ddefine
このオプションは直接 cpp に渡されます。 これは大抵ディレクトリに関する変数を設定するのに利用されます。 例えば X ウィンドウシステムでは、 TOPDIR に中心配布物のトップディレクトリ名を、 CURDIR にカレントディレクトリ名を トップディレクトリからの相対パスで設定するのに使われています。
−Idirectory
このオプションは直接 cpp に渡されます。 これは imake 用のテンプレートファイルと構成ファイルを捜すべき ディレクトリを指示するのに使われます。
−Ttemplate
cpp のマスターテンプレートファイルの名前を指示します。 (このファイルは通常 −I オプションで指定されたディレクトリにあります) デフォルトは Imake.tmpl です。
−f filename
ディレクトリ毎入力ファイルの名前を指定します。 デフォルトは Imakefile です。
−s filename
作成する make の記述ファイルの名前を指定します。 make の実行はしません。 filename としてッシュ (−) が指定されると、 出力が stdout になります。 デフォルトではmake の実行はせず、 ファイル Makefile を作成するだけです。
−e imake に、作成された Makefile を実行するように指示します。 デフォルトでは実行はユーザに任されています。
−v Makefile を作成するのに用いる cpp のコマンド行を 出力するよう指示します。
動作
imake はコマンド行で指定された オプション −I や −D とともに cpp を起動し、 以下の 3 行を送り込みます。
#define IMAKE_TEMPLATE "Imake.tmpl"
#define INCLUDE_IMAKEFILE "Imakefile"
#include IMAKE_TEMPLATE
コマンドオプション −T か −f が指定されていると、 Imake.tmpl、 Imakefile はそれぞれ、置き換えられます。
IMAKE_TEMPLATE は通常、 Imakefile は、 機種依存のパラメータ(cpp のシンボルとして指定される)ファイル、 サイト依存パラメータファイル、 変数定義のファイル、 cpp の make ルールを生成するためのマクロ関数を含むファイル、 および カレントディレクトリの Imakefile (この名前は INCLUDE_IMAKEFILE で指定される)を、 この順で読み込むようになっています。 Imakefile では、どのターゲットを作成するかを表すマクロ関数が使われ、 imake が適切なルールの作成を行います。
Imake コンフィギュレーションファイでは、 imake 変数と make 変数の 2 種類の変数を使用します。 imake 変数は、 imake の起動時に cpp によって解釈されます。 通例、大文字小文字の両方を使用します。 make 変数は、 Makefile へ書き込まれ、 後で make によって解釈されます。 通例、make 変数には大文字のみを使用します。
ルールファイル(通常、構成ディレクトリ中に Imake.rules という名前で 存在する)には、 そのプラットフォーム用に構成された 様々な cpp のマクロ関数が含まれます。 1 行以上の make ルールを生成するマクロを作れるよう、 Imake は文字列 “@@” を改行文字に置換えます。 例えば、以下のようなマクロが定義されているとき、
#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)
のように展開されます。
cpp が複数のタブと空白を単一の空白に置き換えてしまうようなシステムでは、 imake は必要なタブ (make ではタブと空白の違いは重要)を再生しようとします。 このため、コマンド行のコロンには逆スラッシュ(\)を前置しなければなりません。
X ウィンドウシステムでの使用
X ウィンドウシステムにおいて imake は、 ソースツリーと外部ソフトウェアの構築に広く使用されています。 前述のように、 ファイルの相対パス名での参照を容易にするため、 ふたつの特殊な変数 TOPDIR と CURDIR が設定されます。 例えば、 ディレクトリ lib/X/ (ソースツリーのトップに相対で)中に Makefile を作成するために、 以下のコマンドが自動的に作成されます。
% ../.././config/imake −I../.././config \
−DTOPDIR=../../. −DCURDIR=./lib/X
X のプログラムをソースツリーの外側で作成するときには、 特殊なシンボル UseInstalled を定義し、 TOPDIR と CURDIR は省略します。 構成ファイルが正しくインストールされているなら、 以下のようにシェルスクリプト xmkmf(1) が利用できます。
入力ファイル
以下は、 X より imake を使用した場合に読み込まれるファイルの概要です。 インデントは、どのファイルがどのファイルをインクルードしているかを 示します。
Imake.tmpl一般変数
site.defサイト依存。 BeforeVendorCF が定義されている
∗.cf機種依存
∗Lib.rules共有ライブラリのルール
site.defサイト依存。 AfterVendorCF が定義されている
Project.tmplX 固有の変数
∗Lib.tmpl共有ライブラリの変数
Imake.rulesルール
Imakefile
Library.tmplライブラリのルール
Server.tmplサーバのルール
site.def は、 ∗.cf ファイルの前後で 1 回ずつ、 計 2 回インクルードされる点にご注意ください。 普通、サイト用のカストマイズは、 ∗.cf ファイルの後に指定しますが、 コンパイラの種類など、 変数によっては、 他の変数の設定がそれに依存するため、 先に指定する必要があります。 初めて site.def がインクルードされた時、BeforeVendorCF 変数が定義され、 2 度目にインクルードされた時、AfterVendorCF 変数が定義されます。 site.def のコードは全て、これらのシンボルの内で、 #ifdef で定義されていなければいけません。
関連ファイル
/usr/tmp/tmp-imake.nnnnnncpp 用の一時入力ファイル
/usr/tmp/tmp-make.nnnnnnmake 用の一時入力ファイル
/lib/cppデフォルトの C プリプロセッサ
関連事項
make(1), xmkmf(1)
S. I. Feldman Make — A Program for Maintaining Computer Programs
環境変数
以下のような環境変数が設定できますが、 それが、imake の実行時に解り難い依存関係がもたらすため、 あまり勧められません。
IMAKEINCLUDE
C preprocessor. E.g. この変数が定義されているなら、 その値は C プリプロセッサに対して有効な include 引数でなければなりません。 (例 : “−I/usr/include/local”) 実際には、任意の有効な cpp 引数が使えます。
IMAKECPP
この変数が定義されているなら、 その値は有効なプリプロセッサプログラムのパスでなければなりません。 (例 : “/usr/local/cpp”) デフォルトでは、 imake は、/lib/cpp を使用します。
IMAKEMAKE
この変数が定義されているなら、 その値は有効な make プログラムのパス (例えば、/usr/local/make) でなければなりません。 デフォルトでは、 imake は、make プログラムを execvp (3) を使用して見つけ、実行します。 この変数は、−e オプションが指定された時のみ、使用できます。
著者
Todd Brunhoff, Tektronix and MIT Project Athena; Jim Fulton, MIT X Consortium
NEWS-OSRelease 4.2.1R