CRUNCHGEN(1)

名称
crunchgen - クランチバイナリ構築環境を作成する

書式
crunchgen [-fql] [-m makefile-name] [-c c-file-name] [-e exec-file-name] [conf-file]

解説
クランチバイナリ(crunched binary)は、 たくさんの別々のプログラムをひとつにまとめて 単一の実行形式にしたプログラムです。 クランチバイナリの main() 関数は、argv[0] の値をみて、 どのコンポーネントプログラムが実行されるべきかを決定します。 複数プログラムをクランチしてひとつにまとめる主たる理由は、 インストールフロッピあるいはシステム回復フロッピ上に、 できるだけ多くのプログラムを収納するためです。

crunchgen は conf-file に記述されたクランチバイナリのための設定項目を読み込み、 Makefile とそれに付随するトップレベルの C ソースファイルを生成します。 これらはビルド時に各コンポーネントプログラムからクランチした実行形式を 作成します。 オプションにより、 crunchgen は、各コンポーネントプログラムに対して、 そのソースディレクトリの Makefile から プログラムを構成するオブジェクトファイル(.o)を決定することも試みます。 この情報は実行のたびにキャッシュされます。 crunchgen は関連するもうひとつのプログラム crunchide を用い、全ての不要なシンボルを隠すことで コンポーネントプログラム間のリンク時のシンボル競合を防ぎます。

crunchgen 実行後、 ``make -f <conf-name>.mk'' を実行することで クランチバイナリを作成できます。 コンポーネントプログラムのオブジェクトファイルは既に作成されている 必要があります。 出力される makefile に含まれる ``objs'' ターゲットは、 各コンポーネントプログラムのソースディレクトリで make を実行し、 ユーザのためにオブジェクトファイルを作成してくれます。 しかしこのターゲットは自動的には実行されません。 リリースエンジニアリング環境では、オブジェクトを他のディレクトリで 修正するのは一般に望ましくないからです。

オプションは以下の通りです:

-c c-file-name
    出力する C のファイル名を c-file-name とします。デフォルトの名前は ``<conf-name>.c'' です。

-e exec-file-name
    クランチバイナリの実行形式ファイルの名前を exec-file-name とします。デフォルトの名前は ``<conf-name>'' です。

-f  キャッシュを消去し、キャッシュされていたパラメータを強制的に再計算します。

-l  名前の表示。このバイナリが対応する名前を一覧表示します。

-m makefile-name
    出力する Makefile の名前を makefile-name とします。デフォルトの名前は ``<conf-name>.mk'' です。

-q  静粛処理モード。状況報告メッセージを抑制します。

CRUNCHGEN コンフィギュレーションファイルコマンド
crunchgen は、クランチバイナリのコンポーネントについて記述した設定項目を conf-file から読み取ります。 最も単純な場合は、各コンポーネントプログラム名を、 そのソースファイルが置かれたトップレベルのディレクトリ名とともに、 単に列挙するだけです。 次に crunchgen は(ソースの makefile によって)オブジェクトファイルリストと その位置を求め、それをキャッシュします。 もっと特殊な場合には、 crunchgen が必要とするあらゆるパラメータを、ユーザが手動で指定することができます。

conf-file のコマンドは以下の通りです:

srcdirs dirname ...
    コンポーネントプログラムのソースディレクトリがあるソースツリーのリスト。 これらのディレクトリは BSD の ``<source-dir>/<progname>/'' 方式を 用いて検索されます。 srcdirs 行は複数あってもよく、ディレクトリは記述された順に検索されます。

progs progname ...
    クランチバイナリを構成するプログラムのリスト。 progs 行は複数あっても構いません。

libs libspec ...
    クランチバイナリのリンク時に含めるライブラリ指定のリスト。 libs 行は複数あっても構いません。

ln progname linkname
    argv[0] に linkname が現われたときはいつも progname を起動するよう、クランチバイナリに要請します。 これにより、起動時の名前によって振る舞いを変えるようなプログラムも 正しく動作するようにできます。
特別な状況、例えば ソースファイルがないとか、 従来の Makefile によらないビルドを行うといった 場合に対応するため、以下に述べる special コマンドを用いてコンポーネントプログラムの crunchgen パラメータを指定できます。

