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

[インデックス 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のソースコードを変更した際に、その変更が全体に与える影響を確認するために頻繁に実行されます。

GOROOTGOBIN

Goのビルドプロセスにおいて、GOROOTGOBIN は重要な環境変数です。

  • GOROOT: Go SDK(Software Development Kit)のインストール場所を指定する環境変数です。Goコンパイラ、標準ライブラリ、その他のコアツールが配置されているディレクトリを指します。Goツールは GOROOT を使用して、Goプログラムのビルドと実行に必要なコンポーネントを見つけます。通常、Goを標準的な方法でインストールした場合、この変数を手動で設定する必要はありません。
  • GOBIN: go install コマンドを使用してGoの実行可能プログラム(バイナリ)がインストールされるディレクトリを指定する環境変数です。go install を実行すると、コンパイルされた実行可能ファイルは GOBIN で指定されたディレクトリに配置されます。このディレクトリは通常、システムの PATH 環境変数に追加され、ターミナルからどこからでもインストールされたコマンドを実行できるようにします。

go_bootstrap-toolgo-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のビルドシステムが内部的に使用するツールのパス解決のロジックを強化し、ブートストラッププロセスと通常のビルドプロセスの間の整合性を保つ上で非常に重要です。

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

--- 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 コマンドは、以下の問題を解決します。

  1. s/go_bootstrap-tool/go-tool/g

    • この行は、ビルドスクリプト内で go_bootstrap-tool という文字列が出現した場合、それを go-tool に置換します。これは、Goのブートストラップビルドプロセス中に一時的に使用されるツールの命名規則を、最終的なツールの命名規則に合わせるためのものです。これにより、ビルドの段階に応じてツールの参照名が統一され、混乱やパス解決の失敗を防ぎます。
  2. 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のビルドシステムが、ブートストラッププロセスと通常のビルドプロセスの間で、ツールのパス解決と命名規則の一貫性を保つために不可欠です。

関連リンク

注記: コミットメッセージに記載されている https://golang.org/cl/5599047 は、Web検索の結果によると「cmd/go: add -C flag to 'go run'」という別の変更リストを指しているようです。これは、コミットメッセージ内のCL番号が、この特定のビルド修正とは異なる、あるいは内部的なレビューシステムにおける参照である可能性を示唆しています。このコミットの具体的な修正内容とは直接関連しないため、参照情報としてのみ記載します。

参考にした情報源リンク

# [インデックス 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 コマンドは、以下の問題を解決します。

  1. s/go_bootstrap-tool/go-tool/g

    • この行は、ビルドスクリプト内で go_bootstrap-tool という文字列が出現した場合、それを go-tool に置換します。これは、Goのブートストラップビルドプロセス中に一時的に使用されるツールの命名規則を、最終的なツールの命名規則に合わせるためのものです。これにより、ビルドの段階に応じてツールの参照名が統一され、混乱やパス解決の失敗を防ぎます。
  2. 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のビルドシステムが、ブートストラッププロセスと通常のビルドプロセスの間で、ツールのパス解決と命名規則の一貫性を保つために不可欠です。

関連リンク

注記: コミットメッセージに記載されている https://golang.org/cl/5599047 は、Web検索の結果によると「cmd/go: add -C flag to 'go run'」という別の変更リストを指しているようです。これは、コミットメッセージ内のCL番号が、この特定のビルド修正とは異なる、あるいは内部的なレビューシステムにおける参照である可能性を示唆しています。このコミットの具体的な修正内容とは直接関連しないため、参照情報としてのみ記載します。

参考にした情報源リンク