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

[インデックス 10918] ファイルの概要

このコミットは、Go言語のビルドシステムにおける特定のシナリオ、具体的には USE_GO_TOOL 環境変数が false に設定されている場合に発生するビルドエラーを修正するものです。src/run.bash スクリプト内のテスト実行コマンドが go test から gotest に変更され、代替のビルドパスでのテストが正しく実行されるように修正されました。

コミット

build: fix the build with USE_GO_TOOL=false

R=golang-dev, r, rsc
CC=golang-dev
https://golang.org/cl/5502051

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/0735e06cfd9b7e132589f555eca3ab72f26d6e91

元コミット内容

commit 0735e06cfd9b7e132589f555eca3ab72f26d6e91
Author: Brad Fitzpatrick <bradfitz@golang.org>
Date:   Tue Dec 20 15:30:36 2011 -0800

    build: fix the build with USE_GO_TOOL=false
    
    R=golang-dev, r, rsc
    CC=golang-dev
    https://golang.org/cl/5502051
---
 src/run.bash | 2 +--
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/run.bash b/src/run.bash
index 90e8797c09..7d8b9bce06 100755
--- a/src/run.bash
+++ b/src/run.bash
@@ -59,7 +59,7 @@ if $USE_GO_TOOL; then
 	go test runtime -short -cpu=1,2,4
 else
 	(xcd pkg/runtime;
-	go test -short -cpu=1,2,4
+	gotest -short -cpu=1,2,4
 	) || exit $?\n fi

変更の背景

このコミットは、Go言語のビルドプロセスにおいて、USE_GO_TOOL という内部的なフラグが false に設定されている場合に発生していたビルドの不具合を修正するために導入されました。Go言語のビルドシステムは複雑であり、特に初期の段階やクロスコンパイル、あるいはブートストラップ(Goコンパイラ自体をGoでビルドするプロセス)のような特殊なシナリオでは、標準の go コマンドがまだ完全に利用できない、または特定の代替ツールを使用する必要がある場合があります。

USE_GO_TOOL=false の設定は、おそらく標準の go コマンド(go build, go test など)が利用できない、あるいは意図的に使用しない特定のビルドパスを意味していました。このパスでは、テストを実行するために go test ではなく、gotest という別の実行ファイルが期待されていました。しかし、既存のスクリプトでは誤って go test が呼び出されており、これがビルドエラーの原因となっていました。このコミットは、その誤りを修正し、USE_GO_TOOL=false の場合でもテストが正しく実行されるようにしました。

前提知識の解説

  • Go言語のビルドシステムと go コマンド: Go言語は、go という単一のコマンドラインツールを通じて、ソースコードのビルド、テスト、依存関係の管理、ドキュメント生成など、開発の多くの側面を統合的に扱います。go test は、Goの標準テストフレームワークで書かれたテストを実行するためのサブコマンドです。
  • src/run.bash: これはGo言語の公式リポジトリのルートディレクトリにあるシェルスクリプトです。Goのソースコード自体をビルドしたり、テストを実行したりするための主要なスクリプトの一つであり、Goのビルドプロセスにおける様々な環境設定や条件分岐を管理しています。このようなスクリプトは、Goのブートストラッププロセス(GoコンパイラをGo自身でビルドする)や、異なる環境でのビルドをサポートするために不可欠です。
  • USE_GO_TOOL フラグ: このフラグは、Goのビルドシステム内部で使用されるもので、Goの標準ツールチェーン(go コマンド)を使用するかどうかを切り替えるためのものです。false に設定されるシナリオは、例えば、Goのツールチェーンがまだ完全にビルドされていない初期段階や、特定の古いツールセットとの互換性を保つ必要がある場合などが考えられます。
  • gotestgo test の違い:
    • go test: 現在のGo言語の標準的なテスト実行コマンドです。Goモジュールやパッケージのテストを管理し、実行します。
    • gotest: このコミットの文脈では、go test とは異なる、おそらくGoの初期のバージョンや特定のビルド環境でのみ使用されていた、あるいは内部的なテスト実行ラッパーのようなコマンドを指していると考えられます。Goの進化の過程で、コマンド名やその機能が変更されたり、統合されたりすることは珍しくありません。この修正は、特定のレガシーなビルドパスが gotest を期待していたことを示唆しています。
  • xcd: src/run.bash スクリプト内で使用されている xcd は、おそらく cd コマンドのラッパーであり、ディレクトリ変更が失敗した場合にスクリプトを終了させるなどのエラーハンドリング機能を追加していると考えられます。

