[インデックス 1216] ファイルの概要
このコミットは、Go言語の初期開発段階におけるビルドシステム(Makefile)の修正に関するものです。tabwriterパッケージが追加されたにもかかわらず、ビルドシステムがその変更を反映していなかった問題を修正しています。
コミット
commit c4bba4b1fd830f60409d194bc1b111e43c4c4d33
Author: Russ Cox <rsc@golang.org>
Date: Fri Nov 21 13:05:09 2008 -0800
fix build - missed update that added tabwriter
TBR=r
OCL=19804
CL=19804
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/c4bba4b1fd830f60409d194bc1b111e43c4c4d33
元コミット内容
fix build - missed update that added tabwriter
TBR=r
OCL=19804
CL=19804
変更の背景
このコミットは、Go言語のビルドプロセスにおける不整合を修正するために行われました。具体的には、tabwriterという新しいパッケージがGoの標準ライブラリに追加されたにもかかわらず、その変更がビルドシステム(当時のMakefile)に適切に反映されていなかったことが原因です。
Go言語は2009年11月に一般公開されましたが、このコミットの日付は2008年11月21日であり、GoがまだGoogle社内で開発されていた非常に初期の段階であることがわかります。この時期のGoのビルドシステムは、現在のようなgo buildコマンドが確立される前であり、Makefileが主要なビルドツールとして使用されていました。
tabwriterパッケージの追加は、おそらく別のコミットで行われましたが、そのパッケージをビルドしてインストールするためのMakefileの更新が漏れていたため、ビルドエラーが発生していたと考えられます。このコミットは、そのビルドエラーを解消し、tabwriterパッケージがGoのビルドプロセスに正しく組み込まれるようにするためのものです。
コミットメッセージにあるOCL=19804やCL=19804は、Google社内で使用されていたPerforceのチェンジリスト番号を指します。これは、GoがGitに移行する前の内部的なバージョン管理システムの名残です。
前提知識の解説
Makefile
Makefileは、プログラムのコンパイルやその他のタスクを自動化するためのユーティリティであるmakeコマンドが使用する設定ファイルです。makeは、ファイルの依存関係を定義し、それらの依存関係が変更された場合にのみ特定のコマンドを実行することで、効率的なビルドプロセスを実現します。
Go言語の初期段階では、現在のgo buildコマンドのような統合されたビルドツールが存在しなかったため、MakefileがGoのソースコードをコンパイルし、ライブラリをインストールするための主要な手段として利用されていました。Makefileには、ビルド対象のディレクトリやファイル、それらの依存関係、そしてビルドを実行するためのコマンドが記述されます。
このコミットにおけるMakefileの役割は、Goの標準ライブラリの一部としてtabwriterパッケージを認識させ、そのビルドとインストールを自動化することにありました。
text/tabwriterパッケージ
text/tabwriterパッケージは、Go言語の標準ライブラリの一部であり、テキストを整形して列を揃えるための機能を提供します。特に、コマンドラインアプリケーションなどで表形式のデータを表示する際に非常に有用です。
このパッケージは、Elastic Tabstopsアルゴリズムを使用して、タブ区切りのテキストを自動的に整列させます。tabwriter.Writerは、書き込みフィルターとして機能し、入力されたテキストをバッファリングし、Flush()メソッドが呼び出されたときに整形された出力を生成します。
tabwriterパッケージの主な特徴は以下の通りです。
- 列の自動調整: タブ (
\t) で区切られた列の幅を自動的に調整し、きれいに揃えます。 - 柔軟な設定: 最小列幅、タブ幅、列間のパディング文字などを設定できます。
- バッファリング: 効率的な処理のために内部的にデータをバッファリングします。最終的な出力を得るためには
Flush()を呼び出す必要があります。
このパッケージがGoの標準ライブラリに追加されたことは、Goがコマンドラインツールやユーティリティの作成に適した言語として設計されていたことを示唆しています。
技術的詳細
このコミットの技術的な詳細は、src/lib/Makefileファイルへの変更に集約されています。
-
DIRS変数の更新:DIRS変数は、Goの標準ライブラリに含まれるディレクトリ(パッケージ)のリストを定義しています。このリストにtabwriterが追加されたことで、ビルドシステムがtabwriterをGoの標準ライブラリの一部として認識し、そのディレクトリ内のソースコードをビルド対象に含めるようになります。--- a/src/lib/Makefile +++ b/src/lib/Makefile @@ -16,6 +16,7 @@ DIRS=\ reflect\ regexp\ strconv\ +\ttabwriter\ time\ -
tabwriter.dirinstallルールの追加:Makefileでは、各パッケージのインストール(ビルドと配置)を制御するためのルールが定義されています。tabwriter.dirinstallという新しいルールが追加され、tabwriterパッケージをインストールするために必要な依存関係が指定されています。--- a/src/lib/Makefile +++ b/src/lib/Makefile @@ -75,10 +76,11 @@ io.6: os.dirinstall syscall.dirinstall testing.6: flag.install fmt.dirinstall fmt.dirinstall: io.install reflect.dirinstall strconv.dirinstall -http.dirinstall: bufio.install io.install net.dirinstall os.dirinstall strings.install +http.dirinstall: bufio.install io.install net.dirinstall os.dirinstall strings.install net.dirinstall: once.install os.dirinstall strconv.dirinstall os.dirinstall: syscall.dirinstall regexp.dirinstall: os.dirinstall reflect.dirinstall: strconv.dirinstall strconv.dirinstall: os.dirinstall +tabwriter.dirinstall: os.dirinstall io.install container/array.dirinstall time.dirinstall: once.install os.dirinstallこのルールは、
tabwriterパッケージをビルドしてインストールする前に、os、io、そしてcontainer/arrayパッケージが既にインストールされている必要があることを示しています。これは、tabwriterパッケージがこれらのパッケージに依存しているためです。 -
コメントの変更:
# dependencies - should auto-generateというコメントが# TODO: dependencies - should auto-generateに変更されています。これは、当時のビルドシステムが依存関係を自動生成する機能を持っていなかったこと、そして将来的にその機能を追加する計画があったことを示唆しています。この変更自体は機能的なものではなく、開発者のメモとしての意味合いが強いです。
これらの変更により、Goのビルドシステムはtabwriterパッケージを正しく認識し、その依存関係を解決してビルドプロセスに含めることができるようになりました。
コアとなるコードの変更箇所
変更はsrc/lib/Makefileファイルにのみ行われています。
diff --git a/src/lib/Makefile b/src/lib/Makefile
index 114b27a092..9ee1b51305 100644
--- a/src/lib/Makefile
+++ b/src/lib/Makefile
@@ -16,6 +16,7 @@ DIRS=\
reflect\
regexp\
strconv\
+\ttabwriter\
time\
FILES=\
@@ -66,7 +67,7 @@ install: install.dirs install.files
nuke: nuke.dirs clean.files
rm -f $(GOROOT)/pkg/*
-# dependencies - should auto-generate
+# TODO: dependencies - should auto-generate
bignum.6: fmt.dirinstall
bufio.6: io.install os.dirinstall
@@ -75,10 +76,11 @@ io.6: os.dirinstall syscall.dirinstall
testing.6: flag.install fmt.dirinstall
fmt.dirinstall: io.install reflect.dirinstall strconv.dirinstall
-http.dirinstall: bufio.install io.install net.dirinstall os.dirinstall strings.install
+http.dirinstall: bufio.install io.install net.dirinstall os.dirinstall strings.install
net.dirinstall: once.install os.dirinstall strconv.dirinstall
os.dirinstall: syscall.dirinstall
regexp.dirinstall: os.dirinstall
reflect.dirinstall: strconv.dirinstall
strconv.dirinstall: os.dirinstall
+tabwriter.dirinstall: os.dirinstall io.install container/array.dirinstall
time.dirinstall: once.install os.dirinstall
コアとなるコードの解説
DIRS変数へのtabwriterの追加
@@ -16,6 +16,7 @@ DIRS=\
reflect\
regexp\
strconv\
+\ttabwriter\
time\
この変更は、MakefileがGoの標準ライブラリとして認識するディレクトリのリストにtabwriterを追加しています。これにより、makeコマンドがビルドを実行する際に、tabwriterディレクトリ内のGoソースファイルもコンパイル対象として扱われるようになります。これは、新しいパッケージがGoのビルドシステムに統合されるための最初のステップです。
tabwriter.dirinstallルールの追加
@@ -75,10 +76,11 @@ io.6: os.dirinstall syscall.dirinstall
testing.6: flag.install fmt.dirinstall
fmt.dirinstall: io.install reflect.dirinstall strconv.dirinstall
-http.dirinstall: bufio.install io.install net.dirinstall os.dirinstall strings.install
+http.dirinstall: bufio.install io.install net.dirinstall os.dirinstall strings.install
net.dirinstall: once.install os.dirinstall strconv.dirinstall
os.dirinstall: syscall.dirinstall
regexp.dirinstall: os.dirinstall
reflect.dirinstall: strconv.dirinstall
strconv.dirinstall: os.dirinstall
+tabwriter.dirinstall: os.dirinstall io.install container/array.dirinstall
time.dirinstall: once.install os.dirinstall
この行は、tabwriterパッケージをインストールするためのMakefileルールを定義しています。
tabwriter.dirinstall: これはターゲット名であり、tabwriterパッケージのインストールプロセスを表します。os.dirinstall io.install container/array.dirinstall: これらはtabwriter.dirinstallの依存関係です。makeは、tabwriterをビルドする前に、os、io、そしてcontainer/arrayパッケージが既にビルドされ、インストールされていることを確認します。これは、tabwriterパッケージがこれらの基本的なI/O操作やデータ構造のパッケージに依存しているためです。この依存関係が正しく定義されることで、ビルドの順序が保証され、必要なライブラリが利用可能になった状態でtabwriterがビルドされるようになります。
コメントの変更
@@ -66,7 +67,7 @@ install: install.dirs install.files
nuke: nuke.dirs clean.files
rm -f $(GOROOT)/pkg/*
-# dependencies - should auto-generate
+# TODO: dependencies - should auto-generate
この変更は、単なるコメントの更新です。# dependencies - should auto-generateという既存のコメントにTODO:が追加されています。これは、当時のGoのビルドシステムがパッケージ間の依存関係を自動的に解決・生成する機能を持っておらず、手動でMakefileに記述する必要があったことを示しています。TODO:の追加は、将来的にこの手動での依存関係管理を自動化する計画があったことを示唆しています。
関連リンク
- Go言語の公式ドキュメント: https://go.dev/
text/tabwriterパッケージのドキュメント: https://pkg.go.dev/text/tabwriter
参考にした情報源リンク
- Go言語の
text/tabwriterパッケージに関するWeb検索結果 - Go言語のビルドシステムと
Makefileに関するWeb検索結果 - Go言語の歴史と初期開発に関する情報