EN JA
BUILD(7)
BUILD(7) FreeBSD Miscellaneous Information Manual BUILD(7)

名称

buildどのようにシステムを構築するかの情報

解説

FreeBSD システムとそのアプリケーションのためのソースは、3 つの異なったディレクトリ、通常 /usr/src, /usr/doc/usr/ports に含まれています。これらのディレクトリは、 csup(1), svn(1) または portsnap(8) で更新されるまで、最初に空であるか、または存在しないかもしれません。ディレクトリ /usr/src は、システムを役に立つ状態に再建する必要があるものとして大まかに定義されている、“基本システム”のソースを含んでいます。ディレクトリ /usr/doc は、マニュアルページを除いて、システム文書のためのソースを含んでいます。ディレクトリ /usr/ports は、サードパーティのアプリケーションを構築して、インストールするための一貫したインタフェースを提供するツリーを含んでいます。 port 構築プロセスに関する詳細については、 ports(7) を参照してください。

そのディレクトリにあるものを構築して、インストールするために、それぞれこれらのディレクトリで、 make(1) コマンドを使用します。それらのディレクトリの任意のディレクトリまたはサブディレクトリで make(1) コマンドを発行することは、そのディレクトリのすべてのサブディレクトリで同じコマンドを発行するのと同じ効果があります。指定されてるターゲットがなければ、そのディレクトリのものが、単に構築されます。

ソースツリーは、読み込み専用であることが認められています。 make(1) で説明されるように、オブジェクトは、環境変数 MAKEOBJDIRPREFIX によって指定された個別のオブジェクトディレクトリ階層構造に、または変数 MAKEOBJDIRPREFIX が設定されないなら、 /usr/obj の下で、通常、構築されます。与えられたソースディレクトリについて、正規のオブジェクトディレクトリは、 make(1) 変数 MAKEOBJDIRPREFIX が設定されるなら、 ${MAKEOBJDIRPREFIX}${.CURDIR}、またはこの変数が設定されていないなら、 /usr/obj${.CURDIR} となります。クロス構築は、下記の buildworld ターゲットのために文書で説明されているようにオブジェクトディレクトリを設定します。

構築は、下記の 環境変数 セクションで説明された make(1) 変数を定義し、 make.conf(5) に文書化された変数によって制御されます。

次ののリストは、構築システムによってサポートされたターゲットのための名前と動作を規定しています:

clean
構築プロセスの間に作成されたすべてのファイルを削除します。
cleandepend
以前の“ make depend”ステップによって生成されたファイル ${.OBJDIR}/${DEPENDFILE} 削除します。
cleandir
存在しているなら、正規のオブジェクトディレクトリを削除するか、または行わないなら、“ make clean cleandepend”と同等な動作を実行します。それが存在しているなら、このターゲットは、 ${.CURDIR}obj リンクを取り外します。

make cleandir”を二度を実行することは賢明です: 最初の実行は、正規のオブジェクトディレクトリを削除し、2 番目のものは、 ${.CURDIR} をクリアします。

depend
ファイル ${.OBJDIR}/${DEPENDFILE} の構築の依存のリストを生成します。
install
変数 DESTDIR で指定されたインストールディレクトリの階層構造の適切な位置に構築の結果をインストールします。
obj
カレントディレクトリに関連した正規のオブジェクトディレクトリを作成します。
objlink
${.CURDIR} の正規のオブジェクトディレクトリにシンボリックリンクを作成します。
tags
make(1) の変数 CTAGS で指定されたプログラムを使用して、tag ファイルを生成します。 build (構築) システムは、 ctags(1)GNU Global をサポートしています。

ディレクトリ /usr/src の下の、他のサポートされたターゲットは、次の通りです:

buildenv
システムをクロス構築するために、環境変数が設定されている状態で、対話的なシェルを起動します。ターゲットのアーキテクチャは、 make(1) 変数 TARGET_ARCHTARGET で指定される必要があります。

