[インデックス 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 (現在の構造であり、コミット当時のものとは異なる可能性があるが、概念理解に役立つ)