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

[インデックス 13293] ファイルの概要

このコミットは、Go言語のビルドスクリプト(src/all.bashsrc/all.bat)におけるPATH環境変数の扱いに関する修正です。具体的には、dist bannerコマンドを実行する前にPATH環境変数を元の状態に戻すことで、ビルドプロセスの安定性と予測可能性を向上させています。

コミット

commit 81368d9bb9cc503df33d470785edc816a9086cd3
Author: Shenghou Ma <minux.ma@gmail.com>
Date:   Wed Jun 6 20:19:16 2012 +0800

    build: restore PATH before "dist banner"
            Fixes #3699.
    
    R=golang-dev, r, rsc
    CC=golang-dev
    https://golang.org/cl/6272048

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/81368d9bb9cc503df33d470785edc816a9086cd3

元コミット内容

build: restore PATH before "dist banner"
        Fixes #3699.

変更の背景

このコミットは、Go言語のIssue #3699を修正するために行われました。Issue #3699は、GoのビルドプロセスにおいてPATH環境変数が変更されたままになり、その後のdist bannerコマンドの実行に影響を与える可能性があった問題を指摘しています。

Goのビルドシステムは、make.bashmake.batといったスクリプトを使用して、Goツールチェイン自体をビルドします。このビルドプロセス中に、一時的にPATH環境変数が変更されることがあります。例えば、ビルドされたばかりのGoツール(goコマンドなど)が一時的なパスに追加され、その後のビルドステップで利用できるようにするためです。

しかし、dist bannerコマンドは、ビルドが完了した後にビルド情報を表示するために実行されるものであり、このコマンドが実行される際には、ビルドプロセス中に変更されたPATH環境変数の影響を受けないことが望ましいです。もしPATHが変更されたままだと、dist bannerが予期せぬバージョンのツールを参照したり、環境に依存する問題を引き起こしたりする可能性がありました。

このコミットは、dist bannerを実行する直前にPATHを元の状態に戻すことで、このような潜在的な問題を回避し、ビルドプロセスの堅牢性を高めることを目的としています。

前提知識の解説

  • PATH環境変数: オペレーティングシステムが実行可能ファイル(コマンド)を探す際に参照するディレクトリのリストです。例えば、goコマンドを実行する際に、システムはこのPATHに設定されたディレクトリの中からgoという名前の実行ファイルを探します。
  • Go言語のビルドシステム: Go言語自体をソースコードからビルドするための仕組みです。通常、GOROOT/srcディレクトリにあるall.bash(Linux/macOS)やall.bat(Windows)といったスクリプトを実行することで、Goコンパイラ、標準ライブラリ、各種ツールなどがビルドされます。
  • dist bannerコマンド: Goツールチェインの一部であるgo tool distコマンドのサブコマンドの一つです。これは、現在のGoのバージョン、ビルド情報、環境に関する詳細を表示するために使用されます。ビルドの健全性を確認したり、デバッグ情報として利用されたりします。
  • Fixes #<issue_number>: Gitのコミットメッセージにおける慣習の一つで、特定のイシュートラッカー(この場合はGitHub Issues)のイシューを修正したことを示します。これにより、コミットとイシューが関連付けられ、イシューが自動的にクローズされることがあります。
  • all.bash / all.bat: Go言語のソースコードからGoツールチェイン全体をビルドするためのトップレベルのスクリプトです。それぞれBashシェルスクリプトとWindowsバッチファイルです。
  • make.bash / make.bat: all.bash / all.batから呼び出されるスクリプトで、Goのコンパイラや標準ライブラリなどの主要なコンポーネントをビルドします。

技術的詳細

