CRUNCHGEN(1) FreeBSD 一般コマンドマニュアル 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 に課してお り、このことが原因で 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 −f −l −h makefile-header-name −m makefile-name −o −p obj-prefix −q CRUNCHGEN コンフィギュレーションファイルコマンド |
crunchgen ユーティリティは、クランチバイナリのコンポーネントについて記述 した設定項目を conf-file から読み取ります。最も単純な場合は、各コンポーネ ントプログラム名を、そのソースファイルが置かれたトップレベルのディレクト リ名とともに、単に列挙するだけです。次に crunchgen ユーティリティは (ソー スの makefile によって) オブジェクトファイルリストとその位置を求め、それ をキャッシュします。もっと特殊な場合には、 crunchgen が必要とするあらゆる パラメータを、ユーザが手動で指定することができます。 conf-file のコマンドは以下の通りです: |
srcdirs dirname ...
コンポーネントプログラムのソースディレクトリがあるソースツリーの リスト。これらのディレクトリは BSD の ‘‘<source-dir>/<progname>/’’ 方式を用いて検索されます。 srcdirs 行は複数あってもよく、ディレクトリは記述された順に検索されます。 progs progname ... libs libspec ... buildopts buildopts ... ln progname linkname 特別な状況、例えばソースファイルがないとか、従来の Makefile によらないビ ルドを行うといった場合に対応するため、以下に述べる special コマンドを用い てコンポーネントプログラムの crunchgen パラメータを指定できます。 special progname srcdir
pathname special progname objdir
pathname special progname buildopts
buildopts special progname objs
object-file-name ... special progname objpaths
full-pathname-to-object-file ... special progname objvar
variable_name special progname lib library-name
... special progname keep symbol-name
... special progname ident
identifier 実際に crunchgen が必要とするのは objpaths だけですが、これは objdir と objs から求められ、これらも 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" としてシェルを起動する 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’’ をインストールフロッピにコピーし、各コ ンポーネントプログラムの名前でハードリンクを設けることができます。 |
関連項目
警告
crunchgen はクランチバイナリ中の各コンポーネントプログラム間のリンク競合 を除去するのに気を配っていますが、依然としてリンクされたライブラリ間で競 合が発生する可能性が残っています。ライブラリ順の入れ換えが必要な場合もあ りますし、二つのライブラリ間にどうしても解消できない競合が発生し、結局ひ とつにまとめられない場合も稀にあります。 BSD のバージョンによっては、デフォルトのビルド環境では単一ソースファイル のプログラムに対して中間オブジェクトファイルを作成しないことがあります。 その場合は ‘‘make objs’’ ターゲットを用いてオブジェクトファイルを作成する か、他の調整を施す必要があります。 |
作者
crunchgen ユーティリティは James da Silva 〈jds@cs.umd.edu〉 によって作成さ れました。 Copyright (c) 1994 University of Maryland. All Rights Reserved. FreeBSD 10.0 November 16, 2000 FreeBSD 10.0 |