[インデックス 11876] ファイルの概要
このコミットは、Go言語のビルドシステムにおけるWindows環境でのビルドプロセスを修正することを目的としています。具体的には、src/all.bat
とsrc/run.bat
という2つのバッチファイルに変更が加えられ、PATH
環境変数の管理方法と、Goツールチェインの内部ツールの呼び出し方法が更新されています。これにより、Windows上でのGoのビルドの安定性と正確性が向上しています。
コミット
commit 11f6f7afd63ec33ef473dc17129ccc59ddd1b0f7
Author: Russ Cox <rsc@golang.org>
Date: Mon Feb 13 22:56:42 2012 -0500
build: fix windows build
TBR=golang-dev
CC=golang-dev
https://golang.org/cl/5656051
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/11f6f7afd63ec33ef473dc17129ccc59ddd1b0f7
元コミット内容
このコミットは、Go言語のビルドシステムにおけるWindows環境での問題を解決します。主な変更点は以下の通りです。
src/all.bat
において、PATH
環境変数を一時的に保存し、ビルド完了後に元の状態に戻す処理が追加されました。src/all.bat
において、..\bin\tool\dist banner
という古いツール呼び出しがgo tool dist banner
という新しい形式に置き換えられました。src/run.bat
から、PATH
環境変数の保存と復元、および..\bin\tool\dist env -wp
による環境設定の呼び出しが削除されました。
これらの変更により、Windows上でのGoのビルドプロセスがより堅牢になり、環境変数の管理が適切に行われるようになります。
変更の背景
このコミットが行われた2012年2月時点では、Go言語はまだ比較的新しい言語であり、様々なプラットフォームでのビルドシステムの成熟度が向上している段階でした。特にWindows環境は、Unix系システムとは異なるパスの扱い方やコマンドの実行方法があるため、ビルドスクリプトの調整が頻繁に行われていました。
このコミットの背景には、Windows環境でのGoのビルドが不安定であったり、PATH
環境変数の変更が永続化してしまったりする問題があったと考えられます。Goのビルドプロセスでは、コンパイラやリンカなどのツールが正しくPATH
から見つけられる必要があり、またビルド後にシステム全体のPATH
が意図せず変更されたままになることを避ける必要がありました。
..\bin\tool\dist banner
からgo tool dist banner
への変更は、Goツールチェインの内部構造の進化を示唆しています。Goは、go
コマンドを介して様々なサブコマンド(build
, run
, test
など)を提供する統一されたインターフェースを採用しており、dist
ツールもその一部としてgo tool dist
という形式でアクセスされるようになったと考えられます。これにより、ツールの発見性と一貫性が向上します。
前提知識の解説
バッチファイル (.bat
)
Windowsオペレーティングシステムで使用されるスクリプトファイルの一種です。コマンドプロンプト(CMD)で実行される一連のコマンドを記述できます。Goのビルドシステムでは、Windows環境でのビルド手順を自動化するためにバッチファイルが利用されていました。
環境変数 (PATH
)
オペレーティングシステムが実行可能ファイルを探すディレクトリのリストを定義する環境変数です。コマンドプロンプトでコマンド名を入力した際に、システムはこのPATH
に指定されたディレクトリを順に検索し、該当する実行ファイルを見つけます。ビルドプロセスでは、コンパイラやリンカなどのツールがPATH
に含まれていることが重要です。
set
コマンド
Windowsのバッチファイルで環境変数を設定するために使用されるコマンドです。
set VAR=VALUE
:VAR
という環境変数にVALUE
を設定します。set VAR=%OLD_VAR%
:OLD_VAR
の現在の値をVAR
にコピーします。
call
コマンド
バッチファイル内で別のバッチファイルを実行するために使用されます。call
を使用しない場合、呼び出されたバッチファイルが終了すると、呼び出し元のバッチファイルも終了してしまいます。call
を使用することで、呼び出されたバッチファイルが終了した後も、呼び出し元のバッチファイルの残りのコマンドが実行されます。
go tool
Go言語の公式ツールチェインの一部であり、Goの内部ツール(コンパイラ、リンカ、ディストリビューションツールなど)にアクセスするためのコマンドです。go tool <toolname>
の形式で使われます。これにより、Goのバージョンやインストールパスに依存せず、適切なツールが呼び出されるようになります。
dist
ツール
Goのビルドシステム内部で使用されるディストリビューションツールの一部です。banner
サブコマンドは、ビルドのバナー(バージョン情報など)を表示するために使われることがあります。env -wp
サブコマンドは、環境変数を設定するためのスクリプトを生成するために使われることがあります。
技術的詳細
このコミットの技術的詳細は、Windowsバッチスクリプトにおける環境変数の管理と、Goツールチェインの内部ツールの呼び出し規約の変更に集約されます。
PATH
環境変数の管理の改善
以前のバージョンでは、src/run.bat
がPATH
環境変数を一時的に変更し、その変更をrun.bat
の終了時に元に戻していました。しかし、src/all.bat
がsrc/run.bat
をcall
で呼び出している場合、run.bat
がPATH
を元に戻しても、all.bat
の残りの処理や、all.bat
が呼び出す他のスクリプトに影響を与える可能性がありました。
このコミットでは、PATH
の保存と復元をsrc/all.bat
に移動しています。
src/all.bat
の冒頭でset GOOLDPATH=%PATH%
を実行し、現在のPATH
をGOOLDPATH
という一時変数に保存します。src/all.bat
の末尾でset PATH=%GOOLDPATH%
を実行し、PATH
を元の状態に戻します。
これにより、all.bat
が開始されてから終了するまでの間に行われるすべての処理(make.bat
やrun.bat
の呼び出しを含む)において、PATH
が適切に管理され、ビルドプロセスがシステム全体のPATH
に与える影響が局所化されます。これは、ビルドのクリーンアップとシステムの整合性維持において重要な改善です。
go tool
への移行
以前は、..\bin\tool\dist banner
のように、Goの内部ツールが特定の相対パス(..\bin\tool
)にある実行ファイルを直接呼び出す形式でした。これは、Goのインストールパスやビルド環境の構成に依存する可能性があり、柔軟性に欠けるアプローチです。
このコミットでは、go tool dist banner
という形式に変更されています。go tool
コマンドは、Goのインストールディレクトリ内の適切なツールを自動的に探し出して実行します。これにより、ビルドスクリプトがGoのインストールパスにハードコードされることなく、よりポータブルで堅牢な方法で内部ツールを呼び出すことができるようになります。これは、Goツールチェインの設計思想である「統一されたコマンドラインインターフェース」への準拠を強化するものです。
環境設定スクリプトの削除
src/run.bat
から削除された以下の行は、dist env -wp
コマンドを使って環境変数を設定する一時的なバッチファイルを生成し、それを実行するものでした。
..\bin\tool\dist env -wp >env.bat
if errorlevel 1 goto fail
call env.bat
del env.bat
この部分が削除されたのは、PATH
の管理がall.bat
に一元化されたこと、またはgo tool
コマンド自体が内部的に必要な環境設定を処理するようになったこと、あるいはこの特定の環境設定がもはや不要になったことなどが考えられます。Goのビルドシステムは進化しており、より洗練された方法で環境が準備されるようになった結果として、このような明示的な環境設定スクリプトの生成と実行が不要になったと推測されます。
コアとなるコードの変更箇所
src/all.bat
--- a/src/all.bat
+++ b/src/all.bat
@@ -9,11 +9,14 @@ echo all.bat must be run from go\src
goto end
:ok
+set GOOLDPATH=%PATH%
+\
call make.bat --no-banner
if %GOBUILDFAIL%==1 goto end
call run.bat --no-rebuild
if %GOBUILDFAIL%==1 goto end
-..\\bin\\tool\\dist banner
+go tool dist banner
\
:end
+set PATH=%GOOLDPATH%\
if x%GOBUILDEXIT%==x1 exit %GOBUILDFAIL%\
src/run.bat
--- a/src/run.bat
+++ b/src/run.bat
@@ -3,14 +3,8 @@
:: license that can be found in the LICENSE file.\
@echo off
-set GOOLDPATH=%PATH%\
set GOBUILDFAIL=0
\
-..\\bin\\tool\\dist env -wp >env.bat
-if errorlevel 1 goto fail
-call env.bat
-del env.bat
-\
rem TODO avoid rebuild if possible
\
if x%1==x--no-rebuild goto norebuild
@@ -44,4 +38,3 @@ goto end
set GOBUILDFAIL=1
\
:end
-set PATH=%GOOLDPATH%\
コアとなるコードの解説
src/all.bat
の変更点
-
PATH
環境変数の保存と復元:set GOOLDPATH=%PATH%
: スクリプトの実行開始時に、現在のPATH
環境変数の値をGOOLDPATH
という新しい環境変数に保存します。これは、スクリプト内でPATH
が変更された場合でも、元の値を保持しておくための措置です。set PATH=%GOOLDPATH%
: スクリプトの終了ラベル:end
の直前で、PATH
環境変数をGOOLDPATH
に保存しておいた元の値に戻します。これにより、all.bat
の実行がシステム全体のPATH
に永続的な影響を与えないようにします。
-
go tool
への移行:- ..\\bin\\tool\\dist banner
: 削除された行です。これは、Goのビルドツールが特定の相対パスにある実行ファイルを直接呼び出す古い方法でした。+ go tool dist banner
: 追加された行です。これは、go tool
コマンドを介してdist
ツールのbanner
サブコマンドを呼び出す新しい、より標準的な方法です。これにより、Goのツールチェインが提供する統一されたインターフェースが利用され、ツールの発見性とポータビリティが向上します。
src/run.bat
の変更点
-
PATH
環境変数の保存と復元処理の削除:- set GOOLDPATH=%PATH%
:run.bat
の冒頭にあったPATH
保存の行が削除されました。- set PATH=%GOOLDPATH%
:run.bat
の末尾にあったPATH
復元の行が削除されました。 これらの変更は、PATH
の管理責任がall.bat
に一元化されたことを意味します。run.bat
はall.bat
から呼び出されるため、all.bat
がPATH
のライフサイクル全体を管理する方が、より堅牢で予測可能な動作となります。
-
環境設定スクリプト生成・実行処理の削除:
- ..\\bin\\tool\\dist env -wp >env.bat
- if errorlevel 1 goto fail
- call env.bat
- del env.bat
これらの行は、dist env -wp
コマンドを使用して一時的な環境設定バッチファイル(env.bat
)を生成し、それを実行して環境変数を設定するものでした。この処理が削除されたのは、Goのビルドシステムが進化し、この方法での環境設定が不要になったか、あるいはより効率的で内部的な方法で環境が準備されるようになったためと考えられます。これにより、ビルドスクリプトの複雑さが軽減されます。
関連リンク
- Go言語公式ウェブサイト: https://go.dev/
- Go言語のソースコードリポジトリ (GitHub): https://github.com/golang/go
- Goの
go tool
コマンドに関するドキュメント (Go 1.18の例): https://go.dev/doc/go1.18#go-tool (コミット当時のドキュメントではないが、概念理解に役立つ)
参考にした情報源リンク
- Go言語のコミット履歴 (GitHub): https://github.com/golang/go/commits/master
- Go言語のコードレビューシステム (Gerrit): https://go.dev/cl/ (コミットメッセージにある
https://golang.org/cl/5656051
はGerritの変更リストへのリンク) - Windows Batch Scripting (Microsoft Learn): https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/batch-commands
- 環境変数 (Wikipedia): https://ja.wikipedia.org/wiki/%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0
- Goのビルドシステムに関する議論 (Go Mailing Listなど、当時の情報源を探す必要があるが、一般的な情報源として): https://groups.google.com/g/golang-nuts
- Goの
dist
ツールに関する情報 (Goのソースコード内のsrc/cmd/dist
ディレクトリなど) - Goの
go tool
コマンドの進化に関する情報 (Goのリリースノートやブログ記事など) - Goの
go tool
コマンドのソースコード: https://github.com/golang/go/tree/master/src/cmd/go/internal/tool (現在の構造であり、コミット当時のものとは異なる可能性があるが、概念理解に役立つ) - Goの
dist
ツールのソースコード: https://github.com/golang/go/tree/master/src/cmd/dist (現在の構造であり、コミット当時のものとは異なる可能性があるが、概念理解に役立つ)