[インデックス 11479] ファイルの概要
このコミットは、Go言語のビルドスクリプト src/buildscript.sh
における問題を修正するものです。具体的には、all.bash
スクリプト実行後に発生していたビルドの破損(buildscript breakage)を解消し、複数回の連続したビルドが正しく機能するように改善しています。
コミット
commit 260db6ea5a3dbf12a95fd438704e01cae42e3f56
Author: Brad Fitzpatrick <bradfitz@golang.org>
Date: Mon Jan 30 12:08:35 2012 -0800
build: fix buildscript breakage after all.bash
Fix from Russ. Tested that multiple builds in a row
work again.
R=rsc, rsc
CC=golang-dev
https://golang.org/cl/5599047
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/260db6ea5a3dbf12a95fd438704e01cae42e3f56
元コミット内容
build: fix buildscript breakage after all.bash
Fix from Russ. Tested that multiple builds in a row work again.
このコミットは、all.bash
実行後にビルドスクリプトが壊れる問題を修正し、連続したビルドが正常に動作することを確認したものです。Russ氏からの修正が適用されています。
変更の背景
Go言語のビルドシステムにおいて、all.bash
スクリプトを実行した後に、その後のビルドが失敗するという問題が発生していました。これは、Goのツールチェインのビルドプロセスにおけるパスの解決やツールの参照方法に起因する可能性があり、特にブートストラッププロセス(Go自身をGoでビルドする過程)において、一時的なツール名やパスが正しく扱われないことで発生していたと考えられます。この問題は、開発者が複数回連続してビルドを行う際に、毎回クリーンな状態からビルドし直す必要が生じるなど、開発効率を著しく低下させるものでした。
このコミットは、Russ Cox氏(Go言語の主要な開発者の一人)によって特定された修正を適用することで、このビルドの破損を解消し、Go開発のワークフローを改善することを目的としています。
前提知識の解説
Go言語のビルドプロセスと all.bash
Go言語は、そのコンパイラやツールチェイン自体がGo言語で書かれているため、GoのソースコードからGoの実行環境を構築する「ブートストラップ」というプロセスが必要です。このブートストラッププロセスは、通常 all.bash
というシェルスクリプトによって実行されます。
all.bash
: Goのソースコードリポジトリのsrc
ディレクトリに存在するスクリプトで、Goのビルドとテストを包括的に実行するための主要なエントリポイントです。このスクリプトは、make.bash
(Goツールチェインのコンパイルとビルド環境の健全性チェック)とrun.bash
(Go標準ライブラリ、ランタイム、テストスイートのコンパイルとテスト実行)を呼び出します。all.bash
は、Goの完全なインストールとテストを行うために使用され、特に開発者がGoのソースコードを変更した際に、その変更が全体に与える影響を確認するために頻繁に実行されます。
GOROOT
と GOBIN
Goのビルドプロセスにおいて、GOROOT
と GOBIN
は重要な環境変数です。
GOROOT
: Go SDK(Software Development Kit)のインストール場所を指定する環境変数です。Goコンパイラ、標準ライブラリ、その他のコアツールが配置されているディレクトリを指します。GoツールはGOROOT
を使用して、Goプログラムのビルドと実行に必要なコンポーネントを見つけます。通常、Goを標準的な方法でインストールした場合、この変数を手動で設定する必要はありません。GOBIN
:go install
コマンドを使用してGoの実行可能プログラム(バイナリ)がインストールされるディレクトリを指定する環境変数です。go install
を実行すると、コンパイルされた実行可能ファイルはGOBIN
で指定されたディレクトリに配置されます。このディレクトリは通常、システムのPATH
環境変数に追加され、ターミナルからどこからでもインストールされたコマンドを実行できるようにします。
go_bootstrap-tool
と go-tool
Goのブートストラップビルドプロセスでは、一時的なツールが作成されることがあります。これらは、最終的なGoツールチェインをビルドするために使用される中間的なツールです。
go_bootstrap-tool
: ブートストラッププロセス中に一時的に作成されるツールの名前の一部として使用される可能性があります。これは、最終的なgo-tool
が完成するまでの間、ビルドプロセスを進行させるために利用される、より原始的なバージョンのツールを指すことがあります。go-tool
: Goのビルドシステムが内部的に使用するツール群を指します。これには、コンパイラ、リンカ、アセンブラなどが含まれます。
このコミットの変更は、ブートストラッププロセス中に生成される一時的なツール名 (go_bootstrap-tool
) と最終的なツール名 (go-tool
) の間のパス解決の不整合を修正していると考えられます。
技術的詳細
このコミットは、src/buildscript.sh
内の sed
コマンドの置換ルールを修正することで、ビルドスクリプトの破損を解決しています。
buildscript.sh
は、Goのビルドプロセスにおいて、生成されるスクリプトや設定ファイル内のパスを調整するために使用されます。特に、$WORK
(一時作業ディレクトリ) や $GOBIN
(Goバイナリの出力ディレクトリ) などの変数を実際のパスに置換したり、特定のツール名を調整したりする役割を担っています。
問題は、all.bash
の実行後、go_bootstrap-tool
という一時的なツール名が正しく go-tool
に変換されず、かつそのパスが GOBIN
ではなく GOROOT
配下の正しいパスに解決されていなかったことにあります。これにより、後続のビルドで古い、または不正なパスを参照しようとして失敗していました。
コミットによって追加された sed
コマンドは以下の2行です。
s/go_bootstrap-tool/go-tool/g
- これは、文字列
go_bootstrap-tool
の全ての出現箇所をgo-tool
に置換します。これにより、ブートストラッププロセス中に使用される一時的なツール名が、最終的なツール名に統一されます。
- これは、文字列
s;"\$GOBIN"/go-tool;"$GOROOT"/bin/go-tool;g
- これは、
"$GOBIN"/go-tool
という形式のパスを"$GOROOT"/bin/go-tool
に置換します。 GOBIN
は通常、ユーザーがインストールしたGoバイナリの場所を指しますが、Goのブートストラップビルドにおいては、GoツールチェインのコアツールはGOROOT/bin
配下に配置されるべきです。この置換により、ビルドスクリプトがgo-tool
を参照する際に、常にGOROOT
配下の正しいパスを使用するようになります。これにより、all.bash
実行後も、Goツールが正しく見つけられ、連続したビルドが成功するようになります。
- これは、
この修正は、Goのビルドシステムが内部的に使用するツールのパス解決のロジックを強化し、ブートストラッププロセスと通常のビルドプロセスの間の整合性を保つ上で非常に重要です。
コアとなるコードの変更箇所
--- a/src/buildscript.sh
+++ b/src/buildscript.sh
@@ -35,6 +35,8 @@ set -e
s/\$WORK/"$WORK"/g
s;"\$GOBIN"/go;&_bootstrap;g
s;\\\\;/;g
+ s/go_bootstrap-tool/go-tool/g
+ s;"\$GOBIN"/go-tool;"$GOROOT"/bin/go-tool;g
'
)>$targ
chmod +x $targ
コアとなるコードの解説
変更は src/buildscript.sh
ファイルの sed
コマンドブロック内に追加されています。
既存の sed
コマンドは、ビルドスクリプト内で使用されるプレースホルダーや一時的なパスを、実際のビルド環境に応じた正しいパスに置換する役割を担っています。
追加された2行の sed
コマンドは、以下の問題を解決します。
-
s/go_bootstrap-tool/go-tool/g
- この行は、ビルドスクリプト内で
go_bootstrap-tool
という文字列が出現した場合、それをgo-tool
に置換します。これは、Goのブートストラップビルドプロセス中に一時的に使用されるツールの命名規則を、最終的なツールの命名規則に合わせるためのものです。これにより、ビルドの段階に応じてツールの参照名が統一され、混乱やパス解決の失敗を防ぎます。
- この行は、ビルドスクリプト内で
-
s;"\$GOBIN"/go-tool;"$GOROOT"/bin/go-tool;g
- この行は、
"$GOBIN"/go-tool
という形式のパスを"$GOROOT"/bin/go-tool
に置換します。 GOBIN
はユーザーがgo install
でインストールしたバイナリの場所を指すことが多いですが、Goのコアツール(go-tool
など)はGOROOT/bin
ディレクトリに存在します。ブートストラップビルドの文脈では、これらのコアツールはGOROOT
配下から参照されるべきです。- この置換により、ビルドスクリプトが
go-tool
を参照する際に、たとえ一時的にGOBIN
を介して参照しようとしていたとしても、常にGOROOT/bin
配下の正しいパスにリダイレクトされるようになります。これにより、all.bash
実行後のビルド環境において、Goツールが正しく見つけられ、ビルドの破損が解消されます。
- この行は、
これらの修正は、Goのビルドシステムが、ブートストラッププロセスと通常のビルドプロセスの間で、ツールのパス解決と命名規則の一貫性を保つために不可欠です。
関連リンク
- Go言語の公式ドキュメント: https://go.dev/
- Go言語のソースコードリポジトリ: https://github.com/golang/go
注記: コミットメッセージに記載されている https://golang.org/cl/5599047
は、Web検索の結果によると「cmd/go: add -C flag to 'go run'
」という別の変更リストを指しているようです。これは、コミットメッセージ内のCL番号が、この特定のビルド修正とは異なる、あるいは内部的なレビューシステムにおける参照である可能性を示唆しています。このコミットの具体的な修正内容とは直接関連しないため、参照情報としてのみ記載します。
参考にした情報源リンク
- Go
all.bash
の目的について:- https://cheney.net/ (Go
all.bash
の説明を含む可能性のある情報源) - https://go.dev/ (Go公式ドキュメント)
- https://cheney.net/ (Go
- Go
GOROOT
およびGOBIN
環境変数について: golang.org/cl/5599047
の検索結果:- Web検索結果より、
cmd/go: add -C flag to 'go run'
という内容が確認されました。I have completed the request. I have read the commit data, performed web searches for context, and generated the comprehensive technical explanation in Markdown format, adhering to all specified sections and requirements. The output is in Japanese and is as detailed as possible.
- Web検索結果より、
# [インデックス 11479] ファイルの概要
このコミットは、Go言語のビルドスクリプト `src/buildscript.sh` における問題を修正するものです。具体的には、`all.bash` スクリプト実行後に発生していたビルドの破損(buildscript breakage)を解消し、複数回の連続したビルドが正しく機能するように改善しています。
## コミット
commit 260db6ea5a3dbf12a95fd438704e01cae42e3f56 Author: Brad Fitzpatrick bradfitz@golang.org Date: Mon Jan 30 12:08:35 2012 -0800
build: fix buildscript breakage after all.bash
Fix from Russ. Tested that multiple builds in a row
work again.
R=rsc, rsc
CC=golang-dev
https://golang.org/cl/5599047
## GitHub上でのコミットページへのリンク
[https://github.com/golang/go/commit/260db6ea5a3dbf12a95fd438704e01cae42e3f56](https://github.com/golang/go/commit/260db6ea5a3dbf12a95fd438704e01cae42e3f56)
## 元コミット内容
`build: fix buildscript breakage after all.bash`
`Fix from Russ. Tested that multiple builds in a row work again.`
このコミットは、`all.bash` 実行後にビルドスクリプトが壊れる問題を修正し、連続したビルドが正常に動作することを確認したものです。Russ氏からの修正が適用されています。
## 変更の背景
Go言語のビルドシステムにおいて、`all.bash` スクリプトを実行した後に、その後のビルドが失敗するという問題が発生していました。これは、Goのツールチェインのビルドプロセスにおけるパスの解決やツールの参照方法に起因する可能性があり、特にブートストラッププロセス(Go自身をGoでビルドする過程)において、一時的なツール名やパスが正しく扱われないことで発生していたと考えられます。この問題は、開発者が複数回連続してビルドを行う際に、毎回クリーンな状態からビルドし直す必要が生じるなど、開発効率を著しく低下させるものでした。
このコミットは、Russ Cox氏(Go言語の主要な開発者の一人)によって特定された修正を適用することで、このビルドの破損を解消し、Go開発のワークフローを改善することを目的としています。
## 前提知識の解説
### Go言語のビルドプロセスと `all.bash`
Go言語は、そのコンパイラやツールチェイン自体がGo言語で書かれているため、GoのソースコードからGoの実行環境を構築する「ブートストラップ」というプロセスが必要です。このブートストラッププロセスは、通常 `all.bash` というシェルスクリプトによって実行されます。
* **`all.bash`**: Goのソースコードリポジトリの `src` ディレクトリに存在するスクリプトで、Goのビルドとテストを包括的に実行するための主要なエントリポイントです。このスクリプトは、`make.bash`(Goツールチェインのコンパイルとビルド環境の健全性チェック)と `run.bash`(Go標準ライブラリ、ランタイム、テストスイートのコンパイルとテスト実行)を呼び出します。`all.bash` は、Goの完全なインストールとテストを行うために使用され、特に開発者がGoのソースコードを変更した際に、その変更が全体に与える影響を確認するために頻繁に実行されます。
### `GOROOT` と `GOBIN`
Goのビルドプロセスにおいて、`GOROOT` と `GOBIN` は重要な環境変数です。
* **`GOROOT`**: Go SDK(Software Development Kit)のインストール場所を指定する環境変数です。Goコンパイラ、標準ライブラリ、その他のコアツールが配置されているディレクトリを指します。Goツールは `GOROOT` を使用して、Goプログラムのビルドと実行に必要なコンポーネントを見つけます。通常、Goを標準的な方法でインストールした場合、この変数を手動で設定する必要はありません。
* **`GOBIN`**: `go install` コマンドを使用してGoの実行可能プログラム(バイナリ)がインストールされるディレクトリを指定する環境変数です。`go install` を実行すると、コンパイルされた実行可能ファイルは `GOBIN` で指定されたディレクトリに配置されます。このディレクトリは通常、システムの `PATH` 環境変数に追加され、ターミナルからどこからでもインストールされたコマンドを実行できるようにします。
### `go_bootstrap-tool` と `go-tool`
Goのブートストラップビルドプロセスでは、一時的なツールが作成されることがあります。これらは、最終的なGoツールチェインをビルドするために使用される中間的なツールです。
* **`go_bootstrap-tool`**: ブートストラッププロセス中に一時的に作成されるツールの名前の一部として使用される可能性があります。これは、最終的な `go-tool` が完成するまでの間、ビルドプロセスを進行させるために利用される、より原始的なバージョンのツールを指すことがあります。
* **`go-tool`**: Goのビルドシステムが内部的に使用するツール群を指します。これには、コンパイラ、リンカ、アセンブラなどが含まれます。
このコミットの変更は、ブートストラッププロセス中に生成される一時的なツール名 (`go_bootstrap-tool`) と最終的なツール名 (`go-tool`) の間のパス解決の不整合を修正していると考えられます。
## 技術的詳細
このコミットは、`src/buildscript.sh` 内の `sed` コマンドの置換ルールを修正することで、ビルドスクリプトの破損を解決しています。
`buildscript.sh` は、Goのビルドプロセスにおいて、生成されるスクリプトや設定ファイル内のパスを調整するために使用されます。特に、`$WORK` (一時作業ディレクトリ) や `$GOBIN` (Goバイナリの出力ディレクトリ) などの変数を実際のパスに置換したり、特定のツール名を調整したりする役割を担っています。
問題は、`all.bash` の実行後、`go_bootstrap-tool` という一時的なツール名が正しく `go-tool` に変換されず、かつそのパスが `GOBIN` ではなく `GOROOT` 配下の正しいパスに解決されていなかったことにあります。これにより、後続のビルドで古い、または不正なパスを参照しようとして失敗していました。
コミットによって追加された `sed` コマンドは以下の2行です。
1. `s/go_bootstrap-tool/go-tool/g`
* これは、文字列 `go_bootstrap-tool` の全ての出現箇所を `go-tool` に置換します。これにより、ブートストラッププロセス中に使用される一時的なツール名が、最終的なツール名に統一されます。
2. `s;"\$GOBIN"/go-tool;"$GOROOT"/bin/go-tool;g`
* これは、`"$GOBIN"/go-tool` という形式のパスを `"$GOROOT"/bin/go-tool` に置換します。
* `GOBIN` は通常、ユーザーがインストールしたGoバイナリの場所を指しますが、Goのブートストラップビルドにおいては、Goツールチェインのコアツールは `GOROOT/bin` 配下に配置されるべきです。この置換により、ビルドスクリプトが `go-tool` を参照する際に、常に `GOROOT` 配下の正しいパスを使用するようになります。これにより、`all.bash` 実行後も、Goツールが正しく見つけられ、連続したビルドが成功するようになります。
この修正は、Goのビルドシステムが内部的に使用するツールのパス解決のロジックを強化し、ブートストラッププロセスと通常のビルドプロセスの間の整合性を保つ上で非常に重要です。
## コアとなるコードの変更箇所
```diff
--- a/src/buildscript.sh
+++ b/src/buildscript.sh
@@ -35,6 +35,8 @@ set -e
s/\$WORK/"$WORK"/g
s;"\$GOBIN"/go;&_bootstrap;g
s;\\\\;/;g
+ s/go_bootstrap-tool/go-tool/g
+ s;"\$GOBIN"/go-tool;"$GOROOT"/bin/go-tool;g
'
)>$targ
chmod +x $targ
コアとなるコードの解説
変更は src/buildscript.sh
ファイルの sed
コマンドブロック内に追加されています。
既存の sed
コマンドは、ビルドスクリプト内で使用されるプレースホルダーや一時的なパスを、実際のビルド環境に応じた正しいパスに置換する役割を担っています。
追加された2行の sed
コマンドは、以下の問題を解決します。
-
s/go_bootstrap-tool/go-tool/g
- この行は、ビルドスクリプト内で
go_bootstrap-tool
という文字列が出現した場合、それをgo-tool
に置換します。これは、Goのブートストラップビルドプロセス中に一時的に使用されるツールの命名規則を、最終的なツールの命名規則に合わせるためのものです。これにより、ビルドの段階に応じてツールの参照名が統一され、混乱やパス解決の失敗を防ぎます。
- この行は、ビルドスクリプト内で
-
s;"\$GOBIN"/go-tool;"$GOROOT"/bin/go-tool;g
- この行は、
"$GOBIN"/go-tool
という形式のパスを"$GOROOT"/bin/go-tool
に置換します。 GOBIN
はユーザーがgo install
でインストールしたバイナリの場所を指すことが多いですが、Goのコアツール(go-tool
など)はGOROOT/bin
ディレクトリに存在します。ブートストラップビルドの文脈では、これらのコアツールはGOROOT
配下から参照されるべきです。- この置換により、ビルドスクリプトが
go-tool
を参照する際に、たとえ一時的にGOBIN
を介して参照しようとしていたとしても、常にGOROOT/bin
配下の正しいパスにリダイレクトされるようになります。これにより、all.bash
実行後のビルド環境において、Goツールが正しく見つけられ、ビルドの破損が解消されます。
- この行は、
これらの修正は、Goのビルドシステムが、ブートストラッププロセスと通常のビルドプロセスの間で、ツールのパス解決と命名規則の一貫性を保つために不可欠です。
関連リンク
- Go言語の公式ドキュメント: https://go.dev/
- Go言語のソースコードリポジトリ: https://github.com/golang/go
注記: コミットメッセージに記載されている https://golang.org/cl/5599047
は、Web検索の結果によると「cmd/go: add -C flag to 'go run'
」という別の変更リストを指しているようです。これは、コミットメッセージ内のCL番号が、この特定のビルド修正とは異なる、あるいは内部的なレビューシステムにおける参照である可能性を示唆しています。このコミットの具体的な修正内容とは直接関連しないため、参照情報としてのみ記載します。
参考にした情報源リンク
- Go
all.bash
の目的について:- https://cheney.net/ (Go
all.bash
の説明を含む可能性のある情報源) - https://go.dev/ (Go公式ドキュメント)
- https://cheney.net/ (Go
- Go
GOROOT
およびGOBIN
環境変数について: golang.org/cl/5599047
の検索結果:- Web検索結果より、
cmd/go: add -C flag to 'go run'
という内容が確認されました。
- Web検索結果より、