このターゲットは、コンパイラ、リンカ、アセンブラ、ヘッダとライブラリを含む完全なクロスツールチェーン (cross-toolchain) が構築された後のみ、役にたちます。下記の toolchain ターゲットを参照してください。

buildworld
カーネル以外のすべてのものを構築し、 etcrelease ディレクトリ内のファイルを設定します。使用される実際の構築位置の接頭辞は、ネイティブの構築のためには、 ${MAKEOBJDIRPREFIX}${.CURDIR} で、クロス構築と変数 CROSS_BUILD_TESTING が設定されたネイティブの構築のためには、 ${MAKEOBJDIRPREFIX}/${TARGET}${.CURDIR} です。
cleanworld
前の buildworld ステップで構築されたターゲットのクリーンアップを試みます。
distributeworld
前の buildworld ステップでコンパイルされたすべてを配布します。ファイルは、 make(1) 変数 DISTDIR によって指定されたディレクトリの階層構造に置かれます。このターゲットは、リリースを構築している間に使用されます。 release(7) を参照してください。
packageworld
DISTDIR に結果を置いて、 distributeworld の結果をアーカイブします。このターゲットは、リリースを構築している間に使用されます。 release(7) を参照してください。
installworld
前の buildworld ステップで構築されたものすべてを make(1) 変数 DESTDIR で指されたディレクトリの階層構造にインストールします。

NFS ファイルシステムにインストールして、 -j オプションをつけて make(1) を実行しているなら、 rpc.lockd(8) がクライアントとサーバの両方で実行していることを確認してください。ブート時にどのように開始させるかについては、 rc.conf(5) を参照してください。

toolchain
システムの残りを構築するために必要な構築ツールチェーン (toolchain) を作成します。クロスアーキテクチャの構築のために、このステップは、クロスツールチェーン (cross-toolchain) を作成します。
universe
各アーキテクチャについて、 LINT を含むそのアーキテクチャに関してすべてのカーネルに対して buildworld に続いて buildkernel を実行します。このコマンドは、長い時間かかります。
update
make.conf(5) で設定されるように更新されたされたソースを取得します。
targets
world と kernel ターゲットのためにサポートされた TARGET / TARGET_ARCH のペアのリストを印刷します。
tinderbox
universe と同じターゲットを実行します。さらに、終了時にすべての失敗したターゲットの概要を印刷し、 1 つでも失敗していれば、エラーで終了します。
toolchains
build システムによってサポートされる各アーキテクチャに対して build toolchain を作成します。

/usr/src のカーネルの特有の構築ターゲットは、次の通りです:

buildkernel
カーネルとカーネルモジュールを再構築します。
installkernel
カーネルとカーネルモジュールをディレクトリ ${DESTDIR}/boot/kernel にインストールし、現在実行しているカーネルがそれに含まれているなら、存在しているディレクトリを kernel.old に名前を変更します。 ${DESTDIR} の下のターゲットディレクトリは、 INSTKERNNAMEKODIR make(1) 変数を使用して変更できます。
distributekernel
ディレクトリ ${DISTDIR}/kernel/boot/kernel にカーネルをインストールします。このターゲットは、リリースを構築している間に使用されます。 release(7) を参照してください。
packagekernel
DISTDIR に結果を置いて、 distributekernel の結果をアーカイブします。このターゲットは、リリースを構築している間に使用されます。 release(7) を参照してください。
kernel
buildkernel に続いて installkernel を行うのと同等です。
kernel-toolchain
カーネルのコンパイルに必要なツールを再構築します。最初に buildworld を行わなかったなら、これを使用します。
reinstallkernel
ターゲットディレクトリの内容を上書きして、カーネルとカーネルモジュールを再インストールします。 installkernel ターゲットと同様に、 make(1) 変数 INSTKERNNAME を使用してターゲットディレクトリを指定することができます。

変数 DESTDIR によって指示されるインストール先ディレクトリをクリーンアップするための便利なターゲットは、次の通りです:

