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

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

このコミットは、Go言語の標準ライブラリの一部である http パッケージのビルドプロセスにおける修正です。具体的には、src/lib/http/Makefile ファイルが更新され、ビルドが正しく行われるようにオブジェクトファイルのグループ化とアーカイブ方法が調整されました。これは、以前の変更でビルドが壊れた際に「見落とされたファイル」を適切に含めるための修正であると説明されています。

コミット

commit c55d310cd20d1289894de0432a0e83fa2c0eae1a
Author: Russ Cox <rsc@golang.org>
Date:   Tue Feb 3 15:58:13 2009 -0800

    fix build.  missed this file
    
    TBR=r
    OCL=24269
    CL=24269

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

https://github.com/golang/go/commit/c55d310cd20d1289894de0432a0e83fa2c0eae1a

元コミット内容

fix build. missed this file

このコミットメッセージは非常に簡潔で、「ビルドを修正した。このファイルを見落としていた」と述べています。これは、以前の変更(おそらく別のコミット)によってビルドが失敗するようになり、その原因が特定のファイル(この場合は status.o)がビルドプロセスに適切に含まれていなかったことにあることを示唆しています。TBR=rOCL=24269CL=24269 は、Goプロジェクト内部のコードレビューおよびチェンジリスト管理システムに関連するメタデータです。

変更の背景

この変更の背景には、Go言語の初期開発段階におけるビルドシステムの進化と、それに伴う依存関係の管理の課題があります。コミットメッセージが示すように、以前のコード変更(おそらく http パッケージ内のファイル構成の変更や、新しいファイルの追加)が Makefile に適切に反映されていなかったため、ビルドが失敗する状態になっていました。

具体的には、status.go(またはそれに相当するソースファイル)から生成されるオブジェクトファイル status.o が、http ライブラリのビルドプロセスから漏れていた可能性が高いです。このコミットは、その見落としを修正し、http パッケージが正しくコンパイルされ、静的ライブラリ http.a としてアーカイブされるようにするためのものです。また、同時にビルドプロセスの整理も行われているようです。

前提知識の解説

Makefileとビルドシステム

Makefile は、プログラムのコンパイルやリンクなどのビルドプロセスを自動化するためのスクリプトファイルです。make コマンドによって解釈・実行されます。Makefile は通常、ターゲット(生成したいファイルや実行したいアクション)、依存関係(ターゲットを生成するために必要なファイル)、コマンド(依存関係が満たされたときに実行されるシェルコマンド)で構成されます。

  • ターゲット: 例: http.a, a1, clean
  • 依存関係: 例: $(O1) (オブジェクトファイルのリスト)
  • コマンド: 例: $(AR) grc http.a url.$O

オブジェクトファイル (.o) と静的ライブラリ (.a)

  • オブジェクトファイル (.o): CやGoなどのコンパイル型言語のソースコードがコンパイラによってコンパイルされた中間生成物です。まだ実行可能な形式ではなく、他のオブジェクトファイルやライブラリとリンクされることで最終的な実行ファイルやライブラリになります。
  • 静的ライブラリ (.a): 複数のオブジェクトファイルを一つにまとめたアーカイブファイルです。プログラムがビルドされる際に、このライブラリ内の必要なオブジェクトコードが直接実行ファイルに組み込まれます。AR (archiver) コマンドは、このような静的ライブラリを作成・管理するために使用されます。

AR コマンド

AR は、アーカイブファイル(通常は .a 拡張子を持つ静的ライブラリ)を作成、変更、および内容を抽出するためのUnix系システムコマンドです。

  • grc: AR コマンドのオプションです。
    • g: シンボルテーブルを生成します。
    • r: アーカイブにメンバーを挿入(または置換)します。
    • c: 新しいアーカイブを作成します(アーカイブが存在しない場合)。

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

Go言語は現在、go build コマンドを中心とした独自のビルドシステムを持っていますが、初期のGoプロジェクトでは、C言語のツールチェイン(gcc, ar, make など)を多用していました。これは、Go言語自体がまだ成熟しておらず、既存の堅牢なビルドインフラを利用することが効率的だったためです。このコミットに見られる Makefile の使用は、当時のGoプロジェクトのビルドプロセスが、伝統的なUnix/Cのビルド慣習に強く影響を受けていたことを示しています。

技術的詳細

このコミットは、src/lib/http/Makefile の変更を通じて、http.a 静的ライブラリのビルド方法を修正・整理しています。

