[インデックス 10986] ファイルの概要
このコミットでは、Go言語のビルドスクリプトが更新されています。具体的には、src/buildscript_
で始まる複数のシェルスクリプトファイルが変更されており、Goの標準ライブラリの一部であるgo/doc
パッケージとruntime
パッケージのビルドプロセスに新たなファイルが追加されています。
変更されたファイルの一覧は以下の通りです。
src/buildscript_darwin_386.sh
src/buildscript_darwin_amd64.sh
src/buildscript_freebsd_386.sh
src/buildscript_freebsd_amd64.sh
src/buildscript_linux_386.sh
src/buildscript_linux_amd64.sh
src/buildscript_linux_arm.sh
src/buildscript_netbsd_386.sh
src/buildscript_netbsd_amd64.sh
src/buildscript_openbsd_386.sh
src/buildscript_openbsd_amd64.sh
src/buildscript_plan9_386.sh
src/buildscript_windows_386.sh
src/buildscript_windows_amd64.sh
コミット
- コミットハッシュ:
dea9f417d2383c08d746e63a733063c309819826
- 作者: Robert Griesemer gri@golang.org
- 日付: Thu Dec 22 15:37:09 2011 -0800
- コミットメッセージ:
fix build: updated build scripts R=golang-dev CC=golang-dev https://golang.org/cl/5504078
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/dea9f417d2383c08d746e63a733063c309819826
元コミット内容
commit dea9f417d2383c08d746e63a733063c309819826
Author: Robert Griesemer <gri@golang.org>
Date: Thu Dec 22 15:37:09 2011 -0800
fix build: updated build scripts
R=golang-dev
CC=golang-dev
https://golang.org/cl/5504078
変更の背景
このコミットの背景には、Go言語のビルドシステムにおける特定のパッケージ(go/doc
とruntime
)のコンパイルおよびアセンブルプロセスに、新たなソースファイルやヘッダーファイルが必要になったという事情があります。コミットメッセージの「fix build: updated build scripts」という記述から、既存のビルドプロセスがこれらの新しいファイルに対応していなかったため、ビルドが失敗するか、あるいは期待通りの機能が組み込まれない状態であったことが推測されます。
具体的には、go/doc
パッケージにexports.go
とfilter.go
が追加されたことで、Goのドキュメンテーション生成ツールが、より高度なエクスポート処理やフィルタリング機能を持つようになったと考えられます。また、runtime
パッケージにasm_amd64.h
が追加されたことは、特定のアーキテクチャ(amd64)におけるランタイムのアセンブリコードに関連する変更があったことを示唆しています。これらの変更は、Go言語の機能拡張、パフォーマンス改善、または特定のプラットフォームへの対応の一環として行われた可能性が高いです。
前提知識の解説
このコミットを理解するためには、以下のGo言語のビルドシステムと関連技術に関する基本的な知識が必要です。
- Go言語のビルドプロセス: Go言語のソースコードは、
go build
コマンドによってコンパイルされ、実行可能なバイナリが生成されます。このプロセスは、コンパイラ(例:gc
、古いバージョンでは8g
/6g
/5g
など)、アセンブラ、リンカなどのツールチェーンによって行われます。 GOROOT
とGOPATH
:GOROOT
: Goのインストールディレクトリを指します。標準ライブラリのソースコードやツールチェーンがここに配置されます。GOPATH
: ユーザーのワークスペースディレクトリを指します。Goのプロジェクトのソースコード、パッケージ、バイナリがここに配置されます。このコミットの文脈では、GOROOT
内のビルドスクリプトが変更されています。
WORK
変数: ビルドスクリプト内で一時的な作業ディレクトリを示すために使われる変数です。コンパイルされたオブジェクトファイルや中間生成物がここに格納されます。g
コンパイラ (8g
,6g
,5g
): Go言語の初期のビルドシステムで使用されていたコンパイラです。8g
: 386アーキテクチャ(32ビットIntel/AMD)向けのGoコンパイラ。6g
: amd64アーキテクチャ(64ビットIntel/AMD)向けのGoコンパイラ。5g
: ARMアーキテクチャ向けのGoコンパイラ。 これらのコンパイラは、Goのソースコード(.go
ファイル)をオブジェクトファイル(.8
や.6
など)にコンパイルする役割を担います。
gopack
: Goの初期のビルドシステムで使用されていたツールで、コンパイルされたオブジェクトファイルをアーカイブ(.a
ファイル、ライブラリファイル)にまとめる役割を担います。grc
はgopack
のサブコマンドで、アーカイブの作成(r
)とコピー(c
)を行います。go/doc
パッケージ: Goの標準ライブラリの一部で、Goのソースコードからドキュメンテーションを抽出・生成するための機能を提供します。go doc
コマンドやgodoc
ツールなどで利用されます。runtime
パッケージ: Goのランタイムシステムを実装するパッケージです。ガベージコレクション、スケジューラ、プリミティブな型、システムコールなど、Goプログラムの実行に必要な低レベルな機能を提供します。アセンブリコードやC言語で書かれた部分も含まれます。- シェルスクリプト (
.sh
ファイル): このコミットで変更されているのは、Goのビルドプロセスを自動化するためのシェルスクリプトです。これらは、特定のOSとアーキテクチャの組み合わせ(例:darwin_amd64
はmacOS上の64ビットIntel/AMD)に対応しています。
技術的詳細
このコミットの技術的な詳細は、Goのビルドスクリプトがどのように更新され、新しいファイルがビルドプロセスに組み込まれたかという点に集約されます。
-
go/doc
パッケージのビルド更新:- すべての
buildscript_*.sh
ファイルにおいて、go/doc
パッケージをコンパイルするコマンド(8g
、6g
、5g
を使用)が変更されています。 - 変更前は、
./comment.go ./doc.go ./example.go
の3つのファイルがコンパイル対象でした。 - 変更後は、これに加えて
./exports.go ./filter.go
の2つのファイルが追加されています。 - これは、
go/doc
パッケージが、Goのコードからエクスポートされたシンボル(関数、変数、型など)を処理する機能(exports.go
)や、ドキュメンテーションの表示内容をフィルタリングする機能(filter.go
)を新たに獲得したことを意味します。これらの機能が追加されたことで、go doc
コマンドやgodoc
ツールがより強力になったと考えられます。
- すべての
-
runtime
パッケージのヘッダーファイル追加 (amd64アーキテクチャのみ):buildscript_darwin_amd64.sh
,buildscript_freebsd_amd64.sh
,buildscript_linux_amd64.sh
,buildscript_netbsd_amd64.sh
,buildscript_openbsd_amd64.sh
,buildscript_windows_amd64.sh
の各ファイルにおいて、runtime
パッケージのビルドセクションに以下の行が追加されています。cp "$GOROOT"/src/pkg/runtime/asm_amd64.h "$WORK"/runtime/_obj/asm_GOARCH.h
- この変更は、
src/pkg/runtime/asm_amd64.h
というヘッダーファイルが、ビルド時の一時ディレクトリ($WORK/runtime/_obj/
)にコピーされるようになったことを示しています。 asm_amd64.h
は、amd64アーキテクチャ向けのアセンブリコードに関連する定義やマクロが含まれている可能性が高いです。ランタイムはGoプログラムの低レベルな動作を制御するため、特定のアーキテクチャに特化したアセンブリコードやそれに関連するヘッダーファイルが必要となることがあります。この追加は、amd64アーキテクチャにおけるランタイムの機能拡張、最適化、またはバグ修正のために、新たなアセンブリ定義が必要になったことを示唆しています。
これらの変更は、Go言語の進化に伴い、ビルドシステムが新しいソースファイルや定義を適切に処理できるように適応していることを明確に示しています。
コアとなるコードの変更箇所
以下に、各ビルドスクリプトにおける主要な変更箇所を抜粋して示します。
go/doc
パッケージのコンパイル対象ファイル追加の例 (すべてのビルドスクリプトに共通のパターン):
--- a/src/buildscript_darwin_386.sh
+++ b/src/buildscript_darwin_386.sh
@@ -460,7 +460,7 @@ cp "$WORK"/text/template.a "$GOROOT"/pkg/darwin_386/text/template.a
mkdir -p "$WORK"/go/doc/_obj/
cd "$GOROOT"/src/pkg/go/doc
-8g -o "$WORK"/go/doc/_obj/_go_.8 -p go/doc -I "$WORK" ./comment.go ./doc.go ./example.go
+8g -o "$WORK"/go/doc/_obj/_go_.8 -p go/doc -I "$WORK" ./comment.go ./doc.go ./example.go ./exports.go ./filter.go
gopack grc "$WORK"/go/doc.a "$WORK"/go/doc/_obj/_go_.8
cp "$WORK"/go/doc.a "$GOROOT"/pkg/darwin_386/go/doc.a
runtime
パッケージのヘッダーファイルコピー追加の例 (amd64アーキテクチャのビルドスクリプトに共通のパターン):
--- a/src/buildscript_darwin_amd64.sh
+++ b/src/buildscript_darwin_amd64.sh
@@ -19,6 +19,7 @@ mkdir -p "$WORK"/runtime/_obj/
cd "$GOROOT"/src/pkg/runtime
6g -o "$WORK"/runtime/_obj/_go_.6 -p runtime -+ -I "$WORK" ./debug.go ./error.go ./extern.go ./mem.go ./sig.go ./softfloat64.go ./type.go ./zgoarch_amd64.go ./zgoos_darwin.go ./zruntime_defs_darwin_amd64.go ./zversion.go
cp "$GOROOT"/src/pkg/runtime/arch_amd64.h "$WORK"/runtime/_obj/arch_GOARCH.h
+cp "$GOROOT"/src/pkg/runtime/asm_amd64.h "$WORK"/runtime/_obj/asm_GOARCH.h
cp "$GOROOT"/src/pkg/runtime/defs_darwin_amd64.h "$WORK"/runtime/_obj/defs_GOOS_GOARCH.h
cp "$GOROOT"/src/pkg/runtime/os_darwin.h "$WORK"/runtime/_obj/os_GOOS.h
cp "$GOROOT"/src/pkg/runtime/signals_darwin.h "$WORK"/runtime/_obj/signals_GOOS.h
コアとなるコードの解説
-
go/doc
パッケージの変更:- 変更前:
8g -o ... ./comment.go ./doc.go ./example.go
- 変更後:
8g -o ... ./comment.go ./doc.go ./example.go ./exports.go ./filter.go
- この行は、Goコンパイラ(この例では
8g
)を使用して、go/doc
パッケージのソースファイルをオブジェクトファイルにコンパイルするコマンドです。-o
オプションは出力ファイル名を指定し、-p
はパッケージパス、-I
はインクルードパスを指定します。 - 変更の核心は、コンパイル対象のソースファイルリストに
exports.go
とfilter.go
が追加されたことです。これにより、これらの新しいファイルに実装された機能がgo/doc
パッケージの最終的なバイナリに組み込まれるようになります。これは、Goのドキュメンテーションツールが、より洗練された機能(例えば、エクスポートされたシンボルの詳細な解析や、ドキュメント表示のカスタマイズ)を提供できるようになったことを示唆しています。
- 変更前:
-
runtime
パッケージの変更:- 追加された行:
cp "$GOROOT"/src/pkg/runtime/asm_amd64.h "$WORK"/runtime/_obj/asm_GOARCH.h
- このコマンドは、
cp
(コピー)ユーティリティを使用して、Goのソースツリー内にあるasm_amd64.h
というヘッダーファイルを、ビルド時の一時ディレクトリにコピーしています。 asm_amd64.h
は、amd64アーキテクチャ向けのアセンブリコードに関連する定義が含まれていると推測されます。Goのランタイムは、パフォーマンスが重要な部分や、OSとのインターフェース部分でアセンブリコードを使用することがあります。このヘッダーファイルがビルドプロセスに組み込まれることで、ランタイムの特定のアセンブリルーチンが正しくコンパイル・リンクされるために必要な定義が提供されるようになります。これは、amd64アーキテクチャにおけるランタイムの機能性、安定性、またはパフォーマンスの向上に寄与する変更であると考えられます。
- 追加された行:
これらの変更は、Go言語のビルドシステムが、新しい機能やプラットフォーム固有の最適化に対応するために、継続的に更新されていることを示しています。
関連リンク
- Go Gerrit Change-ID: https://golang.org/cl/5504078
参考にした情報源リンク
- Go言語の公式ドキュメンテーション (Goのビルドプロセス、
GOROOT
、GOPATH
、パッケージ構造に関する情報) - Go言語のソースコード (特に
src/pkg/go/doc
とsrc/pkg/runtime
ディレクトリの内容) - Go言語の初期のビルドツールに関する情報 (例:
8g
,6g
,5g
,gopack
の役割) - Go言語のコミット履歴とGerritレビューシステム (変更の背景や議論を理解するため)