check-old
システム中の古いファイルとディレクトリのリストを印刷 (表示) します。
delete-old
不要になったベースシステムのファイルとディレクトリを対話形式に削除します。 -DBATCH_DELETE_OLD_FILES がコマンドラインで指定されるとき、削除操作は、非対話形式に行われます。変数 DESTDIR, TARGET_ARCHTARGET は、“ make installworld”で設定されるべきです。
delete-old-libs
不要になったベースシステムライブラリを対話形式に削除します。このターゲットは、サードパーティのソフトウェアがこれらのライブラリを使用しない場合にだけ使用されるべきです。 -DBATCH_DELETE_OLD_FILES がコマンドラインで指定されるとき、削除操作は、非対話形式に行われます。変数 DESTDIR, TARGET_ARCHTARGET は、“ make installworld”で設定されるべきです。

環境変数

すべての構築に影響する変数は、次の通りです:
DEBUG_FLAGS
/usr/src 下のすべてのユーザランドのバイナリを構築するために使用される 1 組ののデバッグフラグを定義します。 DEBUG_FLAGS が定義されるとき、 installinstallworld ターゲットは、デバッグ情報がインストールされたバイナリで保持し続けるように、ストリップしないで現在の MAKEOBJDIRPREFIX からバイナリをインストールします。
DESTDIR
構築されたオブジェクトがインストールされるディレクトリの階層構造の接頭辞。設定されていないなら、 DESTDIR は、空の文字列をデフォルトとします。
MAKEOBJDIRPREFIX
構築オブジェクトのツリーのディレクトリ名のための接頭辞を定義します。定義されないなら、 /usr/obj をデフォルトとします。この変数は、 /etc/make.conf またはコマンドラインを通して設定されるのではなく、環境変数でのみ設定されべきです。
NO_WERROR
定義されるなら、makefile がその他を警告したとしても、コンパイラの警告によって構築を停止しません。
WITH_CTF
定義されるなら、構築プロセスは、構築オブジェクトで DTrace CTF 変換ツールを実行します。

さらに、 /usr/src の構築は、次の make(1) 変数によって影響されます:

KERNCONF
様々なカーネル make ターゲットを構築してインストールするカーネルを上書きします。デフォルトは、 GENERIC です。
KERNFAST
設定されるなら、構築するターゲット buildkernel は、 NO_KERNELCLEAN, NO_KERNELCONFIG, NO_KERNELDEPENDNO_KERNELOBJ の設定をデフォルトとします。 1 以外の値に設定されると、 KERNCONF は、 KERNFAST の値に設定されます。
LOCAL_DIRS
設定されるなら、この変数は、ソースツリーのルート (根) に相対的な、構築するための追加ディレクトリのリストを提供します。
PORTS_MODULES
buildkernelinstallkernel 処理の一部として、構築されインストールされるべきカーネルモジュールがある port のリスト。

make PORTS_MODULES=emulators/kqemu-kmod kernel
SUBDIR_OVERRIDE
サブディレクトリのデフォルトリストを上書きし、この変数で指定されたサブディレクトリのみを構築します。この変数は、デバッグで構築に失敗したとき、役に立ちます。

make some-target SUBDIR_OVERRIDE=foo/bar
TARGET
ターゲットのハードウェアプラットホーム。これは、“ uname -m”の出力に類似しています。ターゲットアーキテクチャをクロス構築するために必要な変数です。例えば、 PC98 マシンのためのクロス構築は、 TARGET_ARCH= i386TARGET= pc98 を必要とします。設定されていないなら、 TARGET は、現在のハードウェアプラットフォームをデフォルトとします。
TARGET_ARCH
ターゲットとなるマシンプロセッサアーキテクチャ。この環境変数は、“ uname -p”に類似しています。異なるアーキテクチャのためにクロス構築するには、この環境変数を設定してください。設定されないなら、 TARGET_ARCH は、現在のマシンアーキテクチャをデフォルトとし、また、 TARGET が設定されていないなら、その場合、そのプラットフォームのために適切な値をデフォルトとします。通常、 TARGET を設定する必要があるだけです。

