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

[インデックス 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/docruntime)のコンパイルおよびアセンブルプロセスに、新たなソースファイルやヘッダーファイルが必要になったという事情があります。コミットメッセージの「fix build: updated build scripts」という記述から、既存のビルドプロセスがこれらの新しいファイルに対応していなかったため、ビルドが失敗するか、あるいは期待通りの機能が組み込まれない状態であったことが推測されます。

具体的には、go/docパッケージにexports.gofilter.goが追加されたことで、Goのドキュメンテーション生成ツールが、より高度なエクスポート処理やフィルタリング機能を持つようになったと考えられます。また、runtimeパッケージにasm_amd64.hが追加されたことは、特定のアーキテクチャ(amd64)におけるランタイムのアセンブリコードに関連する変更があったことを示唆しています。これらの変更は、Go言語の機能拡張、パフォーマンス改善、または特定のプラットフォームへの対応の一環として行われた可能性が高いです。

前提知識の解説

このコミットを理解するためには、以下のGo言語のビルドシステムと関連技術に関する基本的な知識が必要です。

  • Go言語のビルドプロセス: Go言語のソースコードは、go buildコマンドによってコンパイルされ、実行可能なバイナリが生成されます。このプロセスは、コンパイラ(例: gc、古いバージョンでは8g/6g/5gなど)、アセンブラ、リンカなどのツールチェーンによって行われます。
  • GOROOTGOPATH:
    • 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ファイル、ライブラリファイル)にまとめる役割を担います。grcgopackのサブコマンドで、アーカイブの作成(r)とコピー(c)を行います。
  • go/docパッケージ: Goの標準ライブラリの一部で、Goのソースコードからドキュメンテーションを抽出・生成するための機能を提供します。go docコマンドやgodocツールなどで利用されます。
  • runtimeパッケージ: Goのランタイムシステムを実装するパッケージです。ガベージコレクション、スケジューラ、プリミティブな型、システムコールなど、Goプログラムの実行に必要な低レベルな機能を提供します。アセンブリコードやC言語で書かれた部分も含まれます。
  • シェルスクリプト (.shファイル): このコミットで変更されているのは、Goのビルドプロセスを自動化するためのシェルスクリプトです。これらは、特定のOSとアーキテクチャの組み合わせ(例: darwin_amd64はmacOS上の64ビットIntel/AMD)に対応しています。

技術的詳細

このコミットの技術的な詳細は、Goのビルドスクリプトがどのように更新され、新しいファイルがビルドプロセスに組み込まれたかという点に集約されます。

  1. go/docパッケージのビルド更新:

    • すべてのbuildscript_*.shファイルにおいて、go/docパッケージをコンパイルするコマンド(8g6g5gを使用)が変更されています。
    • 変更前は、./comment.go ./doc.go ./example.goの3つのファイルがコンパイル対象でした。
    • 変更後は、これに加えて./exports.go ./filter.goの2つのファイルが追加されています。
    • これは、go/docパッケージが、Goのコードからエクスポートされたシンボル(関数、変数、型など)を処理する機能(exports.go)や、ドキュメンテーションの表示内容をフィルタリングする機能(filter.go)を新たに獲得したことを意味します。これらの機能が追加されたことで、go docコマンドやgodocツールがより強力になったと考えられます。
  2. 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.gofilter.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言語の公式ドキュメンテーション (Goのビルドプロセス、GOROOTGOPATH、パッケージ構造に関する情報)
  • Go言語のソースコード (特にsrc/pkg/go/docsrc/pkg/runtimeディレクトリの内容)
  • Go言語の初期のビルドツールに関する情報 (例: 8g, 6g, 5g, gopackの役割)
  • Go言語のコミット履歴とGerritレビューシステム (変更の背景や議論を理解するため)