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

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

このコミットは、Go言語の初期開発段階におけるビルドシステムへの変更を記録しています。具体的には、src/cmd/clean.bashsrc/cmd/make.bash の2つのシェルスクリプトが修正され、新たに gobuild というツールがビルドおよびクリーンアップの対象に追加されています。

コミット

  • コミットハッシュ: 3f548cd2d91e4e7d4cdd3eeaa1b57dce465a0588
  • Author: Russ Cox rsc@golang.org
  • Date: Mon Nov 17 16:59:04 2008 -0800
  • 変更ファイル:
    • src/cmd/clean.bash
    • src/cmd/make.bash
  • 変更行数: 2ファイルで合計2行の追加、2行の削除 (実質的な変更は2行)

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

https://github.com/golang/go/commit/3f548cd2d91e4e7d4cdd3eeaa1b57dce465a0588

元コミット内容

add gobuild to build

R=r
DELTA=2  (0 added, 0 deleted, 2 changed)
OCL=19404
CL=19415
---
 src/cmd/clean.bash | 2 +-\
 src/cmd/make.bash  | 2 +-\
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/cmd/clean.bash b/src/cmd/clean.bash
index 41f4917d9e..0c0cc7fcf5 100644
--- a/src/cmd/clean.bash
+++ b/src/cmd/clean.bash
@@ -3,7 +3,7 @@
 # Use of this source code is governed by a BSD-style
 # license that can be found in the LICENSE file.

-for i in 6l 6a 6c 6g gc cc ar db nm blyacc acid cov prof
+for i in cc 6l 6a 6c gc 6g ar db nm blyacc acid cov gobuild prof
 do
 	cd $i
 	make clean
diff --git a/src/cmd/make.bash b/src/cmd/make.bash
index 980659ff72..280ae34c12 100644
--- a/src/cmd/make.bash
+++ b/src/cmd/make.bash
@@ -12,7 +12,7 @@ bash mkenam
 make enam.o
 cd ..

-for i in cc 6l 6a 6c gc 6g ar db nm blyacc acid cov prof
+for i in cc 6l 6a 6c gc 6g ar db nm blyacc acid cov gobuild prof
 do
 	echo; echo; echo %%%% making $i %%%%; echo
 	cd $i

変更の背景

このコミットは、Go言語の初期開発段階、特にGo 1.0リリース以前のビルドシステムにおける進化の一部です。Go言語は、大規模なコードベースにおけるコンパイル時間の改善とプログラミング生産性の向上を目指して設計されました。初期のGoのビルドプロセスは、Plan 9オペレーティングシステムのツールチェイン(6g6lなど)に由来する個別のコンパイラやリンカコマンドを直接使用していました。

gobuild(後のgo buildコマンドの原型)の追加は、このビルドプロセスを合理化し、より統合されたツールチェインを構築するための初期のステップと考えられます。個々のコンパイラやリンカを直接呼び出すのではなく、gobuildという統一されたコマンドを通じてビルドを管理することで、開発者はよりシンプルで一貫性のある方法でGoプログラムをコンパイルできるようになります。これは、Go言語の設計哲学である「シンプルさ」と「組み込みツール」の重視を反映したものです。

この変更は、Goのビルドシステムが手動のステップから自動化された依存関係解決とコンパイル・リンク処理をカプセル化する方向へと移行していく過程を示しています。

前提知識の解説

Go言語の初期ビルドシステム

Go言語の初期のビルドシステムは、Plan 9オペレーティングシステムのツールチェインの影響を強く受けていました。これは、Go言語の設計者の一人であるKen ThompsonがPlan 9の開発にも深く関わっていたためです。

  • 6g: AMD64アーキテクチャ向けのGoコンパイラ。Goソースコードをオブジェクトファイルにコンパイルします。
  • 6l: AMD64アーキテクチャ向けのリンカ。オブジェクトファイルを結合して実行可能ファイルを生成します。
  • 6a: AMD64アーキテクチャ向けのアセンブラ。
  • 6c: AMD64アーキテクチャ向けのCコンパイラ。
  • gc: Goコンパイラ(汎用)。
  • cc: Cコンパイラ(汎用)。
  • ar: アーカイバ。ライブラリファイルを作成・管理します。
  • db: デバッガ。
  • nm: オブジェクトファイル内のシンボルをリスト表示します。
  • blyacc: Yacc(Yet Another Compiler Compiler)のGo版。パーサジェネレータ。
  • acid: Plan 9のデバッガ。
  • cov: カバレッジツール。
  • prof: プロファイリングツール。

これらのツールは、Goプログラムをビルドするために個別に、またはシェルスクリプト内で組み合わせて使用されていました。

clean.bashmake.bash

Goプロジェクトの初期のビルドプロセスでは、clean.bashmake.bash のようなシェルスクリプトが重要な役割を担っていました。

  • clean.bash: ビルドによって生成された中間ファイルや最終的な実行可能ファイルなどを削除し、プロジェクトをクリーンな状態に戻すためのスクリプトです。開発者が新しいビルドを開始する前や、不要なファイルを削除したい場合に使用されます。
  • make.bash: プロジェクト全体をビルドするためのスクリプトです。通常、各サブディレクトリに移動し、それぞれのMakefileを呼び出すことで、個々のコンポーネント(コンパイラ、リンカ、その他のツールなど)をビルドします。

