[インデックス 161] ファイルの概要
このコミットは、Go言語の初期のビルドスクリプトである src/runtime/make.bash において、アセンブラ (6a) およびCコンパイラ (6c) の実行パスを明示的に $HOME/bin/ に変更することで、Goのインストールプロセスを簡素化し、より堅牢にすることを目的としています。これにより、環境変数 PATH の設定に依存せず、ツールが確実に発見されるようになります。
コミット
- コミットハッシュ:
54bca54655345fcdd9f66c9c87b24f59f4cb2118 - 作者: Rob Pike r@golang.org
- 日付: Thu Jun 12 13:43:47 2008 -0700
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/54bca54655345fcdd9f66c9c87b24f59f4cb2118
元コミット内容
make paths explicit for easier installation
SVN=122488
変更の背景
このコミットが行われた2008年当時、Go言語はまだ開発の初期段階にあり、ビルドシステムも現在のように洗練されていませんでした。当時のGoのビルドプロセスでは、アセンブラやコンパイラといったツールがシステム上の PATH 環境変数に依存して実行されていました。しかし、ユーザーの環境によっては PATH の設定が適切でなかったり、異なるバージョンのツールが PATH 上に存在したりする可能性があり、これがGoのビルドやインストールを困難にする原因となっていました。
具体的には、make.bash スクリプトが 6a や 6c といったツールを実行する際に、それらのツールがどこにあるかを明示的に指定していなかったため、システムが PATH を検索してツールを見つける必要がありました。もし PATH にツールが含まれていなかったり、意図しないツールが先に発見されたりすると、ビルドが失敗したり、予期せぬ動作を引き起こしたりする可能性がありました。
この問題を解決し、Goのインストールプロセスをより簡単で信頼性の高いものにするために、ツールへのパスを明示的に指定する変更が導入されました。
前提知識の解説
Go言語の初期のビルドシステムとツールチェイン
Go言語は、その設計思想の一つとして「高速なコンパイル」を掲げています。初期のGoのビルドシステムは、現在の go build コマンドのような統合されたツールではなく、より低レベルなツール群をシェルスクリプトで連携させる形でした。
-
6a(アセンブラ): Go言語の初期において、6aはPlan 9アーキテクチャに由来するアセンブラツールでした。Goのランタイムや一部の標準ライブラリは、パフォーマンスが重要な部分でアセンブリ言語で記述されており、これらを機械語に変換するために6aが使用されました。6aの6はamd64アーキテクチャ(64ビットIntel/AMDプロセッサ)を指し、aはアセンブラを意味します。 -
6c(Cコンパイラ): 同様に、6cはPlan 9アーキテクチャに由来するCコンパイラでした。Go言語自体はC言語で書かれていませんが、初期のGoランタイムの一部や、GoとC言語を連携させるためのCコードをコンパイルするために使用されました。6cの6はamd64アーキテクチャ、cはCコンパイラを意味します。 -
make.bash: これはGoのビルドプロセスを自動化するためのシェルスクリプトです。Goのソースコードから実行可能なバイナリを生成するために、6aや6cといったツールを適切な順序で呼び出し、中間ファイルを生成し、最終的なライブラリや実行ファイルを配置する役割を担っていました。 -
rt0_amd64_darwin.s/rt0_amd64_linux.s: これらはGoランタイムの初期化コード(runtime zero)のアセンブリソースファイルです。それぞれmacOS (darwin) とLinux向けの、プログラムが開始される際に最初に実行される低レベルな処理(スタックの設定、引数の処理など)を記述しています。これらは6aによってアセンブルされます。 -
runtime.c: Goランタイムの一部をC言語で記述したソースファイルです。これは6cによってコンパイルされます。 -
$HOME/bin/: Unix系システムにおける一般的な慣習として、ユーザーがインストールした実行可能ファイルを配置するディレクトリです。PATH環境変数にこのディレクトリが含まれていることが多く、ここに配置されたコマンドはシェルから直接実行できます。Goのビルドツールも、インストール時にこのディレクトリに配置されることが想定されていました。
PATH 環境変数
PATH 環境変数は、オペレーティングシステムが実行可能ファイル(コマンド)を検索するディレクトリのリストを定義します。ユーザーがコマンド名を入力すると、システムはこの PATH にリストされているディレクトリを順番に検索し、最初に見つかった実行可能ファイルを実行します。もしコマンドが見つからなければ、「command not found」といったエラーが表示されます。
技術的詳細
このコミットの技術的な核心は、ビルドスクリプト src/runtime/make.bash 内で、6a および 6c というツールを呼び出す際に、単にツール名で呼び出すのではなく、$HOME/bin/ という絶対パス(厳密にはホームディレクトリからの相対パス)をプレフィックスとして付加したことです。
変更前は、スクリプトは以下のようにツールを呼び出していました。
6a rt0_amd64_darwin.s
6a rt0_amd64_linux.s
6c runtime.c
これは、システムが PATH 環境変数に設定されたディレクトリを検索して 6a や 6c を見つけることを期待していました。しかし、以下のような問題が発生する可能性がありました。
PATHにツールが含まれていない: Goのビルドツールが$HOME/bin/にインストールされていても、ユーザーのPATHに$HOME/bin/が含まれていない場合、スクリプトはツールを見つけることができませんでした。- 誤ったツールの実行: もし
PATH上の別のディレクトリに、たまたま6aや6cという名前の別の実行可能ファイルが存在した場合、意図しないツールが実行されてしまい、ビルドエラーや予期せぬ動作につながる可能性がありました。これは特に、Plan 9のツールチェインが既にインストールされている環境などで起こりえました。
変更後、スクリプトは以下のようにツールを呼び出すようになりました。
$HOME/bin/6a rt0_amd64_darwin.s
$HOME/bin/6a rt0_amd64_linux.s
$HOME/bin/6c runtime.c
この変更により、以下の利点がもたらされました。
- 信頼性の向上:
PATH環境変数の設定に依存せず、Goのビルドツールがインストールされることが想定されている$HOME/bin/ディレクトリから直接ツールを呼び出すため、ツールが確実に発見され、正しいバージョンが実行されるようになります。 - インストールの簡素化: ユーザーはGoをビルドするために、事前に
PATH環境変数を適切に設定する必要がなくなります。これにより、Goの初期セットアップがより簡単でエラーの少ないものになります。 - 環境の独立性: 異なる環境や既存のツールチェインとの競合を避けることができます。Goのビルドは、Go自身のツールチェインに閉じて実行されるようになります。
この変更は、Go言語がより多くのユーザーに利用されるようになるための、初期のユーザビリティ改善の一環として非常に重要でした。
コアとなるコードの変更箇所
--- a/src/runtime/make.bash
+++ b/src/runtime/make.bash
@@ -4,11 +4,11 @@
set -ex
-6a rt0_amd64_darwin.s
+$HOME/bin/6a rt0_amd64_darwin.s
mv rt0_amd64_darwin.6 ../../lib/rt0_amd64_darwin.6
-6a rt0_amd64_linux.s
+$HOME/bin/6a rt0_amd64_linux.s
mv rt0_amd64_linux.6 ../../lib/rt0_amd64_linux.6
-6c runtime.c
+$HOME/bin/6c runtime.c
mv runtime.6 ../../lib/rt_amd64.6
コアとなるコードの解説
変更されたファイルは src/runtime/make.bash です。これはGoランタイムをビルドするためのシェルスクリプトです。
このスクリプト内で、以下の3つの行が変更されています。
-
- 6a rt0_amd64_darwin.sが+ $HOME/bin/6a rt0_amd64_darwin.sに変更。- macOS (darwin) 向けの
rt0_amd64_darwin.sアセンブリファイルを6aアセンブラでコンパイルするコマンドです。変更により、6aの実行パスが$HOME/bin/6aに明示されました。
- macOS (darwin) 向けの
-
- 6a rt0_amd64_linux.sが+ $HOME/bin/6a rt0_amd64_linux.sに変更。- Linux向けの
rt0_amd64_linux.sアセンブリファイルを6aアセンブラでコンパイルするコマンドです。同様に、6aの実行パスが$HOME/bin/6aに明示されました。
- Linux向けの
-
- 6c runtime.cが+ $HOME/bin/6c runtime.cに変更。runtime.cCソースファイルを6cCコンパイラでコンパイルするコマンドです。6cの実行パスが$HOME/bin/6cに明示されました。
これらの変更はすべて、6a と 6c というGoのビルドツールへの呼び出しに、$HOME/bin/ というプレフィックスを追加することで、ツールの検索パスを PATH 環境変数に依存させず、Goのインストールディレクトリ内のツールを直接指し示すようにしています。これにより、ビルドの信頼性とインストールの容易さが大幅に向上しました。
関連リンク
- Go言語の初期の歴史に関する情報:
- The Go Programming Language (Go公式ドキュメント)
- A brief history of Go (Go公式ブログ)
- Plan 9 from Bell Labs:
- Plan 9 from Bell Labs (Plan 9公式サイト)
- Plan 9 Assembly Language (Plan 9アセンブリ言語のドキュメント)
参考にした情報源リンク
- Go言語の公式ドキュメントやブログ記事 (上記「関連リンク」に記載)
- Plan 9のドキュメント (上記「関連リンク」に記載)
- 一般的なUnix/Linuxの
PATH環境変数に関する知識 - Gitのコミット履歴と差分表示の解釈
- Go言語の初期のビルドプロセスに関する一般的な知識 (Web検索を通じて得られた情報を含む)