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

[インデックス 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 ファイルに以下の変更が加えられました。

  1. builder.build メソッド内のエラーメッセージ生成箇所が変更されました。
  2. 新しい関数 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%vdefaultSuffix() の戻り値が埋め込まれるようになりました。これにより、エラーメッセージが実行環境に依存するようになります。
  • 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