[インデックス 15388] ファイルの概要
このコミットは、Go言語のビルドシステムにおける環境設定の調整に関するものです。具体的には、src/all.rc
というシェルスクリプトに一行の変更を加え、Goツールがシステムパス(/bin
)から確実にアクセスできるようにしています。これにより、Goのテストスイート、特にruntime
パッケージ内のテストが、go
コマンドを正しく見つけられるようになります。
コミット
commit 046e035fcaf4727e9ac7af554beea87d02618f15
Author: Akshat Kumar <seed@mail.nanosouffle.net>
Date: Sat Feb 23 00:22:39 2013 +0100
all.rc: make sure the Go tools end up in /bin
At least one test (in package runtime) depends
on `go' being in $path. We simply bind GOROOT/bin
before /bin to make sure the latest copy of the
binary is accessible there.
R=rsc, rminnich, ality
CC=golang-dev
https://golang.org/cl/7391047
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/046e035fcaf4727e9ac7af554beea87d02618f15
元コミット内容
このコミットの目的は、Goのビルドプロセスにおいて、Goツール(go
コマンドなど)がシステムパス(/bin
)から確実に利用できるようにすることです。特に、runtime
パッケージ内のテストがgo
コマンドの存在に依存しているため、ビルドされたばかりの最新のGoバイナリがテスト実行時に正しく参照されるように、$GOROOT/bin
を/bin
よりも優先してパスにバインドしています。
変更の背景
Go言語のビルドシステムは、ソースコードからコンパイラ、ツール、標準ライブラリなどを構築します。このプロセス中、ビルドされたばかりのGoツール(例: go
コマンド)は、一時的に$GOROOT/bin
ディレクトリに配置されます。しかし、一部のテスト、特にGoのランタイム(runtime
パッケージ)に関するテストは、go
コマンドがシステムパス($PATH
環境変数)を通じてアクセス可能であることを前提としています。
このコミット以前は、ビルド環境のパス設定によっては、古いバージョンのgo
コマンドや、$GOROOT/bin
内の最新のバイナリが正しく優先されない可能性がありました。これにより、テストが失敗したり、予期せぬ動作を引き起こしたりする問題が発生していました。この変更は、このような依存関係を解決し、ビルドの信頼性を向上させることを目的としています。
前提知識の解説
1. Go言語のビルドシステム
Go言語のビルドは、all.bash
(Unix系)やall.bat
(Windows系)のようなスクリプトによって開始されます。これらのスクリプトは、src/all.rc
のような補助的なスクリプトを呼び出し、コンパイラ、リンカ、標準ライブラリ、そしてgo
コマンドなどのツールを段階的にビルドします。ビルドされたバイナリは通常、$GOROOT/bin
に配置されます。
2. $GOROOT
と$GOPATH
$GOROOT
: Goのインストールディレクトリを指します。Goの標準ライブラリやツールチェーンのソースコード、ビルドされたバイナリなどが含まれます。$GOPATH
: Goのワークスペースディレクトリを指します。ユーザーが開発するGoプロジェクトのソースコード、サードパーティのライブラリ、ビルドされた実行可能ファイルなどが配置されます。
3. $PATH
環境変数
$PATH
は、オペレーティングシステムが実行可能ファイルを探すディレクトリのリストを定義する環境変数です。ユーザーがコマンド名を入力すると、OSはこのリストを順番に検索し、最初に見つかった実行可能ファイルを実行します。
4. bind
コマンド(rcシェル)
bind
コマンドは、Plan 9 From User Space (plan9port) やrcシェル(Unix系システムで利用されることがあるシェル)で使われるコマンドです。これは、ディレクトリを別のディレクトリに「バインド」する機能を提供します。
bind old new
:old
ディレクトリをnew
ディレクトリにバインドします。これにより、new
にアクセスすると、実際にはold
の内容が見えるようになります。bind -b old new
:old
ディレクトリをnew
ディレクトリの前にバインドします。これは、new
ディレクトリの内容を隠蔽し、old
の内容を優先的に表示させる効果があります。つまり、new
内に同名のファイルが存在しても、old
内のファイルが優先的に参照されます。
このコミットでは、bind -b $GOROOT/bin /bin
を使用しており、これは$GOROOT/bin
の内容を/bin
の内容よりも優先して参照させることを意味します。
技術的詳細
このコミットは、Goのビルドスクリプトであるsrc/all.rc
に、bind -b $GOROOT/bin /bin
という一行を追加しています。
src/all.rc
は、Goのビルドプロセスにおいて重要な役割を果たすシェルスクリプトです。これは、Goのソースコードから実行可能なバイナリを生成する際に、様々な環境設定やビルドステップを調整するために使用されます。
追加されたbind -b $GOROOT/bin /bin
コマンドは、rcシェル環境下で実行されます。このコマンドの意図は以下の通りです。
$GOROOT/bin
: Goのビルドプロセスによって生成された、最新のGoツール(go
コマンド、gofmt
など)が格納されているディレクトリです。/bin
: 多くのUnix系システムで、基本的なシステムコマンドが格納されている標準的なディレクトリです。システム全体の$PATH
に含まれていることが一般的です。bind -b
: これは「before bind」を意味し、$GOROOT/bin
の内容を/bin
の内容よりも優先してバインドします。つまり、システムが/bin
内の実行可能ファイルを探す際、まず$GOROOT/bin
内に同名のファイルがないかを確認し、あればそちらを使用します。
この設定により、Goのビルドが完了した後、$GOROOT/bin
に存在する最新のgo
コマンドが、システムに元々インストールされていた可能性のある古いgo
コマンドや、他の場所にあるgo
コマンドよりも確実に優先して使用されるようになります。これにより、runtime
パッケージのテストなど、go
コマンドの存在とバージョンに依存するテストが、常に最新かつ正しいGoツールを使用して実行されることが保証されます。
これは、ビルド環境の整合性を保ち、テストの再現性と信頼性を高めるための重要な変更です。
コアとなるコードの変更箇所
変更はsrc/all.rc
ファイルの一箇所のみです。
--- a/src/all.rc
+++ b/src/all.rc
@@ -9,5 +9,6 @@ if(! test -f make.rc){
}
. ./make.rc --no-banner
+bind -b $GOROOT/bin /bin
./run.rc --no-rebuild
$GOTOOLDIR/dist banner # print build info
コアとなるコードの解説
追加された行は bind -b $GOROOT/bin /bin
です。
この行は、./make.rc --no-banner
の実行後、かつ ./run.rc --no-rebuild
の実行前に挿入されています。
./make.rc
はGoのツールチェーンのビルドを担当し、$GOROOT/bin
に最新のGoバイナリを配置します。
その直後に bind -b $GOROOT/bin /bin
を実行することで、./run.rc
やその後のテスト実行時に、$GOROOT/bin
にある最新のGoツールが確実にシステムパスの /bin
よりも優先して参照されるようになります。
これにより、runtime
パッケージのテストがgo
コマンドを必要とする際に、ビルドされたばかりの最新のgo
コマンドが使用されることが保証され、テストの安定性と正確性が向上します。
関連リンク
- Go言語の公式ウェブサイト: https://golang.org/
- Goのコードレビューシステム (Gerrit): https://go-review.googlesource.com/
- このコミットに対応するGerritの変更リスト: https://golang.org/cl/7391047
参考にした情報源リンク
- Go言語のソースコード (GitHub): https://github.com/golang/go
- rcシェルに関する情報 (Plan 9 From User Space): https://9p.io/plan9/man/man1/rc.html
bind
コマンドの動作に関する一般的な情報 (rcシェル): https://man.cat-v.org/plan_9/1/rc (Plan 9のrcシェルのマニュアルページ)- Goのビルドプロセスに関するドキュメント (Goソースコード内):
doc/install-source.html
など - Goの環境変数に関するドキュメント: https://go.dev/doc/code