[インデックス 11660] ファイルの概要
このコミットは、Go言語のビルドシステムの一部である src/make.bash
スクリプトに新しいオプション --dist-tool
を追加するものです。src/make.bash
はGoのソースコードからコンパイラやツールチェインをビルドするための主要なシェルスクリプトであり、Go開発環境の構築において中心的な役割を担っています。
コミット
このコミットは、Go言語のビルドスクリプト src/make.bash
に --dist-tool
という新しいコマンドライン引数を導入します。この引数が指定された場合、スクリプトは dist
ツール(Goのビルドプロセスにおける重要な補助ツール)のビルドが完了した直後に終了するようになります。これにより、dist
ツールのみをビルドしたい場合に、それ以降のGoツールチェイン全体のビルドプロセスをスキップできるようになり、ビルド時間の短縮や特定のビルドステップの分離が可能になります。
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/1c290fda500a748abcdb4622136c047787823534
元コミット内容
build: add make.bash --dist-tool
R=golang-dev, n13m3y3r
CC=golang-dev
https://golang.org/cl/5634048
変更の背景
Go言語のビルドプロセスは、その自己ホスト型(self-hosting)の性質上、複数のステージを経て行われます。特に、GoのコンパイラやツールはGo自身で書かれているため、GoのソースコードからGoのツールチェインをビルドするには、まず既存の(またはブートストラップ用の)Goコンパイラが必要です。このプロセスの中で、dist
ツールは非常に初期の段階でビルドされる重要な補助ツールです。
この変更の背景には、開発者がGoのツールチェイン全体をビルドすることなく、dist
ツールだけをビルドしたいという特定のユースケースがあったと考えられます。例えば、dist
ツールの開発やデバッグ、あるいはGoのビルドシステム自体を分析する際に、毎回フルビルドを行うのは非効率です。--dist-tool
オプションを追加することで、make.bash
スクリプトの実行を dist
ツールのビルド直後で停止させ、開発者の利便性と効率性を向上させることが目的です。
前提知識の解説
make.bash
スクリプト
make.bash
は、Go言語のソースコードリポジトリの src
ディレクトリ直下にあるシェルスクリプトです。これはGoの公式なビルドスクリプトであり、Goのコンパイラ、標準ライブラリ、およびその他のツール(go
コマンド自体を含む)をソースからビルドするために使用されます。Goのビルドプロセスは複雑であり、特にGoが自己ホスト型であるため、このスクリプトはブートストラップコンパイラの使用から最終的なツールチェインの構築まで、多段階のビルドをオーケストレーションします。
dist
ツール
dist
ツールは、Goのビルドプロセスにおいて非常に重要な役割を果たす内部ツールです。これはGoのソースコードからGoのツールチェインをビルドする際の様々なタスク(例えば、ソースファイルのコピー、ビルドディレクトリの準備、特定のアーキテクチャ向けのビルド設定など)を管理するために使用されます。dist
ツール自体はC言語で書かれており、Goのビルドプロセスの初期段階で gcc
を使用してビルドされます。これは、Goコンパイラがまだ利用できない段階でビルドプロセスを駆動するために必要だからです。
Goのブートストラッププロセス
Go言語は自己ホスト型言語であり、そのコンパイラやツールチェインの多くがGo自身で書かれています。このため、Goのツールチェインをゼロからビルドする際には「ブートストラップ」と呼ばれる特殊なプロセスが必要です。
- ステージ0 (ブートストラップコンパイラ): 最初に、Goのソースコードに含まれるブートストラップ用のGoコンパイラ(通常はGoの古いバージョンで書かれているか、C言語で書かれた最小限のコンパイラ)を既存のCコンパイラ(
gcc
など)でビルドします。このコミットで言及されているdist
ツールもこの初期段階でビルドされます。 - ステージ1 (Goコンパイラのビルド): ステージ0でビルドされたブートストラップコンパイラを使用して、Goの最新のソースコードから新しいGoコンパイラをビルドします。
- ステージ2 (最終的なツールチェインのビルド): ステージ1でビルドされた新しいGoコンパイラを使用して、Goの標準ライブラリやその他のツール(
go
コマンド、リンカ、アセンブラなど)をビルドします。
この多段階プロセスにより、Goは自身の進化をGo自身で駆動できるようになっています。
GOROOT
GOROOT
はGoのインストールディレクトリを指す環境変数です。GoのツールチェインがどこにインストールされているかをGoのツールに教えるために使用されます。make.bash
スクリプトは、ビルドされたツールが正しく GOROOT
を認識するように、コンパイル時にこのパスを埋め込むことがあります。
技術的詳細
このコミットは、src/make.bash
スクリプトの実行フローに条件分岐を追加することで、dist
ツールのビルド後にスクリプトの実行を停止させる機能を実現しています。
変更前の make.bash
スクリプトは、dist
ツールをビルドした後、続けてGoのブートストラップコンパイラやその他のツールチェインのビルドに進んでいました。このコミットによって追加されたコードは、スクリプトの最初の引数($1
)が --dist-tool
であるかどうかをチェックします。
もし $1
が --dist-tool
と一致した場合、スクリプトは exit 0
コマンドを実行して直ちに正常終了します。この exit 0
は、シェルスクリプトが成功裏に完了したことを示す標準的な方法です。この条件分岐は、dist
ツールが gcc
を使用してビルドされた直後に配置されています。
これにより、以下のような挙動が実現されます。
./make.bash
と通常通り実行した場合:スクリプトはこれまで通り、dist
ツールのビルドから始まり、Goツールチェイン全体のビルドを完了します。./make.bash --dist-tool
と実行した場合:スクリプトはdist
ツールをビルドした後、追加されたif
文の条件が真となり、exit 0
で終了します。これにより、それ以降のブートストラップコンパイラのビルドやその他のGoツールのビルドは行われません。
この変更は、Goのビルドプロセスをより細かく制御するためのものであり、特にCI/CD環境や特定の開発シナリオにおいて、必要な部分だけをビルドする「部分ビルド」の可能性を提供します。
コアとなるコードの変更箇所
--- a/src/make.bash
+++ b/src/make.bash
@@ -51,6 +51,11 @@ DEFGOROOT='-DDEFAULT_GOROOT=\"'\"$(cd .. && pwd)\"'\''
gcc -O2 -Wall -Werror -o ../bin/tool/dist -Icmd/dist "$DEFGOROOT" cmd/dist/*.c
echo
+if [ "$1" = "--dist-tool" ]; then
+ # Stop after building dist tool.
+ exit 0
+fi
+
echo '# Building compilers and Go bootstrap tool.'
../bin/tool/dist bootstrap -v # builds go_bootstrap
echo
コアとなるコードの解説
追加されたコードブロックは以下の通りです。
if [ "$1" = "--dist-tool" ]; then
# Stop after building dist tool.
exit 0
fi
if [ "$1" = "--dist-tool" ]; then
: これはシェルスクリプトにおける条件分岐の構文です。$1
: スクリプトに渡された最初のコマンドライン引数を参照します。=
: 文字列の比較演算子です。"--dist-tool"
: 比較対象の文字列リテラルです。- この行全体で、「もしスクリプトの最初の引数が
--dist-tool
と完全に一致するならば」という条件を評価しています。
# Stop after building dist tool.
: これはコメント行であり、このコードブロックの目的を説明しています。dist
ツールのビルド後に停止することを意図していることを示しています。exit 0
: これはシェルスクリプトを終了させるコマンドです。0
は通常、スクリプトがエラーなく正常に完了したことを示す終了ステータスです。
このコードブロックは、dist
ツールが gcc
コマンドによってビルドされた直後に挿入されています。これにより、--dist-tool
引数が存在する場合、dist
ツールのビルドが完了した時点でスクリプトの実行が中断され、それ以降のGoツールチェインのビルドプロセスはスキップされます。
関連リンク
- Go言語の公式リポジトリ: https://github.com/golang/go
- Go言語のビルドに関するドキュメント(Goのソースコード内にあることが多い)
参考にした情報源リンク
- Go言語のソースコード(特に
src/make.bash
およびcmd/dist
ディレクトリ) - Go言語のブートストラッププロセスに関する一般的な情報(Goの公式ドキュメントや関連するブログ記事など)
golang.org/cl/5634048
(GoのコードレビューシステムGerritの変更リストへのリンク)