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

[インデックス 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=19804CL=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ファイルへの変更に集約されています。

  1. DIRS変数の更新: DIRS変数は、Goの標準ライブラリに含まれるディレクトリ(パッケージ)のリストを定義しています。このリストにtabwriterが追加されたことで、ビルドシステムがtabwriterをGoの標準ライブラリの一部として認識し、そのディレクトリ内のソースコードをビルド対象に含めるようになります。

    --- a/src/lib/Makefile
    +++ b/src/lib/Makefile
    @@ -16,6 +16,7 @@ DIRS=\
     	reflect\
     	regexp\
     	strconv\
    +\ttabwriter\
     	time\
    
  2. 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パッケージをビルドしてインストールする前に、osio、そしてcontainer/arrayパッケージが既にインストールされている必要があることを示しています。これは、tabwriterパッケージがこれらのパッケージに依存しているためです。

  3. コメントの変更: # 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をビルドする前に、osio、そして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言語のtext/tabwriterパッケージに関するWeb検索結果
  • Go言語のビルドシステムとMakefileに関するWeb検索結果
  • Go言語の歴史と初期開発に関する情報