これらのスクリプトは、Goのツールチェインを構成する様々なコンポーネント(6l, 6a, 6c, 6g, gc, cc, ar, db, nm, blyacc, acid, cov, profなど)に対して、それぞれmake cleanmakeコマンドを実行するループを含んでいました。

gobuild

このコミットで追加されたgobuildは、後のgo buildコマンドの初期の形態であると推測されます。go buildは、Go言語の標準ツールチェインの一部であり、Goソースファイルやパッケージをコンパイルして実行可能バイナリを生成するための主要なコマンドです。これは、個別のコンパイラやリンカコマンドを直接呼び出す手間を省き、依存関係の解決やビルドプロセスの管理を自動的に行うことで、開発者の利便性を大幅に向上させました。

技術的詳細

このコミットの技術的詳細は、Go言語のビルドシステムが、個々のツールを直接操作する段階から、より高レベルな統合ツール(gobuild)を導入する段階へと移行していることを示しています。

clean.bashmake.bashの変更は非常にシンプルですが、その意味合いは大きいです。これらのスクリプトは、Goツールチェインを構成する様々なサブディレクトリに移動し、それぞれのMakefileを実行することで、各ツールのビルドやクリーンアップを行っていました。gobuildがこのリストに追加されたということは、gobuild自体がGoツールチェインの重要なコンポーネントとして認識され、他のコンパイラやリンカと同様に、ビルドシステムによって管理されるべき対象となったことを意味します。

具体的には、make.bashが実行されると、gobuildのディレクトリに移動し、そのMakefileが実行されてgobuildがビルドされます。同様に、clean.bashが実行されると、gobuildのディレクトリに移動し、make cleanが実行されてgobuildに関連するビルド成果物が削除されます。

この変更は、Goのビルドプロセスがよりモジュール化され、新しいツールが既存のビルドインフラストラクチャに容易に統合できるようになったことを示唆しています。また、gobuildの導入は、将来的にgo buildコマンドがGo開発の主要なインターフェースとなるための基盤を築いたと言えます。

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

diff --git a/src/cmd/clean.bash b/src/cmd/clean.bash
index 41f4917d9e..0c0cc7fcf5 100644
--- a/src/cmd/clean.bash
+++ b/src/cmd/clean.bash
@@ -3,7 +3,7 @@
 # Use of this source code is governed by a BSD-style
 # license that can be found in the LICENSE file.

-for i in 6l 6a 6c 6g gc cc ar db nm blyacc acid cov prof
+for i in cc 6l 6a 6c gc 6g ar db nm blyacc acid cov gobuild prof
 do
 	cd $i
 	make clean
diff --git a/src/cmd/make.bash b/src/cmd/make.bash
index 980659ff72..280ae34c12 100644
--- a/src/cmd/make.bash
+++ b/src/cmd/make.bash
@@ -12,7 +12,7 @@ bash mkenam
 make enam.o
 cd ..

-for i in cc 6l 6a 6c gc 6g ar db nm blyacc acid cov prof
+for i in cc 6l 6a 6c gc 6g ar db nm blyacc acid cov gobuild prof
 do
 	echo; echo; echo %%%% making $i %%%%; echo
 	cd $i

コアとなるコードの解説

このコミットでは、src/cmd/clean.bashsrc/cmd/make.bash の2つのシェルスクリプトにおいて、forループで処理されるツールのリストに gobuild が追加されています。

src/cmd/clean.bash の変更

元のコード:

for i in 6l 6a 6c 6g gc cc ar db nm blyacc acid cov prof

変更後のコード:

for i in cc 6l 6a 6c gc 6g ar db nm blyacc acid cov gobuild prof

この変更により、clean.bashスクリプトが実行される際、ループ内で各ツールディレクトリに移動しmake cleanを実行する対象にgobuildが追加されました。これは、gobuildがビルドプロセスによって生成される成果物を持つようになり、それらをクリーンアップする必要が生じたことを意味します。

src/cmd/make.bash の変更

元のコード:

for i in cc 6l 6a 6c gc 6g ar db nm blyacc acid cov prof

変更後のコード:

for i in cc 6l 6a 6c gc 6g ar db nm blyacc acid cov gobuild prof

同様に、make.bashスクリプトが実行される際、ループ内で各ツールディレクトリに移動しビルドを行う対象にgobuildが追加されました。これにより、Goツールチェイン全体のビルドプロセスの一部としてgobuildが自動的にビルドされるようになりました。

両方の変更において、gobuildは既存のツールのリストの途中に挿入されています。これは、gobuildが他のツールと同等に、Goのビルドシステムにおける重要なコンポーネントとして扱われるようになったことを明確に示しています。

関連リンク

参考にした情報源リンク

  • linuxcommandlibrary.com: Go言語のgo buildコマンドに関する情報
  • wikipedia.org: Go言語の歴史と開発に関する情報
  • go.dev: Go言語の公式ドキュメント、設計哲学に関する情報
  • cheney.net: Goの初期のビルドプロセスとPlan 9ツールチェインに関する情報
  • leapcell.io: go buildのクロスコンパイル機能に関する情報