[インデックス 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