[インデックス 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言語の歴史と初期開発に関する情報