変更のポイントは以下の通りです。

  1. オブジェクトファイルの再配置:
    • status.$O (status.o) が O3 変数から削除され、O1 変数に追加されました。これは、status.ourl.o と共に a1 ターゲットでアーカイブされるように変更されたことを意味します。
    • conn.$O (conn.o) が O3 変数から完全に削除されました。これにより、conn.ohttp.a ライブラリのビルドプロセスから除外されることになります。これは、conn.gohttp パッケージの外部に移動したか、もはや http.a の一部として必要なくなったことを示唆しています。
  2. ビルドターゲットの簡素化:
    • O4 変数と a4 ターゲットが完全に削除されました。これにより、http.a をビルドするための個別のアーカイブステップが4つ (a1, a2, a3, a4) から3つ (a1, a2, a3) に削減されました。
  3. http.a の依存関係の更新:
    • http.a ターゲットの依存関係が a1 a2 a3 a4 から a1 a2 a3 に変更されました。これは、a4 ターゲットが不要になったことと整合しています。
  4. AR コマンドの調整:
    • a1 ターゲットの AR コマンドが $(AR) grc http.a url.$O から $(AR) grc http.a url.$O status.$O に変更され、status.o が正しくアーカイブされるようになりました。
    • a3 ターゲットの AR コマンドは、conn.$O の削除に伴い、$(AR) grc http.a conn.$O が削除され、$(AR) grc http.a server.$O のみが残りました。これは、a3server.o のみを処理するように変更されたことを意味します。
  5. 依存関係の連鎖の更新:
    • $(O4): a3 という行が削除されました。これは O4a4 ターゲットの削除に伴うものです。

これらの変更は、http パッケージのビルドプロセスをより正確かつ効率的にするためのものであり、特に status.o が正しく含まれるようにし、不要になった conn.o の処理や a4 ステップを削除することで、ビルドの整合性を保っています。

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

--- a/src/lib/http/Makefile
+++ b/src/lib/http/Makefile
@@ -33,20 +33,18 @@ coverage: packages
 
 O1=\
 	url.$O\
+	status.$O\
 
 O2=\
 	request.$O\
 
 O3=\
-\tconn.$O\\\
-\
-O4=\\\
 	server.$O\
 
-http.a: a1 a2 a3 a4
+http.a: a1 a2 a3
 
 a1:	$(O1)\
-\t$(AR) grc http.a url.$O
+\t$(AR) grc http.a url.$O status.$O
 	rm -f $(O1)\
 
 a2:	$(O2)\
@@ -54,12 +52,8 @@ a2:	$(O2)\
 	rm -f $(O2)\
 
 a3:	$(O3)\
-\t$(AR) grc http.a conn.$O
-\trm -f $(O3)\
-\n-a4:\t$(O4)\
 \t$(AR) grc http.a server.$O
-\trm -f $(O4)\
+\trm -f $(O3)\
 
 newpkg: clean
 	$(AR) grc http.a
@@ -67,7 +61,6 @@ newpkg: clean
 $(O1): newpkg
 $(O2): a1
 $(O3): a2
-$(O4): a3
 
 nuke: clean
 	rm -f $(GOROOT)/pkg/http.a

コアとなるコードの解説

この Makefile の変更は、http パッケージの静的ライブラリ http.a を構築する際のオブジェクトファイルの構成と、それらをアーカイブする手順を再定義しています。

  1. O1 変数への status.$O の追加:

    • 変更前: O1 には url.$O のみが含まれていました。
    • 変更後: O1status.$O が追加されました。
    • これにより、url.ostatus.o が最初のアーカイブステップ (a1) でまとめて http.a に追加されるようになりました。これは、status.o が以前のビルドで「見落とされていた」というコミットメッセージの意図と一致します。
  2. O3 変数からの conn.$O の削除:

    • 変更前: O3 には conn.$Oserver.$O が含まれていました。
    • 変更後: O3 から conn.$O が削除され、server.$O のみが残りました。
    • これは、conn.ohttp.a ライブラリの一部として不要になったか、別の方法で処理されるようになったことを意味します。これにより、ビルドプロセスがよりクリーンになります。
  3. O4 変数と a4 ターゲットの削除:

    • O4 変数と、それに対応する a4 ビルドターゲットが完全に削除されました。
    • これは、http.a のビルドに必要なオブジェクトファイルのグループが減り、ビルドプロセスが簡素化されたことを示します。以前は4つの独立したアーカイブステップがあったものが、3つに集約されました。
  4. http.a ターゲットの依存関係の更新:

    • http.a: a1 a2 a3 a4 から http.a: a1 a2 a3 へと変更されました。
    • これは、a4 ターゲットが削除されたことに伴う自然な変更であり、最終的なライブラリのビルドに必要な中間ステップが減ったことを反映しています。
  5. a1 および a3 ターゲットの AR コマンドの調整:

    • a1 ターゲットでは、url.$O に加えて status.$O もアーカイブするようコマンドが更新されました。
    • a3 ターゲットでは、conn.$O のアーカイブに関する行が削除され、server.$O のみが処理されるようになりました。
    • これらの変更は、O1O3 変数の内容の変更に直接対応しており、各ステップで正しいオブジェクトファイルが http.a に追加されることを保証します。

全体として、このコミットは http パッケージのビルドプロセスを修正し、同時に最適化と整理を行っています。status.o の見落としを修正しつつ、不要になったビルドステップやオブジェクトファイルの処理を削除することで、より堅牢で効率的なビルドを実現しています。

関連リンク

参考にした情報源リンク

  • GNU Make マニュアル: https://www.gnu.org/software/make/manual/
  • ar コマンドのマニュアルページ (例: man ar で参照可能)
  • Go言語の歴史に関する情報 (一般的なGoのドキュメントやブログ記事など)