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

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

このコミットは、Go言語の初期開発段階におけるビルドシステム関連の修正です。具体的には、src/lib/Makefilecontainer ディレクトリを DIRS 変数に追加することで、ビルドプロセスに container パッケージが正しく含まれるようにする変更です。

コミット

commit 070738c30c8295e61572530b7affb13daf4153d1
Author: Robert Griesemer <gri@golang.org>
Date:   Fri Feb 13 15:10:35 2009 -0800

    - added Makefile change again (lost due to to p4 misuse)
    
    R=rsc
    OCL=25026
    CL=25026

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

https://github.com/golang/go/commit/070738c30c8295e61572530b7affb13daf4153d1

元コミット内容

このコミットの元々の内容は、src/lib/Makefilecontainer ディレクトリを追加することです。コミットメッセージにある「added Makefile change again (lost due to to p4 misuse)」から、この変更が以前にも行われたものの、バージョン管理システムであるPerforce (p4) の誤用により失われたため、再度追加されたものであることが示唆されています。

変更の背景

Go言語の初期開発において、ビルドシステムは現在のようなGo Modulesやgo buildコマンドが確立される前であり、Makefileが重要な役割を担っていました。src/lib/Makefileは、Goの標準ライブラリの一部をビルドするための設定を含んでいました。

このコミットの背景には、containerパッケージがGoの標準ライブラリの一部として開発されていたものの、何らかの理由(コミットメッセージでは「p4 misuse」と明記されている)で、そのビルド設定がMakefileから一時的に失われていたという状況があります。これにより、containerパッケージが正しくビルドプロセスに含まれず、利用できない状態になっていた可能性があります。

p4 misuseという記述は、当時のGo開発チームがPerforceという集中型バージョン管理システムを使用しており、その操作ミス(例えば、ファイルの同期ミス、変更の取り消しミス、ブランチマージの失敗など)によって、一度コミットされたはずの重要なビルド設定が失われたことを示しています。このコミットは、その失われた設定を復元し、ビルドの整合性を確保することを目的としています。

前提知識の解説

  • Makefile: Makefileは、makeユーティリティがプログラムのコンパイルやインストールなどのタスクを自動化するために使用するファイルです。依存関係に基づいてコマンドを実行し、プロジェクトのビルドプロセスを効率化します。Go言語の初期においては、Goプログラム自体のビルドや標準ライブラリのビルドにMakefileが広く利用されていました。
  • DIRS変数: Makefileにおいて、DIRSのような変数は、ビルド対象となるサブディレクトリのリストを定義するためによく使用されます。makeは、このリストに指定された各ディレクトリに移動し、それぞれのディレクトリ内のMakefile(またはデフォルトのビルドルール)を実行することで、プロジェクト全体を再帰的にビルドします。
  • Perforce (p4): Perforceは、特に大規模な開発チームやゲーム開発業界で広く使用されている集中型バージョン管理システム(CVCS)です。Gitのような分散型バージョン管理システム(DVCS)とは異なり、中央サーバーにすべてのリポジトリが存在し、開発者はサーバーからファイルをチェックアウトして作業します。p4 misuseという表現は、Perforceのコマンド操作やワークフローにおける誤りを示唆しており、例えば、正しいリビジョンへの同期を怠った、変更を誤ってリバートした、あるいは不適切なマージ操作を行ったなどが考えられます。
  • Go言語の初期のビルドシステム: 現在のGo言語はgo buildコマンド一つで簡単にビルドできますが、初期のGoはより伝統的なコンパイル言語と同様に、Makefileやシェルスクリプトを組み合わせてビルドプロセスを管理していました。このコミットは、その過渡期のビルドシステムの一端を示しています。

技術的詳細

このコミットの技術的な詳細は、src/lib/Makefileという特定のファイルに対する変更に集約されます。

src/lib/Makefileは、Goの標準ライブラリ(libディレクトリ以下)に含まれる各パッケージをビルドするための設定を定義していました。このファイルには、DIRSという変数が存在し、Goの標準ライブラリを構成する各サブディレクトリ(パッケージ)のリストが格納されていました。makeコマンドがこのMakefileを実行すると、DIRSに列挙された各ディレクトリに移動し、それぞれのパッケージをコンパイルするなどのビルドステップが実行されます。

コミットの差分を見ると、containerという文字列がDIRS変数に追加されています。

--- a/src/lib/Makefile
+++ b/src/lib/Makefile
@@ -8,6 +8,7 @@ GC=6g
 
 DIRS=\
 	container/array\
+	container\
 	fmt\
 	hash\
 	http\

元々container/arrayはリストに存在していましたが、これはcontainerパッケージ内のarrayサブパッケージを指します。しかし、containerパッケージ自体がトップレベルのパッケージとしてビルドされるためには、DIRSリストにcontainerそのものが含まれている必要がありました。

この変更により、makeプロセスはsrc/lib/containerディレクトリもビルド対象として認識し、そのディレクトリ内のGoソースコードがコンパイルされ、Goの標準ライブラリの一部として正しく組み込まれるようになります。これは、containerパッケージが提供するデータ構造(例えば、listheapなど、Go 1.0で導入されたもの)が、Goのビルド済みライブラリとして利用可能になるために不可欠な修正でした。

「p4 misuse」によってこの行が失われたということは、開発者がPerforceの操作中に、意図せずこの変更を元に戻してしまったり、正しい変更履歴が反映されない形でファイルを更新してしまったりしたことを意味します。このコミットは、そのエラーを修正し、ビルドの完全性を回復させるためのものです。

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

変更はsrc/lib/Makefileファイルの一箇所のみです。

--- a/src/lib/Makefile
+++ b/src/lib/Makefile
@@ -8,6 +8,7 @@ GC=6g
 
 DIRS=\
 	container/array\\\
+	container\\\
 	fmt\\\
 	hash\\\
 	http\\\

具体的には、DIRS変数にcontainer\という行が追加されています。

コアとなるコードの解説

DIRS変数は、src/libディレクトリ以下にある、ビルド対象となるサブディレクトリ(Goパッケージ)のリストを定義しています。\(バックスラッシュ)は、Makefileにおいて行の継続を示す記号であり、これによりDIRS変数の定義が複数行にわたって記述されています。

この変更によって、containerディレクトリがDIRSリストに追加されたことで、makeコマンドがsrc/lib/Makefileを処理する際に、src/lib/containerディレクトリもビルド対象として認識するようになります。これにより、containerパッケージ内のGoソースファイルがコンパイルされ、Goの標準ライブラリの一部として正しくリンクされるようになります。

この修正は、containerパッケージがGoの標準ライブラリとして機能するために不可欠なものでした。もしこの行がなければ、containerパッケージはビルドシステムによって無視され、Goプログラムからインポートして使用することができなかったでしょう。

関連リンク

参考にした情報源リンク