I'm very pleased to announce the release of our new website and documentation using the new toolchain with Hugo and AsciiDoctor. To get more information about the new toolchain please read the FreeBSD Documentation Project Primer[1], Hugo docs[2] and AsciiDoctor docs[3]. Acknowledgment: Benedict Reuschling <bcr@> Glen Barber <gjb@> Hiroki Sato <hrs@> Li-Wen Hsu <lwhsu@> Sean Chittenden <seanc@> The FreeBSD Foundation [1] https://docs.FreeBSD.org/en/books/fdp-primer/ [2] https://gohugo.io/documentation/ [3] https://docs.asciidoctor.org/home/ Approved by: doceng, core
462 lines
12 KiB
Groff
462 lines
12 KiB
Groff
.\"
|
|
.\" Copyright (c) 1994 University of Maryland
|
|
.\" All Rights Reserved.
|
|
.\"
|
|
.\" Permission to use, copy, modify, distribute, and sell this software and its
|
|
.\" documentation for any purpose is hereby granted without fee, provided that
|
|
.\" the above copyright notice appear in all copies and that both that
|
|
.\" copyright notice and this permission notice appear in supporting
|
|
.\" documentation, and that the name of U.M. not be used in advertising or
|
|
.\" publicity pertaining to distribution of the software without specific,
|
|
.\" written prior permission. U.M. makes no representations about the
|
|
.\" suitability of this software for any purpose. It is provided "as is"
|
|
.\" without express or implied warranty.
|
|
.\"
|
|
.\" U.M. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
|
|
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL U.M.
|
|
.\" BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
|
|
.\" IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
.\"
|
|
.\" Author: James da Silva, Systems Design and Analysis Group
|
|
.\" Computer Science Department
|
|
.\" University of Maryland at College Park
|
|
.\" %FreeBSD: src/usr.sbin/crunch/crunchgen/crunchgen.1,v 1.28 2002/05/30 07:51:22 ru Exp %
|
|
.\"
|
|
.\" $FreeBSD$
|
|
.Dd November 16, 2000
|
|
.Dt CRUNCHGEN 1
|
|
.Os
|
|
.Sh 名称
|
|
.Nm crunchgen
|
|
.Nd クランチバイナリ構築環境を作成する
|
|
.Sh 書式
|
|
.Bk -words
|
|
.Nm
|
|
.Op Fl foql
|
|
.Op Fl h Ar makefile-header-name
|
|
.Op Fl m Ar makefile-name
|
|
.Op Fl p Ar obj-prefix
|
|
.Op Fl c Ar c-file-name
|
|
.Op Fl e Ar exec-file-name
|
|
.Op Ar conf-file
|
|
.Ek
|
|
.Sh 解説
|
|
クランチバイナリ (crunched binary) は、
|
|
たくさんの別々のプログラムをひとつにまとめて
|
|
単一の実行形式にしたプログラムです。
|
|
クランチバイナリの
|
|
.Fn main
|
|
関数は、
|
|
.Va argv[0]
|
|
の値をみて、
|
|
どのコンポーネントプログラムが実行されるべきかを決定します。
|
|
複数プログラムをクランチしてひとつにまとめる主たる理由は、
|
|
インストールフロッピあるいはシステム回復フロッピ上に、
|
|
できるだけ多くのプログラムを収納するためです。
|
|
.Pp
|
|
.Nm
|
|
ユーティリティは
|
|
.Ar conf-file
|
|
に記述されたクランチバイナリのための設定項目を読み込み、
|
|
.Pa Makefile
|
|
とそれに付随するトップレベルの C ソースファイルを生成します。
|
|
これらはビルド時に各コンポーネントプログラムからクランチした実行形式を
|
|
作成します。
|
|
オプションにより、
|
|
.Nm
|
|
は、各コンポーネントプログラムに対して、
|
|
そのソースディレクトリの
|
|
.Pa Makefile
|
|
から
|
|
プログラムを構成するオブジェクトファイル (.o) を決定することも試みます。
|
|
この情報は実行のたびにキャッシュされます。
|
|
.Nm
|
|
ユーティリティは関連するもうひとつのプログラム
|
|
.Xr crunchide 1
|
|
を用い、全ての不要なシンボルを隠すことで
|
|
コンポーネントプログラム間のリンク時のシンボル競合を防ぎます。
|
|
.Pp
|
|
.Nm
|
|
ユーティリティは特殊な要件をパッケージの
|
|
.Pa Makefile
|
|
に課しており、このことが原因で
|
|
.Pa Makefile
|
|
が非
|
|
.Bx
|
|
ソース用に使えなくなっています。
|
|
特に、
|
|
.Pa Makefile
|
|
はターゲット
|
|
.Ic depend
|
|
を含むことが必要であり、全オブジェクトファイルを変数
|
|
.Va OBJS
|
|
で定義することが必要です。
|
|
場合によっては、偽の
|
|
.Pa Makefile
|
|
を使えるでしょう。
|
|
.Nm
|
|
は、ソースディレクトリ
|
|
.Pa foo
|
|
中の
|
|
.Pa Makefile
|
|
を見る前に、現在のディレクトリ中の
|
|
.Pa Makefile.foo
|
|
を見ます。
|
|
.Pp
|
|
.Nm
|
|
実行後、
|
|
.Dq Li make -f <conf-name>.mk
|
|
を実行することで
|
|
クランチバイナリを作成できます。
|
|
コンポーネントプログラムのオブジェクトファイルは既に作成されている
|
|
必要があります。
|
|
出力される makefile に含まれる
|
|
.Ic objs
|
|
ターゲットは、
|
|
各コンポーネントプログラムのソースディレクトリで
|
|
.Xr make 1
|
|
を実行し、ユーザのためにオブジェクトファイルを作成してくれます。
|
|
しかしこのターゲットは自動的には実行されません。
|
|
リリースエンジニアリング環境では、オブジェクトを他のディレクトリで
|
|
修正するのは一般に望ましくないからです。
|
|
.Pp
|
|
オプションは以下の通りです:
|
|
.Bl -tag -width indent
|
|
.It Fl c Ar c-file-name
|
|
出力する C のファイル名を
|
|
.Ar c-file-name
|
|
とします。デフォルトの名前は
|
|
.Pa <conf-name>.c
|
|
です。
|
|
.It Fl e Ar exec-file-name
|
|
クランチバイナリの実行形式ファイルの名前を
|
|
.Ar exec-file-name
|
|
とします。デフォルトの名前は
|
|
.Pa <conf-name>
|
|
です。
|
|
.It Fl f
|
|
キャッシュを消去し、キャッシュされていたパラメータを強制的に再計算します。
|
|
.It Fl l
|
|
名前の表示。このバイナリが対応する名前を一覧表示します。
|
|
.It Fl h Ar makefile-header-name
|
|
.Nm
|
|
が生成する
|
|
.Pa Makefile
|
|
の先頭に含めるファイルの名前を設定します。
|
|
make の変数を定義するのに便利です。
|
|
これには、
|
|
.Xr make 1
|
|
の動作に影響を与え、環境変数を介してでは面倒である、
|
|
.Va RELEASE_CRUNCH
|
|
が含まれます。
|
|
.It Fl m Ar makefile-name
|
|
出力する
|
|
.Pa Makefile
|
|
の名前を
|
|
.Ar makefile-name
|
|
とします。デフォルトの名前は
|
|
.Pa <conf-name>.mk
|
|
です。
|
|
.It Fl o
|
|
各プログラムの make ターゲットに対し、
|
|
.Dq Li make obj
|
|
ルールを追加します。
|
|
.It Fl p Ar obj-prefix
|
|
.Ic objdir
|
|
を計算するときに、
|
|
.Ic srcdir
|
|
の前に付けるパス名を設定します。
|
|
このオプションが存在しない場合、使用するプレフィックスは
|
|
.Ev MAKEOBJDIRPREFIX
|
|
環境変数の内容か、または
|
|
.Pa /usr/obj
|
|
です。
|
|
.It Fl q
|
|
静粛処理モード。状況報告メッセージを抑制します。
|
|
.El
|
|
.Sh CRUNCHGEN コンフィギュレーションファイルコマンド
|
|
.Nm
|
|
ユーティリティは、クランチバイナリのコンポーネントについて記述した設定項目を
|
|
.Ar conf-file
|
|
から読み取ります。
|
|
最も単純な場合は、各コンポーネントプログラム名を、
|
|
そのソースファイルが置かれたトップレベルのディレクトリ名とともに、
|
|
単に列挙するだけです。
|
|
次に
|
|
.Nm
|
|
ユーティリティは (ソースの makefile によって) オブジェクトファイルリストと
|
|
その位置を求め、それをキャッシュします。
|
|
もっと特殊な場合には、
|
|
.Nm
|
|
が必要とするあらゆるパラメータを、ユーザが手動で指定することができます。
|
|
.Pp
|
|
.Ar conf-file
|
|
のコマンドは以下の通りです:
|
|
.Bl -tag -width indent
|
|
.It Ic srcdirs Ar dirname ...
|
|
コンポーネントプログラムのソースディレクトリがあるソースツリーのリスト。
|
|
これらのディレクトリは
|
|
.Bx
|
|
の
|
|
.Dq Pa <source-dir>/<progname>/
|
|
方式を用いて検索されます。
|
|
.Ic srcdirs
|
|
行は複数あってもよく、ディレクトリは記述された順に検索されます。
|
|
.It Ic progs Ar progname ...
|
|
クランチバイナリを構成するプログラムのリスト。
|
|
.Ic progs
|
|
行は複数あっても構いません。
|
|
.It Ic libs Ar libspec ...
|
|
クランチバイナリのリンク時に含めるライブラリ指定のリスト。
|
|
.Ic libs
|
|
行は複数あっても構いません。
|
|
.It Ic buildopts Ar buildopts ...
|
|
各 make ターゲットに追加される、ビルドオプションのリスト。
|
|
.It Nm ln Ar progname linkname
|
|
.Va argv[0]
|
|
に
|
|
.Ar linkname
|
|
が現われたときはいつも
|
|
.Ar progname
|
|
を起動するよう、クランチバイナリに要請します。
|
|
これにより、起動時の名前によって振る舞いを変えるようなプログラムも
|
|
正しく動作するようにできます。
|
|
.El
|
|
.Pp
|
|
特別な状況、例えば
|
|
ソースファイルがないとか、
|
|
従来の
|
|
.Pa Makefile
|
|
によらないビルドを行うといった場合に対応するため、以下に述べる
|
|
.Ic special
|
|
コマンドを用いてコンポーネントプログラムの
|
|
.Nm
|
|
パラメータを指定できます。
|
|
.Bl -tag -width indent
|
|
.It Ic special Ar progname Ic srcdir Ar pathname
|
|
プログラム
|
|
.Ar progname
|
|
のソースディレクトリを指定します。
|
|
通常は指定されたディレクトリ
|
|
.Ic srcdirs
|
|
内の
|
|
.Ar progname
|
|
ディレクトリを検索して決定されます。
|
|
.It Ic special Ar progname Ic objdir Ar pathname
|
|
プログラム
|
|
.Ar progname
|
|
の
|
|
.Pa obj
|
|
ディレクトリを指定します。
|
|
通常、
|
|
.Pa obj
|
|
ディレクトリは、
|
|
ソースディレクトリ名の前に次のいずれかのコンポーネントを付けたものとして
|
|
計算され、コンポーネントには次の順番で優先度があります:
|
|
コマンドラインにおける
|
|
.Fl p
|
|
の引数、環境変数
|
|
.Ev MAKEOBJDIRPREFIX
|
|
の値、または
|
|
.Pa /usr/obj
|
|
です。
|
|
もしディレクトリが見つからなければ、ディレクトリ
|
|
.Ic srcdir
|
|
自身が
|
|
.Ic objdir
|
|
となります。
|
|
.It Ic special Ar progname Ic buildopts Ar buildopts
|
|
ビルドオプション集合を定義します。
|
|
.Ar progname
|
|
処理時には、
|
|
.Nm buildopts
|
|
で指定されたものに加え、これらが追加されて
|
|
.Xr make 1
|
|
のターゲットが作成されます。
|
|
.It Ic special Ar progname Ic objs Ar object-file-name ...
|
|
プログラム
|
|
.Ar progname
|
|
のオブジェクトファイルのリストを指定します。
|
|
通常は、
|
|
.Dq Ic srcdir Ns / Ns Pa Makefile
|
|
をインクルードし
|
|
.Va $(OBJS)
|
|
の値を出力するような一時 makefile を構築する
|
|
ことで決定されます。
|
|
.It Ic special Ar progname Ic objpaths Ar full-pathname-to-object-file ...
|
|
プログラム
|
|
.Ar progname
|
|
のオブジェクトファイルのパス名を指定します。
|
|
通常は
|
|
.Ic objs
|
|
リスト中の各ファイルのパス名の先頭に
|
|
.Ic objdir
|
|
を付加することで決定されます。
|
|
.It Ic special Ar progname Ic objvar Ar variable_name
|
|
プログラム
|
|
.Ar progname
|
|
用のオブジェクトファイルリストを保持する
|
|
.Xr make 1
|
|
変数名を設定します。
|
|
これは通常
|
|
.Va OBJS
|
|
ですが、
|
|
.Pa Makefile
|
|
によっては別の規約を使用したいかもしれませんし、
|
|
変数名の前にプログラム名を付けたいかもしれません。例えば
|
|
.Va SSHD_OBJS
|
|
など。
|
|
.It Ic special Ar progname Ic lib Ar library-name ...
|
|
.Ar progname Ns Pa .lo
|
|
を生成するためにオブジェクトファイルとリンクするライブラリを指定します。
|
|
標準ライブラリに含まれるルーチンを再定義するライブラリを使用するときに
|
|
有用です。
|
|
.It Ic special Ar progname Ic keep Ar symbol-name ...
|
|
プログラム
|
|
.Ar progname
|
|
の保持リストに、指定するシンボルのリストを追加します。
|
|
各シンボルの前にはアンダスコア
|
|
.Pq Ql _
|
|
が付加され、
|
|
.Xr crunchide 1
|
|
フェーズでは
|
|
.Fl k
|
|
オプションの引数となります。
|
|
このオプションはシンボルが衝突するときの最後の拠所ですが、
|
|
シンボル解決の唯一の方法である場合もあります。
|
|
.It Ic special Ar progname Ic ident Ar identifier
|
|
.Ar progname
|
|
に対する
|
|
.Pa Makefile Ns / Ns Tn C
|
|
識別子を設定します。
|
|
これは通常、
|
|
.Ar progname
|
|
を元に、
|
|
.Ql -
|
|
を
|
|
.Ql _
|
|
にマップし、他のすべての非識別子文字を無視することにより、生成されます。
|
|
この結果、
|
|
.Qq Li foo.bar
|
|
と
|
|
.Qq Li foobar
|
|
は、同一の識別子にマップされてしまいます。
|
|
.El
|
|
.Pp
|
|
実際に
|
|
.Nm
|
|
が必要とするのは
|
|
.Ic objpaths
|
|
だけですが、
|
|
これは
|
|
.Ic objdir
|
|
と
|
|
.Ic objs
|
|
から求められ、これらも
|
|
.Ic srcdir
|
|
から求められます。
|
|
ですから、もし可能なら、初期のパラメータを指定し、あとは
|
|
.Nm
|
|
に求めさせたほうが便利な場合もあります。
|
|
.Pp
|
|
.Nm
|
|
が生成する makefile はオプションのターゲット
|
|
.Ic objs
|
|
を含みます。
|
|
これは、各コンポーネントプログラムのソースディレクトリ内で
|
|
.Xr make 1
|
|
を実行してオブジェクトファイルを作成するターゲットです。
|
|
これがうまく動作するためには
|
|
.Ic srcdir
|
|
および
|
|
.Ic objs
|
|
パラメータが正しいものでなくてはなりません。
|
|
もしこれらの値があるプログラムに対して不正なものであると、
|
|
.Ic objs
|
|
ターゲットではそのプログラムはスキップされてしまいます。
|
|
.Sh 実行例
|
|
.Nm
|
|
の入力コンフィギュレーションファイルの例として
|
|
.Dq Pa kcopy.conf
|
|
の内容を示します。
|
|
.Pp
|
|
.Bd -literal -offset indent
|
|
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
|
|
.Ed
|
|
.Pp
|
|
このコンフィギュレーションファイルでは、
|
|
いくつかの基本的なシステムユーティリティと
|
|
自家製のインストールプログラム
|
|
.Dq Pa myinstall
|
|
から成る
|
|
小さなクランチバイナリを記述しています。
|
|
ソースディレクトリは全く指定されていませんが、
|
|
オブジェクトファイルは
|
|
.Ic special
|
|
行で直接指定されています。
|
|
.Pp
|
|
さらに、
|
|
.Dq Pa anotherprog
|
|
構築時には、引数
|
|
.Pp
|
|
.Dl -DNO_FOO WITHOUT_BAR=YES
|
|
.Pp
|
|
がすべてのビルドターゲットに対して追加されます。
|
|
.Pp
|
|
クランチバイナリ
|
|
.Dq Pa kcopy
|
|
は以下のようにして作成できます:
|
|
.Pp
|
|
.Bd -literal -offset indent
|
|
% crunchgen -m Makefile kcopy.conf # Makefile と kcopy.c 作成
|
|
% make objs # コンポーネントプログラムの *.o 作成
|
|
% make # クランチバイナリ kcopy の作成
|
|
% kcopy sh # シェル sh を起動できるかどうか試すと..
|
|
$ # うまくいった!
|
|
.Ed
|
|
.Pp
|
|
ここまでくれば、バイナリ
|
|
.Dq Pa kcopy
|
|
をインストールフロッピにコピーし、
|
|
各コンポーネントプログラムの名前でハードリンクを設けることができます。
|
|
.Sh 関連項目
|
|
.Xr crunchide 1
|
|
.Xr make 1
|
|
.Sh 警告
|
|
.Nm
|
|
はクランチバイナリ中の各コンポーネントプログラム間のリンク競合を
|
|
除去するのに気を配っていますが、依然としてリンクされたライブラリ間で
|
|
競合が発生する可能性が残っています。
|
|
ライブラリ順の入れ換えが必要な場合もありますし、
|
|
二つのライブラリ間にどうしても解消できない競合が発生し、
|
|
結局ひとつにまとめられない場合も稀にあります。
|
|
.Pp
|
|
.Bx
|
|
のバージョンによっては、デフォルトのビルド環境では
|
|
単一ソースファイルのプログラムに対して
|
|
中間オブジェクトファイルを作成しないことがあります。
|
|
その場合は
|
|
.Dq Li make objs
|
|
ターゲットを用いてオブジェクトファイルを
|
|
作成するか、他の調整を施す必要があります。
|
|
.Sh 作者
|
|
.Nm
|
|
ユーティリティは
|
|
.An James da Silva Aq jds@cs.umd.edu
|
|
によって作成されました。
|
|
.Pp
|
|
Copyright (c) 1994 University of Maryland.
|
|
All Rights Reserved.
|