また、ディレクトリ /usr/src 下での構築は、 make(1)-D オプションを使用して、1 つ以上の次のシンボルを定義することによって、影響されます:

NO_CLEANDIR
設定されるなら、オブジェクトツリーの部分をクリーンにする構築ターゲットは、“make cleandir”の代わりに“make clean”と同等なものを使用します。
NO_CLEAN
設定されるなら、オブジェクトツリーのファイルは、全くクリーンとなりません。 NO_CLEAN を設定することは、 NO_KERNELCLEAN の意味を含むので、 NO_CLEAN が設定されるとき、カーネルオブジェクトは、何もクリーンされません。
NO_CTF
設定されるなら、構築プロセスは、オブジェクトの構築で、 DTrace CTF 変換ツールを実行しません。
NO_SHARE
設定されるなら、構築は、 /usr/src/share サブディレクトリの中に降下しません (すなわち、マニュアルページ、ローカルデータファイル、タイムゾーンデータファイル、と他の /usr/src/share ファイルは、それらのソースから再構築されません)。
NO_KERNELCLEAN
設定されるなら、構築プロセスは、 buildkernel ターゲットの一部として“make clean”を実行しません。
NO_KERNELCONFIG
設定されるなら、構築プロセスは、 buildkernel ターゲットの一部として config(8) を実行しません。
NO_KERNELDEPEND
設定されるなら、構築プロセスは、 buildkernel ターゲットの一部として“make depend”を実行しません。
NO_KERNELOBJ
設定されるなら、構築プロセスは、 buildkernel ターゲットの一部として“make obj”を実行しません。
NO_DOCUPDATE
設定されるなら、更新プロセスは、“make update”ターゲットの一部として FreeBSD 文書のソースを更新しません。
NO_PORTSUPDATE
設定されるなら、更新プロセスは、“make update”ターゲットの一部として Ports ツリーを更新しません。
NO_WWWUPDATE
設定されるなら、更新プロセスは、“make update”ターゲットの一部として www ツリーを更新しません。

ディレクトリ /usr/doc の下の構築は、次の make(1) 変数によって影響されます:

DOC_LANG
設定されているなら、その内容として指定された言語のサブディレクトリに文書を構築すること禁止します。デフォルトの動作は、すべての言語のために文書を構築することです。

universe ターゲットを使用する構築は、次の make(1) 変数に影響されます:

JFLAG
world と kernel を構築するために使用される、それぞれの make(1) 呼び出しに、この変数の値を渡します。連続的に各アーキテクチャを構築する間に、単一のアーキテクチャの構築で複数のジョブを有効にするために、これを使用することができます。
MAKE_JUST_KERNELS
それぞれサポートされたアーキテクチャのためにカーネルのみを構築します。
MAKE_JUST_WORLDS
それぞれサポートされたアーキテクチャのために world のみを構築します。
UNIVERSE_TARGET
world と 1 つ以上のカーネルを構築するデフォルトアクションの代わりにそれぞれサポートされたアーキテクチャのために指定された make(1) ターゲットを実行します。

関連ファイル

/usr/doc/Makefile
/usr/doc/share/mk/doc.project.mk
/usr/ports/Mk/bsd.port.mk
/usr/ports/Mk/bsd.sites.mk
/usr/share/examples/etc/make.conf
/usr/src/Makefile
/usr/src/Makefile.inc1

使用例

最新のソースから利用者のシステムを更新する“承認された”方法については、 src/UPDATINGCOMMON ITEMS のセクションを参照してください。

i386 ホスト上で sparc64 アーキテクチャのためのシステムをクロス構築するために次のコマンドのシーケンスを使用することできます:

cd /usr/src 
make TARGET=sparc64 buildworld 
make TARGET=sparc64 DESTDIR=/clients/sparc64 installworld

作者

Mike W. Meyer <mwm@mired.org>.
October 10, 2012 FreeBSD