[インデックス 16996] ファイルの概要
このコミットは、Go言語のビルドツール cmd/go
におけるエラーメッセージの改善に関するものです。具体的には、Goのブートストラップ(自己コンパイル)プロセスにおいて、誤ったスクリプト名を参照していたエラーメッセージを、現在のOS環境に応じた正しいスクリプト名(例: make.bash
, make.bat
, make.rc
)を指すように修正しています。
コミット
commit 6f8acd5fb93f26f59739343d945c6e26021cce57
Author: Alex Brainman <alex.brainman@gmail.com>
Date: Fri Aug 2 15:55:21 2013 +1000
cmd/go: change error message to refer to correct bootstrap command
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/12317043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/6f8acd5fb93f26f59739343d945c6e26021cce57
元コミット内容
cmd/go: change error message to refer to correct bootstrap command
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/12317043
変更の背景
Go言語のコンパイラやツールチェインは、Go自身で書かれており、Goのソースコードからビルドされる「ブートストラップ」というプロセスが必要です。これは、Goの新しいバージョンを開発する際に、既存のGoコンパイラを使って新しいGoコンパイラをビルドするという自己参照的な性質を持つためです。
このブートストラッププロセスは、通常 make.bash
(Unix系OSの場合) や make.bat
(Windowsの場合)、make.rc
(Plan 9の場合) といったシェルスクリプトを実行することで行われます。
以前の実装では、runtime
パッケージが正しくブートストラップされていない場合に表示されるエラーメッセージが、常に make.bash
を参照していました。しかし、Windowsユーザーがこのエラーに遭遇した場合、make.bash
というコマンドは存在しないため、混乱を招く可能性がありました。
このコミットの目的は、ユーザーが遭遇するエラーメッセージをより正確で、現在のOS環境に即したものにすることで、ブートストラッププロセスの問題を解決する際のユーザーエクスペリエンスを向上させることです。これにより、Windowsユーザーは make.bat
を、Plan 9ユーザーは make.rc
を、その他のUnix系OSユーザーは make.bash
を参照するようになります。
前提知識の解説
- Go言語のブートストラップ: Go言語のコンパイラや標準ライブラリはGo言語自体で書かれています。そのため、Goの新しいバージョンをビルドするには、まず既存のGoコンパイラ(またはC言語で書かれた初期のコンパイラ)を使って、新しいGoコンパイラをコンパイルする必要があります。この自己コンパイルのプロセスを「ブートストラップ」と呼びます。Goのソースコードリポジトリには、このブートストラップを行うためのスクリプト(
make.bash
,make.bat
,make.rc
など)が含まれています。 cmd/go
: Go言語のビルド、テスト、実行、パッケージ管理などを行うための主要なコマンドラインツールです。Goのソースコードをコンパイルする際にもこのツールが内部的に利用されます。runtime
パッケージ: Go言語のランタイムシステムを実装しているパッケージです。ガベージコレクション、スケジューラ、プリミティブな同期機構など、Goプログラムの実行に不可欠な低レベルな機能を提供します。このパッケージはGoのビルドにおいて非常に根幹的な部分であり、正しくブートストラップされている必要があります。buildContext
: Goのビルドプロセスにおける環境情報(ターゲットOS、アーキテクチャ、コンパイラの種類など)を保持する構造体です。fmt.Errorf
: Go言語でフォーマットされたエラー文字列を生成するための関数です。runtime.GOOS
: Goプログラムが実行されているオペレーティングシステムを示す文字列定数です(例: "windows", "linux", "darwin", "plan9")。
技術的詳細
このコミットの主要な変更点は、src/cmd/go/build.go
ファイル内の builder.build
メソッドにおけるエラーメッセージの生成ロジックと、新しく追加された defaultSuffix()
関数です。
以前は、runtime
パッケージが正しくブートストラップされていない場合に、以下の固定されたエラーメッセージが返されていました。
return fmt.Errorf("%s/%s must be bootstrapped using make.bash", buildContext.GOOS, buildContext.GOARCH)
このコミットでは、make.bash
の部分が defaultSuffix()
関数の呼び出し結果に置き換えられました。
return fmt.Errorf("%s/%s must be bootstrapped using make%v", buildContext.GOOS, buildContext.GOARCH, defaultSuffix())
新しく追加された defaultSuffix()
関数は、runtime.GOOS
の値に基づいて、適切なファイル拡張子を返します。
runtime.GOOS
が"windows"
の場合、".bat"
を返します。runtime.GOOS
が"plan9"
の場合、".rc"
を返します。- 上記以外(Unix系OSなど)の場合、
".bash"
を返します。
これにより、エラーメッセージは実行環境に応じて動的に変化し、ユーザーに正しいブートストラップコマンドを案内できるようになります。例えば、Windows環境では「make.bat
を使ってブートストラップする必要がある」というメッセージが表示されるようになります。
この変更は、Goのビルドシステムが異なるOS環境でよりユーザーフレンドリーに動作するための小さな、しかし重要な改善です。
コアとなるコードの変更箇所
src/cmd/go/build.go
ファイルに以下の変更が加えられました。
builder.build
メソッド内のエラーメッセージ生成箇所が変更されました。- 新しい関数
defaultSuffix()
が追加されました。
--- a/src/cmd/go/build.go
+++ b/src/cmd/go/build.go
@@ -772,7 +772,7 @@ func (b *builder) build(a *action) (err error) {
if a.p.Standard && a.p.ImportPath == "runtime" && buildContext.Compiler == "gc" &&
!hasString(a.p.HFiles, "zasm_"+buildContext.GOOS+"_"+buildContext.GOARCH+".h") {
- return fmt.Errorf("%s/%s must be bootstrapped using make.bash", buildContext.GOOS, buildContext.GOARCH)
+ return fmt.Errorf("%s/%s must be bootstrapped using make%v", buildContext.GOOS, buildContext.GOARCH, defaultSuffix())
}
// Make build directory.
@@ -2242,3 +2242,16 @@ func raceInit() {
buildContext.InstallSuffix += "race"
buildContext.BuildTags = append(buildContext.BuildTags, "race")
}
+
+// defaultSuffix returns file extension used for command files in
+// current os environment.
+func defaultSuffix() string {
+ switch runtime.GOOS {
+ case "windows":
+ return ".bat"
+ case "plan9":
+ return ".rc"
+ default:
+ return ".bash"
+ }
+}
コアとなるコードの解説
-
func (b *builder) build(a *action) (err error)
内の変更:- この部分は、Goのビルドプロセスにおいて、特定の条件(
runtime
パッケージが標準パッケージであり、gc
コンパイラを使用しており、かつ特定のヘッダーファイルが存在しない場合)でブートストラップが不完全であると判断された際にエラーを返すロジックです。 - 変更前は
make.bash
という固定の文字列がエラーメッセージに含まれていましたが、変更後はmake%v
とdefaultSuffix()
の戻り値が埋め込まれるようになりました。これにより、エラーメッセージが実行環境に依存するようになります。
- この部分は、Goのビルドプロセスにおいて、特定の条件(
-
func defaultSuffix() string
の追加:- この新しい関数は、現在のオペレーティングシステム (
runtime.GOOS
) に応じて、ブートストラップスクリプトの適切なファイル拡張子を決定します。 switch
ステートメントを使用して、runtime.GOOS
の値が"windows"
なら".bat"
、"plan9"
なら".rc"
を返します。- それ以外のOS(主にLinuxやmacOSなどのUnix系OS)の場合は、デフォルトで
".bash"
を返します。 - この関数は、エラーメッセージを生成する際に呼び出され、ユーザーに表示されるブートストラップコマンドのサフィックスを動的に決定します。
- この新しい関数は、現在のオペレーティングシステム (
この変更により、Goのビルドシステムは、異なるOS環境でより正確な情報を提供できるようになり、ユーザーがブートストラップの問題をデバッグする際の混乱を軽減します。
関連リンク
- Go言語のブートストラップに関する公式ドキュメントやブログ記事(当時のものがあれば)
- Go言語のソースコードリポジトリ: https://github.com/golang/go
- Goの
runtime
パッケージのドキュメント: https://pkg.go.dev/runtime
参考にした情報源リンク
- Go言語の公式ドキュメント
- Go言語のソースコード
- Goのブートストラップに関する一般的な情報
- コミットメッセージとコード差分
- Goの
fmt
パッケージのドキュメント: https://pkg.go.dev/fmt - Goの
runtime
パッケージのドキュメント: https://pkg.go.dev/runtime