このコミットの技術的な核心は、PATH環境変数の保存と復元です。

  1. PATHの保存:

    • src/all.bashでは、OLDPATH="$PATH"という行が追加され、現在のPATH環境変数の値がOLDPATHという新しいシェル変数に保存されます。
    • src/all.batでは、set OLDPATH=%PATH%という行が追加され、現在のPATH環境変数の値がOLDPATHという新しい環境変数に保存されます。
  2. ビルドプロセスの実行:

    • ./make.bash --no-banner (Linux/macOS) または call make.bat --no-banner --no-local (Windows) が実行されます。これらのスクリプトはGoツールチェインのビルドを行い、この過程で一時的にPATHが変更される可能性があります。
    • bash run.bash --no-rebuild (Linux/macOS) または call run.bat --no-rebuild --no-local (Windows) が実行されます。これもビルドプロセスの一部です。
  3. PATHの復元:

    • src/all.bashでは、PATH="$OLDPATH"という行が追加され、OLDPATHに保存されていた元のPATHの値が現在のPATH環境変数に上書きされます。
    • src/all.batでは、set PATH=%OLDPATH%という行が追加され、OLDPATHに保存されていた元のPATHの値が現在のPATH環境変数に上書きされます。
  4. dist bannerの実行:

    • $GOTOOLDIR/dist banner (Linux/macOS) または go tool dist banner (Windows) が実行されます。この時点でPATHはビルド開始前の状態に戻っているため、dist bannerはクリーンな環境で実行され、予期せぬ依存関係の問題を回避できます。

このアプローチにより、ビルドプロセス中にPATHがどのように変更されても、dist bannerコマンドは常に安定した、予測可能な環境で実行されることが保証されます。これは、ビルドの再現性と信頼性を高める上で重要な修正です。

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

src/all.bash

--- a/src/all.bash
+++ b/src/all.bash
@@ -8,6 +8,8 @@ if [ ! -f make.bash ]; then
 	echo 'all.bash must be run from $GOROOT/src' 1>&2
 	exit 1
 fi
+OLDPATH="$PATH"
 . ./make.bash --no-banner
 bash run.bash --no-rebuild
+PATH="$OLDPATH"
 $GOTOOLDIR/dist banner  # print build info

src/all.bat

--- a/src/all.bat
+++ b/src/all.bat
@@ -11,10 +11,12 @@ echo all.bat must be run from go\src
 goto end
 :ok
 
+set OLDPATH=%PATH%
 call make.bat --no-banner --no-local
 if %GOBUILDFAIL%==1 goto end
 call run.bat --no-rebuild --no-local
 if %GOBUILDFAIL%==1 goto end
+set PATH=%OLDPATH%
 go tool dist banner
 
 :end

コアとなるコードの解説

  • src/all.bash:

    • OLDPATH="$PATH": make.bashrun.bashが実行される前に、現在のPATH環境変数の値をOLDPATHというシェル変数に保存しています。
    • PATH="$OLDPATH": make.bashrun.bashの実行後、dist bannerコマンドが実行される直前に、保存しておいたOLDPATHの値をPATH環境変数に戻しています。これにより、dist bannerはビルドプロセスによるPATHの変更の影響を受けずに実行されます。
  • src/all.bat:

    • set OLDPATH=%PATH%: make.batrun.batが実行される前に、現在のPATH環境変数の値をOLDPATHという環境変数に保存しています。Windowsのバッチファイルでは、setコマンドを使って環境変数を設定します。
    • set PATH=%OLDPATH%: make.batrun.batの実行後、go tool dist bannerコマンドが実行される直前に、保存しておいたOLDPATHの値をPATH環境変数に戻しています。これもall.bashと同様に、dist bannerがクリーンな環境で実行されることを保証します。

これらの変更は、ビルドスクリプトの堅牢性を高め、環境依存のビルド問題を減らすための重要な改善です。

関連リンク

参考にした情報源リンク

  • Go言語のソースコード(特にsrc/all.bashsrc/all.batの歴史的な変更履歴)
  • Gitのコミットと差分表示の一般的な理解
  • 環境変数PATHに関する一般的な知識
  • Go言語のビルドプロセスに関する一般的な知識
  • GitHub Issuesの利用方法に関する一般的な知識
  • go tool distコマンドに関する一般的な知識 (Goの公式ドキュメントやgo help distコマンドから得られる情報)
  • BashスクリプトとWindowsバッチファイルの基本的な構文と環境変数操作