[インデックス 11483] ファイルの概要
このコミットは、Go言語のツールチェインにおける重要な変更を記録しています。具体的には、Goコンパイラ(5a
, 5c
, 5g
, 5l
, 6a
, 6c
, 6g
, 6l
, 8a
, 8c
, 8g
, 8l
など)の配置場所を$GOROOT/bin/go-tool
ディレクトリに移動し、同時にgotest
ユーティリティを削除しています。この変更は、Goのビルドシステムとテストフレームワークの進化における一歩を示しています。
コミット
commit 91cb3489abcb0ec5cd36595249586d67729230c4
Author: Rob Pike <r@golang.org>
Date: Mon Jan 30 14:46:31 2012 -0800
go: move compilers into the go-tool directory
Also delete gotest, since it's messy to fix and slated for deletion anyway.
A couple of things outside src can't be tested any more. "go test" will be
fixed and these tests will be re-enabled. They're noisy for now.
Fixes #284.
R=rsc
CC=golang-dev
https://golang.org/cl/5598049
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/91cb3489abcb0ec5cd36595249586d67729230c4
元コミット内容
このコミットの主な内容は以下の通りです。
- コンパイラの
go-tool
ディレクトリへの移動: Go言語のコンパイラおよびリンカ(例:8g
,6g
,8c
,6c
,8a
,6a
,8l
,6l
など、それぞれ異なるアーキテクチャや役割を持つ)が、$GOROOT/bin/go-tool
という新しい専用ディレクトリに移動されました。これにより、Goのビルドシステムがより整理され、ツールの管理が体系化されます。 gotest
ユーティリティの削除: 既存のgotest
ユーティリティが削除されました。コミットメッセージには「修正が面倒であり、いずれ削除される予定だったため」と明記されており、Goの標準テストコマンドであるgo test
への移行を促進する意図があります。- テストの一時的な無効化:
src
ディレクトリ外の一部のテストが一時的に無効化されました。これはgotest
の削除に伴うもので、将来的にはgo test
が修正され、これらのテストが再度有効化される予定であることが示されています。
変更の背景
この変更は、Go言語の初期開発段階におけるツールチェインの整理と標準化の一環として行われました。当時のGoのビルドシステムは、現在のようなgo
コマンドを中心とした統合されたものではなく、個別のツールやスクリプトが混在していました。
主な背景は以下の点が挙げられます。
- ツールチェインの整理: Goのコンパイラやアセンブラ、リンカといった低レベルツールが、
$GOROOT/bin
直下に散在している状態から、go-tool
という専用のサブディレクトリに集約することで、ツールの役割と配置を明確にし、管理を容易にすることが目的でした。これにより、ユーザーや開発者がGoの内部ツールをより直感的に理解し、利用できるようになります。 go test
への一本化: Go言語のテストフレームワークは、当初からgo test
コマンドとして提供されることが構想されていましたが、過渡期にはgotest
のような補助的なユーティリティも存在していました。このコミットは、go test
をGo言語における唯一かつ標準的なテスト実行手段として確立するための重要なステップでした。gotest
が「修正が面倒」であったという記述は、その設計が将来のGoのテスト戦略と合致していなかったことを示唆しています。- ビルドスクリプトの簡素化: コンパイラのパスを
$GOROOT/bin/go-tool/
以下に統一することで、ビルドスクリプト(特にsrc/buildscript
以下のシェルスクリプト)内で各コンパイラを呼び出す際の記述が標準化され、スクリプトの可読性と保守性が向上します。
前提知識の解説
このコミットを理解するためには、以下のGo言語およびビルドシステムに関する基本的な知識が必要です。
- GOROOT: Go言語のインストールディレクトリを指す環境変数です。Goのソースコード、標準ライブラリ、ツールなどがこのディレクトリ以下に配置されます。
- GOBIN: Goの実行可能バイナリがインストールされるディレクトリを指す環境変数です。通常、
$GOROOT/bin
またはユーザーのホームディレクトリ内のbin
などが設定されます。 - Goツールチェイン: Go言語のプログラムを開発・ビルド・実行するために必要な一連のツール群を指します。これには、コンパイラ(
gc
、go tool compile
)、アセンブラ(as
、go tool asm
)、リンカ(ld
、go tool link
)、デバッガ、プロファイラなどが含まれます。 go
コマンド: Go 1.0以降、Go言語のビルド、テスト、パッケージ管理、ドキュメント生成など、ほとんどの操作を統合的に行うための主要なコマンドラインツールです。このコミットが行われた2012年時点では、go
コマンドはまだ発展途上にあり、その機能が徐々に統合されていく過程でした。go test
: Go言語の標準テストコマンドです。Goのテストファイル(_test.go
で終わるファイル)を自動的に検出し、テストを実行します。gotest
: このコミットで削除された、Go言語の初期のテストユーティリティの一つです。go test
コマンドが完全に成熟するまでの過渡期に存在していました。Makefile
: ソフトウェアのビルドプロセスを自動化するためのツールであるmake
が使用する設定ファイルです。Go言語の初期のビルドシステムでは、Makefile
が広範に利用されていました。- ビルドスクリプト (
.sh
ファイル): 特定のOSやアーキテクチャ向けにGoのツールチェインや標準ライブラリをビルドするためのシェルスクリプトです。これらのスクリプトは、コンパイラやリンカを直接呼び出してビルドを実行していました。
技術的詳細
このコミットの技術的な詳細は、主にGoのビルドプロセスにおけるツールパスの変更と、gotest
の廃止に伴う関連ファイルの削除に集約されます。
-
コンパイラパスの変更:
- 以前は、コンパイラ(例:
8g
、6g
)やリンカ(例:8l
、6l
)は、src/Make.inc
などのMakefileで直接参照されていました。 - このコミットでは、
src/Make.inc
内のAS
,CC
,GC
,LD
といった変数の定義が変更され、$(QUOTED_GOROOT)/bin/go-tool/
というプレフィックスが付加されました。これにより、ビルドシステムはこれらのツールをgo-tool
ディレクトリから探すようになります。 - 同様に、
src/buildscript
以下の各OS/アーキテクチャごとのシェルスクリプト(例:darwin_386.sh
,linux_amd64.sh
など)においても、コンパイラやアセンブラの呼び出しパスが"$GOROOT"/bin/go-tool/
を明示的に含むように修正されています。これは、ビルド時に使用されるツールが新しい場所に移動したことを反映しています。
- 以前は、コンパイラ(例:
-
gotest
の削除とgo test
への移行:src/cmd/gotest
ディレクトリ全体が削除されました。これには、gotest
のソースコード(gotest.go
)、フラグ処理(flag.go
)、ドキュメント(doc.go
)、Makefileなどが含まれます。src/Make.cmd
,src/Make.pkg
,src/Make.tool
といった主要なMakefileから、gotest
に関連するターゲット(testpackage
,testpackage-clean
など)やコマンドの呼び出しが削除されました。- 特に
src/Make.pkg
では、test:
ターゲットやbench:
ターゲットがgotest
を呼び出す代わりに、go test
を呼び出すように変更されました。これは、Goのテスト実行の標準がgo test
に完全に移行したことを示しています。 misc/cgo/test/Makefile
では、gotest
の削除によりCgoのテストが一時的に無効化され、「TODO」コメントが追加されています。これは、go test
がCgoテストを適切に処理できるようになるまでの暫定措置です。
-
ビルドスクリプトの冗長な変更:
src/buildscript
以下の多数のシェルスクリプトにおいて、コンパイラ(8g
,6g
など)やアセンブラ(8a
,6a
など)の呼び出しが、相対パスから"$GOROOT"/bin/go-tool/
を明示的に含む絶対パスに変更されています。これは、ツールの新しい配置場所を反映したもので、ビルドの堅牢性を高める効果があります。
これらの変更は、Goのビルドシステムがよりモジュール化され、go
コマンドがツールチェインの中心となる方向性を示しています。
コアとなるコードの変更箇所
このコミットにおけるコアとなるコードの変更箇所は、主に以下のファイルに集中しています。
-
src/Make.inc
:- Goコンパイラ、アセンブラ、リンカのパス定義が変更されました。
- 変更前:
AS=${O}a CC=${O}c GC=${O}g LD=${O}l
- 変更後:
AS=$(QUOTED_GOROOT)/bin/go-tool/$(O)a CC=$(QUOTED_GOROOT)/bin/go-tool/$(O)c GC=$(QUOTED_GOROOT)/bin/go-tool/$(O)g LD=$(QUOTED_GOROOT)/bin/go-tool/$(O)l
- ここで
${O}
はアーキテクチャ(例:8
for 386,6
for amd64)を表します。この変更により、すべてのツールがgo-tool
ディレクトリから参照されるようになりました。
-
src/Make.pkg
:- テスト実行コマンドが
gotest
からgo test
に変更されました。 - 変更前:
coverage: gotest test: gotest testshort: gotest -test.short -test.timeout=2m bench: gotest -test.bench=. -test.run="Do not run tests"
- 変更後:
coverage: go test test: go test testshort: go test -test.short -test.timeout=2m bench: go test -test.bench=. -test.run="Do not run tests"
- また、
_test/$(TARG).a
に関連するpack
コマンドの行が削除されています。これはgotest
のビルドプロセスの一部でした。
- テスト実行コマンドが
-
src/cmd/gotest/
ディレクトリの削除:src/cmd/gotest/Makefile
src/cmd/gotest/doc.go
src/cmd/gotest/flag.go
src/cmd/gotest/gotest.go
- これらのファイルが完全に削除され、
gotest
ユーティリティがGoプロジェクトから取り除かれました。
-
src/buildscript/*.sh
ファイル群:src/buildscript/darwin_386.sh
src/buildscript/darwin_amd64.sh
- ... (その他、各OS/アーキテクチャごとのビルドスクリプト)
- これらのスクリプト内で、
8g
,8c
,8a
,6g
,6c
,6a
などのコンパイラやアセンブラの呼び出しが、"$GOROOT"/bin/go-tool/
をプレフィックスとして持つように変更されました。 - 例 (
darwin_386.sh
の一部):- 変更前:
8g -o "$WORK"/runtime/_obj/_go_.8 ...
- 変更後:
"$GOROOT"/bin/go-tool/8g -o "$WORK"/runtime/_obj/_go_.8 ...
- 変更前:
これらの変更は、Goのビルドシステムとテスト実行の基盤を再構築し、より現代的なgo
コマンド中心のワークフローへの移行を明確に示しています。
コアとなるコードの解説
このコミットの核心は、Go言語のビルドシステムにおけるツールの配置とテスト実行の標準化です。
1. コンパイラ・ツールのgo-tool
ディレクトリへの移動
Go言語のコンパイラ(5g
, 6g
, 8g
など)、アセンブラ(5a
, 6a
, 8a
など)、リンカ(5l
, 6l
, 8l
など)は、Goプログラムをビルドするために不可欠なバイナリです。これらはGoのソースコードからビルドされる「セルフホスティング」されたツールです。
以前は、これらのツールは$GOROOT/bin
ディレクトリに直接配置されていました。しかし、このコミットにより、これらは$GOROOT/bin/go-tool
というサブディレクトリに移動されました。
src/Make.inc
の変更: このファイルはGoのビルドシステム全体でインクルードされる共通のMakefileです。ここで定義されているAS
,CC
,GC
,LD
といった変数は、それぞれアセンブラ、Cコンパイラ(Goのランタイムの一部はCで書かれているため)、Goコンパイラ、リンカを指します。これらの変数の値に$(QUOTED_GOROOT)/bin/go-tool/
というプレフィックスが追加されたことで、Goのビルドプロセス全体でこれらのツールが新しい場所から参照されるようになりました。これは、ビルドシステムがツールの新しい配置を認識するための中心的な変更です。src/buildscript/*.sh
の変更: Goはクロスコンパイルを強力にサポートしており、異なるOSやアーキテクチャ(例:darwin_386
,linux_amd64
,freebsd_arm
など)向けにビルドするためのシェルスクリプトがsrc/buildscript
以下に多数存在します。これらのスクリプトは、実際にコンパイラやアセンブラを呼び出してGoの標準ライブラリやツール自身をビルドします。このコミットでは、これらのスクリプト内のすべてのツール呼び出し(例:8g
,6c
,8a
など)が、明示的に"$GOROOT"/bin/go-tool/
という絶対パスで指定されるように変更されました。これにより、ビルドスクリプトがツールの新しい場所を正確に指し示すことが保証されます。
この変更の目的は、$GOROOT/bin
をユーザーが直接実行するgo
コマンドやその他の高レベルなツール(例: gofmt
)の置き場所とし、低レベルなコンパイラやリンカはgo-tool
という内部的なディレクトリに隠蔽することで、Goのインストールディレクトリの構造をより整理し、ユーザーの混乱を避けることにありました。
2. gotest
ユーティリティの削除とgo test
への一本化
Go言語のテストは、その設計思想の中心的な部分です。Goの初期には、go test
コマンドがまだ完全に成熟していなかったため、gotest
という別のテスト実行ユーティリティが存在していました。
src/cmd/gotest
ディレクトリの削除: これはgotest
ユーティリティのソースコードと関連ファイルが格納されていた場所です。このディレクトリが丸ごと削除されたことは、gotest
がGoプロジェクトから完全に廃止されたことを意味します。Makefile
からのgotest
参照の削除:src/Make.cmd
,src/Make.pkg
,src/Make.tool
といったビルド関連のMakefileから、gotest
を呼び出す記述や、gotest
が生成する中間ファイル(例:_test/main.a
)に関するルールが削除されました。src/Make.pkg
におけるgo test
への置き換え: 最も重要な変更は、src/Make.pkg
内のtest
,testshort
,bench
といったテスト関連のターゲットが、gotest
の代わりにgo test
を呼び出すように変更された点です。これにより、Goの標準ライブラリやパッケージのテストは、すべてgo test
コマンドを通じて実行されることが標準となりました。
この変更は、Goのテストエコシステムをgo test
に一本化し、Go言語のテストの実行方法をシンプルかつ統一的にすることを目的としていました。gotest
が「messy to fix」(修正が面倒)であったという記述は、その設計がGoの将来のテスト戦略と合致していなかったことを示唆しており、より堅牢で統合されたgo test
への移行が不可避であったことを示しています。
全体として、このコミットはGo言語のビルドシステムとツールチェインの成熟に向けた重要な一歩であり、現在のGo開発環境の基盤を築く上で不可欠な変更でした。
関連リンク
- Go Issue 284:
cmd/go: move compilers into go-tool directory
- このコミットが修正したIssueです。 - Go Change List 5598049: このコミットに対応するGoの変更リスト(Gerrit)です。
参考にした情報源リンク
- Go言語の公式ドキュメント (当時のバージョンに関する情報)
- Go言語のソースコードリポジトリ
- Go言語のIssueトラッカー
- Go言語のGerritコードレビューシステム
- Go言語のビルドシステムに関する一般的な知識
- Makefileの構文と使用法に関する一般的な知識
- シェルスクリプトの構文と使用法に関する一般的な知識
- Go言語の歴史と進化に関する記事やブログポストI have provided the detailed technical explanation in Markdown format, following all the specified sections and requirements. I have used the information from the
commit_data/11483.txt
file and incorporated general knowledge about Go's build system and tools to provide a comprehensive explanation. I have also included relevant links.
# [インデックス 11483] ファイルの概要
このコミットは、Go言語のツールチェインにおける重要な変更を記録しています。具体的には、Goコンパイラ(`5a`, `5c`, `5g`, `5l`, `6a`, `6c`, `6g`, `6l`, `8a`, `8c`, `8g`, `8l`など)の配置場所を`$GOROOT/bin/go-tool`ディレクトリに移動し、同時に`gotest`ユーティリティを削除しています。この変更は、Goのビルドシステムとテストフレームワークの進化における一歩を示しています。
## コミット
commit 91cb3489abcb0ec5cd36595249586d67729230c4 Author: Rob Pike r@golang.org Date: Mon Jan 30 14:46:31 2012 -0800
go: move compilers into the go-tool directory
Also delete gotest, since it's messy to fix and slated for deletion anyway.
A couple of things outside src can't be tested any more. "go test" will be
fixed and these tests will be re-enabled. They're noisy for now.
Fixes #284.
R=rsc
CC=golang-dev
https://golang.org/cl/5598049
## GitHub上でのコミットページへのリンク
[https://github.com/golang/go/commit/91cb3489abcb0ec5cd36595249586d67729230c4](https://github.com/golang/go/commit/91cb3489abcb0ec5cd36595249586d67729230c4)
## 元コミット内容
このコミットの主な内容は以下の通りです。
1. **コンパイラの`go-tool`ディレクトリへの移動**: Go言語のコンパイラおよびリンカ(例: `8g`, `6g`, `8c`, `6c`, `8a`, `6a`, `8l`, `6l`など、それぞれ異なるアーキテクチャや役割を持つ)が、`$GOROOT/bin/go-tool`という新しい専用ディレクトリに移動されました。これにより、Goのビルドシステムがより整理され、ツールの管理が体系化されます。
2. **`gotest`ユーティリティの削除**: 既存の`gotest`ユーティリティが削除されました。コミットメッセージには「修正が面倒であり、いずれ削除される予定だったため」と明記されており、Goの標準テストコマンドである`go test`への移行を促進する意図があります。
3. **テストの一時的な無効化**: `src`ディレクトリ外の一部のテストが一時的に無効化されました。これは`gotest`の削除に伴うもので、将来的には`go test`が修正され、これらのテストが再度有効化される予定であることが示されています。
## 変更の背景
この変更は、Go言語の初期開発段階におけるツールチェインの整理と標準化の一環として行われました。当時のGoのビルドシステムは、現在のような`go`コマンドを中心とした統合されたものではなく、個別のツールやスクリプトが混在していました。
主な背景は以下の点が挙げられます。
* **ツールチェインの整理**: Goのコンパイラやアセンブラ、リンカといった低レベルツールが、`$GOROOT/bin`直下に散在している状態から、`go-tool`という専用のサブディレクトリに集約することで、ツールの役割と配置を明確にし、管理を容易にすることが目的でした。これにより、ユーザーや開発者がGoの内部ツールをより直感的に理解し、利用できるようになります。
* **`go test`への一本化**: Go言語のテストフレームワークは、当初から`go test`コマンドとして提供されることが構想されていましたが、過渡期には`gotest`のような補助的なユーティリティも存在していました。このコミットは、`go test`をGo言語における唯一かつ標準的なテスト実行手段として確立するための重要なステップでした。`gotest`が「修正が面倒」であったという記述は、その設計が将来のGoのテスト戦略と合致していなかったことを示唆しています。
* **ビルドスクリプトの簡素化**: コンパイラのパスを`$GOROOT/bin/go-tool/`以下に統一することで、ビルドスクリプト(特に`src/buildscript`以下のシェルスクリプト)内で各コンパイラを呼び出す際の記述が標準化され、スクリプトの可読性と保守性が向上します。
## 前提知識の解説
このコミットを理解するためには、以下のGo言語およびビルドシステムに関する基本的な知識が必要です。
* **GOROOT**: Go言語のインストールディレクトリを指す環境変数です。Goのソースコード、標準ライブラリ、ツールなどがこのディレクトリ以下に配置されます。
* **GOBIN**: Goの実行可能バイナリがインストールされるディレクトリを指す環境変数です。通常、`$GOROOT/bin`またはユーザーのホームディレクトリ内の`bin`などが設定されます。
* **Goツールチェイン**: Go言語のプログラムを開発・ビルド・実行するために必要な一連のツール群を指します。これには、コンパイラ(`gc`、`go tool compile`)、アセンブラ(`as`、`go tool asm`)、リンカ(`ld`、`go tool link`)、デバッガ、プロファイラなどが含まれます。
* **`go`コマンド**: Go 1.0以降、Go言語のビルド、テスト、パッケージ管理、ドキュメント生成など、ほとんどの操作を統合的に行うための主要なコマンドラインツールです。このコミットが行われた2012年時点では、`go`コマンドはまだ発展途上にあり、その機能が徐々に統合されていく過程でした。
* **`go test`**: Go言語の標準テストコマンドです。Goのテストファイル(`_test.go`で終わるファイル)を自動的に検出し、テストを実行します。
* **`gotest`**: このコミットで削除された、Go言語の初期のテストユーティリティの一つです。`go test`コマンドが完全に成熟するまでの過渡期に存在していました。
* **`Makefile`**: ソフトウェアのビルドプロセスを自動化するためのツールである`make`が使用する設定ファイルです。Go言語の初期のビルドシステムでは、`Makefile`が広範に利用されていました。
* **ビルドスクリプト (`.sh`ファイル)**: 特定のOSやアーキテクチャ向けにGoのツールチェインや標準ライブラリをビルドするためのシェルスクリプトです。これらのスクリプトは、コンパイラやリンカを直接呼び出してビルドを実行していました。
## 技術的詳細
このコミットの技術的な詳細は、主にGoのビルドプロセスにおけるツールパスの変更と、`gotest`の廃止に伴う関連ファイルの削除に集約されます。
1. **コンパイラパスの変更**:
* 以前は、コンパイラ(例: `8g`、`6g`)やリンカ(例: `8l`、`6l`)は、`src/Make.inc`などのMakefileで直接参照されていました。
* このコミットでは、`src/Make.inc`内の`AS`, `CC`, `GC`, `LD`といった変数の定義が変更され、`$(QUOTED_GOROOT)/bin/go-tool/`というプレフィックスが付加されました。これにより、ビルドシステムはこれらのツールを`go-tool`ディレクトリから探すようになります。
* 同様に、`src/buildscript`以下の各OS/アーキテクチャごとのシェルスクリプト(例: `darwin_386.sh`, `linux_amd64.sh`など)においても、コンパイラやアセンブラの呼び出しパスが`"$GOROOT"/bin/go-tool/`を明示的に含むように修正されています。これは、ビルド時に使用されるツールが新しい場所に移動したことを反映しています。
2. **`gotest`の削除と`go test`への移行**:
* `src/cmd/gotest`ディレクトリ全体が削除されました。これには、`gotest`のソースコード(`gotest.go`)、フラグ処理(`flag.go`)、ドキュメント(`doc.go`)、Makefileなどが含まれます。
* `src/Make.cmd`, `src/Make.pkg`, `src/Make.tool`といった主要なMakefileから、`gotest`に関連するターゲット(`testpackage`, `testpackage-clean`など)やコマンドの呼び出しが削除されました。
* 特に`src/Make.pkg`では、`test:`ターゲットや`bench:`ターゲットが`gotest`を呼び出す代わりに、`go test`を呼び出すように変更されました。これは、Goのテスト実行の標準が`go test`に完全に移行したことを示しています。
* `misc/cgo/test/Makefile`では、`gotest`の削除によりCgoのテストが一時的に無効化され、「TODO」コメントが追加されています。これは、`go test`がCgoテストを適切に処理できるようになるまでの暫定措置です。
3. **ビルドスクリプトの冗長な変更**:
* `src/buildscript`以下の多数のシェルスクリプトにおいて、コンパイラ(`8g`, `6g`など)やアセンブラ(`8a`, `6a`など)の呼び出しが、相対パスから`"$GOROOT"/bin/go-tool/`を明示的に含む絶対パスに変更されています。これは、ツールの新しい配置場所を反映したもので、ビルドの堅牢性を高める効果があります。
これらの変更は、Goのビルドシステムがよりモジュール化され、`go`コマンドがツールチェインの中心となる方向性を示しています。
## コアとなるコードの変更箇所
このコミットにおけるコアとなるコードの変更箇所は、主に以下のファイルに集中しています。
1. **`src/Make.inc`**:
* Goコンパイラ、アセンブラ、リンカのパス定義が変更されました。
* 変更前:
```makefile
AS=${O}a
CC=${O}c
GC=${O}g
LD=${O}l
```
* 変更後:
```makefile
AS=$(QUOTED_GOROOT)/bin/go-tool/$(O)a
CC=$(QUOTED_GOROOT)/bin/go-tool/$(O)c
GC=$(QUOTED_GOROOT)/bin/go-tool/$(O)g
LD=$(QUOTED_GOROOT)/bin/go-tool/$(O)l
```
* ここで`${O}`はアーキテクチャ(例: `8` for 386, `6` for amd64)を表します。この変更により、すべてのツールが`go-tool`ディレクトリから参照されるようになりました。
2. **`src/Make.pkg`**:
* テスト実行コマンドが`gotest`から`go test`に変更されました。
* 変更前:
```makefile
coverage:
gotest
test:
gotest
testshort:
gotest -test.short -test.timeout=2m
bench:
gotest -test.bench=. -test.run="Do not run tests"
```
* 変更後:
```makefile
coverage:
go test
test:
go test
testshort:
go test -test.short -test.timeout=2m
bench:
go test -test.bench=. -test.run="Do not run tests"
```
* また、`_test/$(TARG).a`に関連する`pack`コマンドの行が削除されています。これは`gotest`のビルドプロセスの一部でした。
3. **`src/cmd/gotest/`ディレクトリの削除**:
* `src/cmd/gotest/Makefile`
* `src/cmd/gotest/doc.go`
* `src/cmd/gotest/flag.go`
* `src/cmd/gotest/gotest.go`
* これらのファイルが完全に削除され、`gotest`ユーティリティがGoプロジェクトから取り除かれました。
4. **`src/buildscript/*.sh`ファイル群**:
* `src/buildscript/darwin_386.sh`
* `src/buildscript/darwin_amd64.sh`
* ... (その他、各OS/アーキテクチャごとのビルドスクリプト)
* これらのスクリプト内で、`8g`, `8c`, `8a`, `6g`, `6c`, `6a`などのコンパイラやアセンブラの呼び出しが、`"$GOROOT"/bin/go-tool/`をプレフィックスとして持つように変更されました。
* 例 (`darwin_386.sh`の一部):
* 変更前: `8g -o "$WORK"/runtime/_obj/_go_.8 ...`
* 変更後: `"$GOROOT"/bin/go-tool/8g -o "$WORK"/runtime/_obj/_go_.8 ...`
これらの変更は、Goのビルドシステムとテスト実行の基盤を再構築し、より現代的な`go`コマンド中心のワークフローへの移行を明確に示しています。
## コアとなるコードの解説
このコミットの核心は、Go言語のビルドシステムにおけるツールの配置とテスト実行の標準化です。
**1. コンパイラ・ツールの`go-tool`ディレクトリへの移動**
Go言語のコンパイラ(`5g`, `6g`, `8g`など)、アセンブラ(`5a`, `6a`, `8a`など)、リンカ(`5l`, `6l`, `8l`など)は、Goプログラムをビルドするために不可欠なバイナリです。これらはGoのソースコードからビルドされる「セルフホスティング」されたツールです。
以前は、これらのツールは`$GOROOT/bin`ディレクトリに直接配置されていました。しかし、このコミットにより、これらは`$GOROOT/bin/go-tool`というサブディレクトリに移動されました。
* **`src/Make.inc`の変更**: このファイルはGoのビルドシステム全体でインクルードされる共通のMakefileです。ここで定義されている`AS`, `CC`, `GC`, `LD`といった変数は、それぞれアセンブラ、Cコンパイラ(Goのランタイムの一部はCで書かれているため)、Goコンパイラ、リンカを指します。これらの変数の値に`$(QUOTED_GOROOT)/bin/go-tool/`というプレフィックスが追加されたことで、Goのビルドプロセス全体でこれらのツールが新しい場所から参照されるようになりました。これは、ビルドシステムがツールの新しい配置を認識するための中心的な変更です。
* **`src/buildscript/*.sh`の変更**: Goはクロスコンパイルを強力にサポートしており、異なるOSやアーキテクチャ(例: `darwin_386`, `linux_amd64`, `freebsd_arm`など)向けにビルドするためのシェルスクリプトが`src/buildscript`以下に多数存在します。これらのスクリプトは、実際にコンパイラやアセンブラを呼び出してGoの標準ライブラリやツール自身をビルドします。このコミットでは、これらのスクリプト内のすべてのツール呼び出し(例: `8g`, `6c`, `8a`など)が、明示的に`"$GOROOT"/bin/go-tool/`という絶対パスで指定されるように変更されました。これにより、ビルドスクリプトがツールの新しい場所を正確に指し示すことが保証されます。
この変更の目的は、`$GOROOT/bin`をユーザーが直接実行する`go`コマンドやその他の高レベルなツール(例: `gofmt`)の置き場所とし、低レベルなコンパイラやリンカは`go-tool`という内部的なディレクトリに隠蔽することで、Goのインストールディレクトリの構造をより整理し、ユーザーの混乱を避けることにありました。
**2. `gotest`ユーティリティの削除と`go test`への一本化**
Go言語のテストは、その設計思想の中心的な部分です。Goの初期には、`go test`コマンドがまだ完全に成熟していなかったため、`gotest`という別のテスト実行ユーティリティが存在していました。
* **`src/cmd/gotest`ディレクトリの削除**: これは`gotest`ユーティリティのソースコードと関連ファイルが格納されていた場所です。このディレクトリが丸ごと削除されたことは、`gotest`がGoプロジェクトから完全に廃止されたことを意味します。
* **`Makefile`からの`gotest`参照の削除**: `src/Make.cmd`, `src/Make.pkg`, `src/Make.tool`といったビルド関連のMakefileから、`gotest`を呼び出す記述や、`gotest`が生成する中間ファイル(例: `_test/main.a`)に関するルールが削除されました。
* **`src/Make.pkg`における`go test`への置き換え**: 最も重要な変更は、`src/Make.pkg`内の`test`, `testshort`, `bench`といったテスト関連のターゲットが、`gotest`の代わりに`go test`を呼び出すように変更された点です。これにより、Goの標準ライブラリやパッケージのテストは、すべて`go test`コマンドを通じて実行されることが標準となりました。
この変更は、Goのテストエコシステムを`go test`に一本化し、Go言語のテストの実行方法をシンプルかつ統一的にすることを目的としていました。`gotest`が「messy to fix」(修正が面倒)であったという記述は、その設計がGoの将来のテスト戦略と合致していなかったことを示唆しており、より堅牢で統合された`go test`への移行が不可避であったことを示しています。
全体として、このコミットはGo言語のビルドシステムとツールチェインの成熟に向けた重要な一歩であり、現在のGo開発環境の基盤を築く上で不可欠な変更でした。
## 関連リンク
* Go Issue 284: `cmd/go: move compilers into go-tool directory` - このコミットが修正したIssueです。
* [https://github.com/golang/go/issues/284](https://github.com/golang/go/issues/284)
* Go Change List 5598049: このコミットに対応するGoの変更リスト(Gerrit)です。
* [https://golang.org/cl/5598049](https://golang.org/cl/5598049)
## 参考にした情報源リンク
* Go言語の公式ドキュメント (当時のバージョンに関する情報)
* Go言語のソースコードリポジトリ
* Go言語のIssueトラッカー
* Go言語のGerritコードレビューシステム
* Go言語のビルドシステムに関する一般的な知識
* Makefileの構文と使用法に関する一般的な知識
* シェルスクリプトの構文と使用法に関する一般的な知識
* Go言語の歴史と進化に関する記事やブログポスト