crunchgen(1) FreeBSD 一般コマンドマニュアル

crunchgen

前のページ 上に戻る 次のページ

crunchgen


               [-p obj-prefix] [-c c-file-name] [-e exec-file-name]
               [conf-file]


解説

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

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

     crunchgen は特殊な要件をパッケージの Makefile に課しており、このことが原
     因で 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
             このオプションが存在しない場合、使用するプレフィックスは
             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
             行は複数あっても構いません。

     buildopts buildopts ...
             各 make ターゲットに追加追加される、ビルドオプションのリスト。

     ln progname linkname
             argv[0]linkname が現われたときはいつも progname を起動するよ
             う、クランチバイナリに要請します。これにより、起動時の名前によっ
             て振る舞いを変えるようなプログラムも正しく動作するようにできま
             す。

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

     special progname srcdir pathname
             プログラム用 progname のオブジェクトファイル一覧を保持する make
             変数の名前を設定します。これは通常 OBJS ですが、Makefile によって
             は、他の約束が好ましい場合や、 SSHD_OBJS のようにプログラム名が前
             に付くものがあります。

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

     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 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) を実行
     してオブジェクトファイルを作成するターゲットです。これがうまく動作するた
     めには srcdir および objs パラメータが正しいものでなくてはなりません。も
     しこれらの値があるプログラムに対して不正なものであると、 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" としてシェルを起動する
           -DNO_FOO WITHOUT_BAR=YES

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

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

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

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


関連項目

     crunchide(1) make(1)


警告

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

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


作者

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

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

FreeBSD 4.4                    November 16, 2000                   FreeBSD 4.4

ABELNET VPSサービス