Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 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シェル環境下で実行されます。このコマンドの意図は以下の通りです。

  1. $GOROOT/bin: Goのビルドプロセスによって生成された、最新のGoツール(goコマンド、gofmtなど)が格納されているディレクトリです。
  2. /bin: 多くのUnix系システムで、基本的なシステムコマンドが格納されている標準的なディレクトリです。システム全体の$PATHに含まれていることが一般的です。
  3. 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コマンドが使用されることが保証され、テストの安定性と正確性が向上します。

関連リンク

参考にした情報源リンク