special progname srcdir pathname
    プログラム progname のソースディレクトリを指定します。 通常は指定されたディレクトリ srcdirs 内の progname ディレクトリを検索して決定されます。

special progname objdir pathname
    プログラム progname のオブジェクトディレクトリを指定します。 通常はディレクトリ srcdir 内の “obj” という名前のディレクトリを探し、もし見つからなければ、ディレクトリ srcdir 自身が objdir となります。

special progname objs object-file-name ...
    プログラム progname のオブジェクトファイルのリストを指定します。 通常は、 “srcdir / Makefile” をインクルードし $(OBJS) の値を出力するような一時 makefile を構築する ことで決定されます。

special progname objpaths full-pathname-to-object-file ...
    プログラム progname のオブジェクトファイルのパス名を指定します。 通常は objs リスト中の各ファイルのパス名の先頭に objdir を付加することで決定されます。

special progname keep symbol-name ...
    プログラム progname の保持リストに、指定するシンボルのリストを追加します。 各シンボルの前にはアンダスコアが付加され、 crunchide(1) フェーズでは -k オプションの引数となります このオプションはシンボルが衝突するときの最後の拠所ですが、 シンボル解決の唯一の方法である場合もあります。

実際に crunchgen が必要とするのは objpaths だけですが、 これは objdir と objs から求められ、これらも srcdir から求められます。 ですから、もし可能なら、初期のパラメータを指定し、あとは crunchgen に求めさせたほうが便利な場合もあります。

crunchgen が生成する makefile はオプションのターゲット objs を含みます。 これは、各コンポーネントプログラムのソースディレクトリ内で make を実行して オブジェクトファイルを作成するターゲットです。 これがうまく動作するためには srcdir および objs パラメータが正しいものでなくてはなりません。 もしこれらの値があるプログラムに対して不正なものであると、 objs ターゲットではそのプログラムはスキップされてしまいます。

実行例
crunchgen の入力コンフィギュレーションファイルの例として “kcopy.conf” の内容を示します。

	srcdirs /usr/src/bin /usr/src/sbin
	progs test cp echo sh fsck halt init mount umount myinstall
	ln test [       # test は [ として起動することもできる
	ln sh -sh       # init は argv[0] を "-sh" としてシェルを起動する
	special myprog objpaths /homes/leroy/src/myinstall.o # ソースなし
	libs -lutil -lcrypt

このコンフィギュレーションファイルでは、 いくつかの基本的なシステムユーティリティと 自家製のインストールプログラム ``myinstall'' から成る 小さなクランチバイナリを記述しています。 ソースディレクトリは全く指定されていませんが、 オブジェクトファイルは special 行で直接指定されています。

クランチバイナリ ``kcopy'' は以下のようにして作成できます:

	% crunchgen -m Makefile kcopy.conf    # Makefile と kcopy.c 作成
	% make objs             # コンポーネントプログラムの *.o 作成
	% make                  # クランチバイナリ kcopy の作成
	% kcopy sh              # シェル sh を起動できるかどうか試すと..
	$                       # うまくいった!

ここまでくれば、バイナリ ``kcopy'' をインストールフロッピにコピーし、 各コンポーネントプログラムの名前でハードリンクを設けることができます。

関連項目
crunchide(1)

警告
crunch はクランチバイナリ中の各コンポーネントプログラム間のリンク競合を 除去するのに気を配っていますが、依然としてリンクされたライブラリ間で 競合が発生する可能性が残っています。 ライブラリ順の入れ換えが必要な場合もありますし、 二つのライブラリ間にどうしても解消できない競合が発生し、 結局ひとつにまとめられない場合も稀にあります。

BSD のバージョンによっては、デフォルトのビルド環境では 単一ソースファイルのプログラムに対して 中間オブジェクトファイルを作成しないことがあります。 その場合は ``make objs'' ターゲットを用いてオブジェクトファイルを 作成するか、他の調整を施す必要があります。

作者
crunch は James da Silva <jds@cs.umd.edu> によって作成されました。

Copyright (c) 1994 University of Maryland. All Rights Reserved.