EN JA
CRUNCHGEN(1)
CRUNCHGEN(1) FreeBSD General Commands Manual CRUNCHGEN(1)

名称

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

書式

crunchgen [ -foql][ -h  makefile-header-name][ -m  makefile-name][ -p  obj-prefix][ -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(1) を用い、全ての不要なシンボルを隠すことでコンポーネントプログラム間のリンク時のシンボル競合を防ぎます。

crunchgen ユーティリティは、特殊な要件をパッケージの Makefile に課しており、このことが原因で非 BSD ソース用に使えなくなっています。特に、 Makefile は、ターゲット depend を含むことが必要であり、全オブジェクトファイルを変数 OBJS で定義することが必要です。場合によっては、偽の Makefile を使えるでしょう。 crunchgen は、ソースディレクトリ foo 中の Makefile を見る前に、現在のディレクトリ中の Makefile.foo を見ます。

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

オプションは、次の通りです:

-c c-file-name
出力する C のファイル名を c-file-name とします。デフォルトの名前は、 <conf-name>.c です。
-e exec-file-name
クランチバイナリの実行形式ファイルの名前を exec-file-name とします。デフォルトの名前は、 <conf-name> です。
-f
キャッシュを消去し、キャッシュされていたパラメータを強制的に再計算します。
-l
名前の表示。このバイナリが対応する名前を一覧表示します。
-h makefile-header-name
crunchgen が生成する Makefile の先頭に含めるファイルの名前を設定します。 make の変数を定義するのに便利です。これには、 make(1) の動作に影響を与え、環境変数を介してでは面倒である、 RELEASE_CRUNCH が含まれます。
-m makefile-name
出力する Makefile の名前を makefile-name とします。デフォルトの名前は、 <conf-name>.mk です。
-o
各プログラムの make ターゲットに対し、“ make obj”ルールを追加します。
-p obj-prefix
objdir を計算するときに、 srcdir の前に付けるパス名を設定します。このオプションが存在しない場合、使用するプレフィックスは、 MAKEOBJDIRPREFIX 環境変数の内容か、または /usr/obj です。
-q
静粛処理モード。状況報告メッセージを抑制します。

CRUNCHGEN 設定ファイルコマンド

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

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

srcdirs dirname ...
コンポーネントプログラムのソースディレクトリがあるソースツリーのリスト。これらのディレクトリは、 BSD の“ <source-dir>/<progname>/”方式を用いて検索されます。 srcdirs 行は、複数あってもよく、ディレクトリは、記述された順に検索されます。
progs progname ...
クランチバイナリを構成するプログラムのリスト。 progs 行は、複数あっても構いません。
libs libspec ...
クランチバイナリのリンク時に含めるライブラリ指定のリスト。 libs 行は、複数あっても構いません。
libs_so libspec ...
クランチバイナリに動的にリンクされるライブラリのリスト指定。これらのライブラリは、それらを必要とするコンポーネントプログラムがクランチバイナリから実行されるとき、ランタイムリンクエディタ rtld(1) によって利用可能にする必要があります。複数の libs_so 行を指定することができます。 libs_so ディレクティブ (指示) は、 libs 行で根拠もなく指定されたライブラリを上書きします。
buildopts buildopts ...
各 make ターゲットに追加される、ビルドオプションのリスト。
ln progname linkname
argv[0]linkname が現われたときはいつも progname を起動するよう、クランチバイナリに要請します。これにより、起動時の名前によって振る舞いを変えるようなプログラムも正しく動作するようにできます。

特別な状況、例えばソースファイルがないとか、従来の Makefile によらないビルドを行うといった場合に対応するため、以下に述べる special コマンドを用いてコンポーネントプログラムの crunchgen パラメータを指定できます。

special progname srcdir pathname
プログラム progname のソースディレクトリを指定します。通常は、指定されたディレクトリ srcdirs 内の progname ディレクトリを検索して決定されます。
special progname objdir pathname
プログラム prognameobj ディレクトリを指定します。通常、 obj ディレクトリは、ソースディレクトリ名の前に次のいずれかのコンポーネントを付けたものとして計算され、コンポーネントには、次の順番で優先度があります: コマンドラインにおける -p の引数、環境変数 MAKEOBJDIRPREFIX の値、または /usr/obj です。もしディレクトリが見つからなければ、ディレクトリ srcdir 自身が objdir となります。
special progname buildopts buildopts
ビルドオプション集合を定義します。 progname 処理時には、 buildopts で指定されたものに加え、これらが追加されて make(1) のターゲットが作成されます。
special progname objs object-file-name ...
プログラム progname のオブジェクトファイルのリストを指定します。通常は、“ srcdir/ Makefile”をインクルードし $(OBJS) の値を出力するような一時 makefile を構築することで決定されます。
special progname objpaths full-pathname-to-object-file ...
プログラム progname のオブジェクトファイルのパス名を指定します。通常は、 objs リスト中の各ファイルのパス名の先頭に objdir を付加することで決定されます。
special progname objvar variable_name
プログラム progname 用のオブジェクトファイルリストを保持する make(1) 変数名を設定します。これは、通常 OBJS ですが、 Makefile によっては別の規約を使用したいかもしれませんし、変数名の前にプログラム名を付けたいかもしれません。例えば SSHD_OBJS など。
special progname lib library-name ...
progname .lo を生成するためにオブジェクトファイルとリンクするライブラリを指定します。標準ライブラリに含まれるルーチンを再定義するライブラリを使用するときに有用です。
special progname keep symbol-name ...
プログラム progname の保持リストに、指定するシンボルのリストを追加します。各シンボルの前にはアンダスコア (‘ _’) が付加され、 crunchide(1) フェーズでは、 -k オプションの引数となります。このオプションは、シンボルが衝突するときの最後の拠所ですが、シンボル解決の唯一の方法である場合もあります。
special progname ident identifier
progname に対する Makefile/C 識別子を設定します。これは、通常、 progname を元に、‘ -’を‘ _’にマップし、他のすべての非識別子文字を無視することにより、生成されます。この結果、“ foo.bar”と“ foobar”は、同一の識別子にマップされてしまいます。

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

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

実行例

crunchgen の入力設定ファイルの例として“ kcopy.conf”の内容を示します。

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

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

さらに、“ anotherprog”構築時には、引数

-DNO_FOO WITHOUT_BAR=YES

がすべてのビルドターゲットに対して追加されます。

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

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

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

libs_so コマンドが使用されていたなら、指定されたライブラリのコピーもまた、インストールフロッピにコピーする必要があることに注意してください。

関連項目

crunchide(1), make(1), rtld(1)

作者

crunchgen ユーティリティは、 James da Silva <jds@cs.umd.edu>によって書かれました。

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

libs_so キーワードは、2005 年に Adrian Steinmann <ast@marabu.ch>と Ceri Davies <ceri@FreeBSD.org>によって追加されました。

警告

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

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

December 23, 2005 FreeBSD