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

[インデックス 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のツールチェインをゼロからビルドする際には「ブートストラップ」と呼ばれる特殊なプロセスが必要です。

  1. ステージ0 (ブートストラップコンパイラ): 最初に、Goのソースコードに含まれるブートストラップ用のGoコンパイラ(通常はGoの古いバージョンで書かれているか、C言語で書かれた最小限のコンパイラ)を既存のCコンパイラ(gccなど)でビルドします。このコミットで言及されている dist ツールもこの初期段階でビルドされます。
  2. ステージ1 (Goコンパイラのビルド): ステージ0でビルドされたブートストラップコンパイラを使用して、Goの最新のソースコードから新しいGoコンパイラをビルドします。
  3. ステージ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 を使用してビルドされた直後に配置されています。

これにより、以下のような挙動が実現されます。

  1. ./make.bash と通常通り実行した場合:スクリプトはこれまで通り、dist ツールのビルドから始まり、Goツールチェイン全体のビルドを完了します。
  2. ./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の変更リストへのリンク)