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

[インデックス 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 スクリプトが 6a6c といったツールを実行する際に、それらのツールがどこにあるかを明示的に指定していなかったため、システムが PATH を検索してツールを見つける必要がありました。もし PATH にツールが含まれていなかったり、意図しないツールが先に発見されたりすると、ビルドが失敗したり、予期せぬ動作を引き起こしたりする可能性がありました。

この問題を解決し、Goのインストールプロセスをより簡単で信頼性の高いものにするために、ツールへのパスを明示的に指定する変更が導入されました。

前提知識の解説

Go言語の初期のビルドシステムとツールチェイン

Go言語は、その設計思想の一つとして「高速なコンパイル」を掲げています。初期のGoのビルドシステムは、現在の go build コマンドのような統合されたツールではなく、より低レベルなツール群をシェルスクリプトで連携させる形でした。

  • 6a (アセンブラ): Go言語の初期において、6a はPlan 9アーキテクチャに由来するアセンブラツールでした。Goのランタイムや一部の標準ライブラリは、パフォーマンスが重要な部分でアセンブリ言語で記述されており、これらを機械語に変換するために 6a が使用されました。6a6amd64 アーキテクチャ(64ビットIntel/AMDプロセッサ)を指し、a はアセンブラを意味します。

  • 6c (Cコンパイラ): 同様に、6c はPlan 9アーキテクチャに由来するCコンパイラでした。Go言語自体はC言語で書かれていませんが、初期のGoランタイムの一部や、GoとC言語を連携させるためのCコードをコンパイルするために使用されました。6c6amd64 アーキテクチャ、c はCコンパイラを意味します。

  • make.bash: これはGoのビルドプロセスを自動化するためのシェルスクリプトです。Goのソースコードから実行可能なバイナリを生成するために、6a6c といったツールを適切な順序で呼び出し、中間ファイルを生成し、最終的なライブラリや実行ファイルを配置する役割を担っていました。

  • 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 環境変数に設定されたディレクトリを検索して 6a6c を見つけることを期待していました。しかし、以下のような問題が発生する可能性がありました。

  1. PATH にツールが含まれていない: Goのビルドツールが $HOME/bin/ にインストールされていても、ユーザーの PATH$HOME/bin/ が含まれていない場合、スクリプトはツールを見つけることができませんでした。
  2. 誤ったツールの実行: もし PATH 上の別のディレクトリに、たまたま 6a6c という名前の別の実行可能ファイルが存在した場合、意図しないツールが実行されてしまい、ビルドエラーや予期せぬ動作につながる可能性がありました。これは特に、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つの行が変更されています。

  1. - 6a rt0_amd64_darwin.s+ $HOME/bin/6a rt0_amd64_darwin.s に変更。

    • macOS (darwin) 向けの rt0_amd64_darwin.s アセンブリファイルを 6a アセンブラでコンパイルするコマンドです。変更により、6a の実行パスが $HOME/bin/6a に明示されました。
  2. - 6a rt0_amd64_linux.s+ $HOME/bin/6a rt0_amd64_linux.s に変更。

    • Linux向けの rt0_amd64_linux.s アセンブリファイルを 6a アセンブラでコンパイルするコマンドです。同様に、6a の実行パスが $HOME/bin/6a に明示されました。
  3. - 6c runtime.c+ $HOME/bin/6c runtime.c に変更。

    • runtime.c Cソースファイルを 6c Cコンパイラでコンパイルするコマンドです。6c の実行パスが $HOME/bin/6c に明示されました。

これらの変更はすべて、6a6c というGoのビルドツールへの呼び出しに、$HOME/bin/ というプレフィックスを追加することで、ツールの検索パスを PATH 環境変数に依存させず、Goのインストールディレクトリ内のツールを直接指し示すようにしています。これにより、ビルドの信頼性とインストールの容易さが大幅に向上しました。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメントやブログ記事 (上記「関連リンク」に記載)
  • Plan 9のドキュメント (上記「関連リンク」に記載)
  • 一般的なUnix/Linuxの PATH 環境変数に関する知識
  • Gitのコミット履歴と差分表示の解釈
  • Go言語の初期のビルドプロセスに関する一般的な知識 (Web検索を通じて得られた情報を含む)