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

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

元コミット内容

このコミットの主な内容は以下の通りです。

  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言語のプログラムを開発・ビルド・実行するために必要な一連のツール群を指します。これには、コンパイラ(gcgo tool compile)、アセンブラ(asgo tool asm)、リンカ(ldgo 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. コンパイラパスの変更:

    • 以前は、コンパイラ(例: 8g6g)やリンカ(例: 8l6l)は、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コンパイラ、アセンブラ、リンカのパス定義が変更されました。
    • 変更前:
      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ディレクトリから参照されるようになりました。
  2. 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のビルドプロセスの一部でした。
  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言語の公式ドキュメント (当時のバージョンに関する情報)
  • 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言語の歴史と進化に関する記事やブログポスト