技術的詳細

このコミットの技術的な核心は、src/run.bash スクリプト内の条件分岐ロジックにあります。スクリプトは USE_GO_TOOL 変数の真偽を評価し、それに基づいて異なるテスト実行パスを選択します。

元のコードは以下のようになっていました。

if $USE_GO_TOOL; then
    # USE_GO_TOOLがtrueの場合、標準のgo testコマンドを使用
    go test runtime -short -cpu=1,2,4
else
    # USE_GO_TOOLがfalseの場合
    (xcd pkg/runtime;
    go test -short -cpu=1,2,4 # ここが問題の箇所
    ) || exit $?
fi

USE_GO_TOOLfalse の場合、スクリプトは pkg/runtime ディレクトリに移動し、そこでテストを実行しようとします。しかし、このパスでは go test コマンドが期待されておらず、代わりに gotest コマンドが使用されるべきでした。この不一致がビルドエラーを引き起こしていました。

コミットによる変更は、この else ブロック内の go testgotest に置き換えることで、この問題を解決しました。

if $USE_GO_TOOL; then
    go test runtime -short -cpu=1,2,4
else
    (xcd pkg/runtime;
    gotest -short -cpu=1,2,4 # 修正後
    ) || exit $?
fi

この修正により、USE_GO_TOOL=false のビルドパスでも、runtime パッケージのテストが正しく gotest コマンドによって実行されるようになり、ビルドが成功するようになりました。-short フラグは短時間で実行できるテストのみを実行することを示し、-cpu=1,2,4 はテストを異なるCPU数で実行して並列処理のテストを行うことを意味します。|| exit $? は、直前のコマンド(gotest)が失敗した場合にスクリプト全体の実行を停止し、その終了ステータスを返すことで、エラーを早期に検出する標準的なシェルスクリプトのプラクティスです。

コアとなるコードの変更箇所

変更は src/run.bash ファイルの以下の部分です。

--- a/src/run.bash
+++ b/src/run.bash
@@ -59,7 +59,7 @@ if $USE_GO_TOOL; then
 	go test runtime -short -cpu=1,2,4
 else
 	(xcd pkg/runtime;
-	go test -short -cpu=1,2,4
+	gotest -short -cpu=1,2,4
 	) || exit $?\n fi

具体的には、src/run.bash の59行目から始まる if/else ブロックの else 節において、go testgotest に変更されています。

コアとなるコードの解説

この変更は、Go言語のビルドスクリプト src/run.bash 内の条件分岐ロジックを修正するものです。

  • if $USE_GO_TOOL; then ... fi: この構造は、シェルスクリプトにおける条件分岐です。$USE_GO_TOOL 変数の値が真(空でない文字列、または 0 以外の数値)であれば then 以下のブロックが実行され、そうでなければ else 以下のブロックが実行されます。
  • go test runtime -short -cpu=1,2,4: USE_GO_TOOL が真の場合に実行されるコマンドです。これは、Goの標準的な go test コマンドを使用して、runtime パッケージのテストを実行します。-short は時間のかかるテストをスキップし、-cpu=1,2,4 はテストを1、2、4つのCPUコアで実行して並行処理のテストを行います。
  • (xcd pkg/runtime; ... ) || exit $?: USE_GO_TOOL が偽の場合に実行されるブロックです。
    • xcd pkg/runtime;: pkg/runtime ディレクトリに移動します。xcd はエラーハンドリング付きの cd コマンドのラッパーと考えられます。
    • gotest -short -cpu=1,2,4: この行が変更された箇所です。元々は go test でしたが、gotest に修正されました。これは、この特定のビルドパスでは gotest という別のテスト実行ツールが期待されていることを示しています。
    • || exit $?: これはシェルスクリプトの一般的なイディオムで、直前のコマンド(この場合は gotest)が非ゼロの終了ステータス(エラーを示す)を返した場合に、スクリプト全体の実行を停止し、その終了ステータスを返します。これにより、テストの失敗がビルド全体の失敗として適切に伝播されます。

この修正は、Goのビルドシステムが異なる環境やブートストラップの段階で、適切なツールを呼び出すための重要な調整であり、ビルドの堅牢性を高めるものです。

関連リンク

参考にした情報源リンク