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

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

このコミットは、Go言語のビルドスクリプトにおける修正です。具体的には、src/buildscript_*.sh ファイル群から、asm_amd64.h ヘッダーファイルを runtime/_obj/ ディレクトリにコピーする処理を削除しています。これは、ビルドプロセスの改善または変更に伴う不要なステップの削除と考えられます。

コミット

commit fcd877ea8abd737c0b9dcfa36e27589ae62cffb9
Author: Robert Griesemer <gri@golang.org>
Date:   Thu Dec 22 15:52:33 2011 -0800

    fix build: correct build scripts
    
    R=r
    CC=golang-dev
    https://golang.org/cl/5498075

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

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

元コミット内容

fix build: correct build scripts

R=r
CC=golang-dev
https://golang.org/cl/5498075

変更の背景

このコミットは、Go言語のビルドシステムにおける修正の一環として行われました。Go言語の初期のビルドプロセスは、現在とは異なり、シェルスクリプトが重要な役割を担っていました。これらのスクリプトは、コンパイラ(6gなど)の実行、オブジェクトファイルの配置、必要なヘッダーファイルのコピーなど、ビルドの各ステップを調整していました。

asm_amd64.h ファイルを runtime/_obj/ ディレクトリにコピーする処理が削除された背景には、以下のいずれかの理由が考えられます。

  1. ビルドシステムの変更: Goのビルドシステム自体が進化し、asm_amd64.h の取り扱い方法が変わったため、手動でのコピーが不要になった。例えば、コンパイラやリンカが自動的にこのファイルを適切な場所から参照するようになった、あるいは、このファイルの内容が他の生成ファイルに統合された、などが考えられます。
  2. 冗長性の排除: 以前は必要だったが、特定のビルド構成や環境において、このコピー操作が冗長になったため。
  3. バグ修正: このコピー操作が特定の環境でビルドエラーを引き起こしていた、または不正確なファイルがコピーされていたため、その問題を修正するために削除された。

コミットメッセージの「fix build: correct build scripts」という記述から、ビルドプロセスにおける何らかの不具合や非効率性を修正する目的があったことが示唆されます。

前提知識の解説

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

  • Go言語のビルドプロセス: Go言語のソースコードは、go build コマンドによってコンパイルされ、実行可能なバイナリが生成されます。初期のGoでは、このプロセスはより低レベルなツール(6g, 6lなど)とシェルスクリプトによって制御されていました。
  • GOROOT: Goのインストールディレクトリのルートパスを示す環境変数です。Goの標準ライブラリやツールチェーンのソースコードがここに配置されます。
  • GOOSGOARCH: Goのクロスコンパイルを制御するための環境変数です。
    • GOOS (Go Operating System): ターゲットとなるオペレーティングシステム(例: linux, darwin, windows, freebsdなど)。
    • GOARCH (Go Architecture): ターゲットとなるCPUアーキテクチャ(例: amd64, arm, 386など)。
    • これらの変数は、ビルドスクリプト内で特定のOSやアーキテクチャに特化した処理を行うために利用されます。
  • 6g コンパイラ: Go言語の初期のコンパイラの一つで、amd64 アーキテクチャ向けのGoソースコードをコンパイルするために使用されました。現在の go tool compile に相当します。
  • runtime パッケージ: Go言語のランタイムシステムを実装しているパッケージです。ガベージコレクション、スケジューラ、システムコールインターフェースなど、Goプログラムの実行に必要な低レベルな機能を提供します。
  • ヘッダーファイル (.h): C言語やアセンブリ言語のコードで利用される定義(構造体、関数プロトタイプ、マクロなど)を含むファイルです。GoのランタイムはCやアセンブリで書かれた部分も含むため、これらのヘッダーファイルが必要になります。
  • asm_amd64.h: amd64 アーキテクチャ向けのアセンブリコードに関連する定義が含まれるヘッダーファイルです。Goのランタイムには、パフォーマンスが要求される部分やOSとのインターフェース部分でアセンブリコードが使用されており、そのアセンブリコードがこのヘッダーファイル内の定義を参照することがあります。

技術的詳細

このコミットでは、src/buildscript_*.sh というパターンに一致する複数のシェルスクリプトファイルから、以下の行が削除されています。

-cp "$GOROOT"/src/pkg/runtime/asm_amd64.h "$WORK"/runtime/_obj/asm_GOARCH.h

この行は、$GOROOT/src/pkg/runtime/asm_amd64.h にある asm_amd64.h ファイルを、ビルド作業ディレクトリ内の runtime/_obj/ ディレクトリに asm_GOARCH.h という名前でコピーする役割を担っていました。ここで $WORK はビルドのための一時ディレクトリ、_obj はオブジェクトファイルが配置されるサブディレクトリです。GOARCHamd64 に置き換えられます。

この変更が複数の buildscript_*.sh ファイル(darwin_amd64.sh, freebsd_amd64.sh, linux_amd64.sh, netbsd_amd64.sh, openbsd_amd64.sh, windows_amd64.sh)にわたって行われていることから、このコピー操作が特定のOSに依存するものではなく、amd64 アーキテクチャ全般のビルドプロセスに影響を与えていたことがわかります。

asm_amd64.h は、Goランタイムの amd64 向けアセンブリコードが利用するマクロ定義や構造体オフセットなどが含まれる重要なファイルです。このファイルのコピーが不要になったということは、Goのビルドツールチェーン(コンパイラやリンカ)が、このヘッダーファイルを自動的に適切な場所から探し出すようになったか、あるいは、このヘッダーファイルの内容がビルド時に動的に生成されるようになった、または他のヘッダーファイルに統合された可能性が高いです。

Goのビルドシステムは、時間の経過とともに進化し、より堅牢で自動化されたものになっています。初期のシェルスクリプトベースのビルドは、手動でのファイルコピーやパス設定が多く含まれていましたが、Goのツールチェーンが成熟するにつれて、これらの手動ステップは内部的に処理されるようになりました。このコミットは、そのようなビルドシステムの改善の一例と見ることができます。

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

以下は、src/buildscript_darwin_amd64.sh における変更の抜粋です。他のファイルでも同様の変更が行われています。

diff --git a/src/buildscript_darwin_amd64.sh b/src/buildscript_darwin_amd64.sh
index 7cb7e421d7..ee4d868f26 100755
--- a/src/buildscript_darwin_amd64.sh
+++ b/src/buildscript_darwin_amd64.sh
@@ -19,7 +19,6 @@ 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

コアとなるコードの解説

削除された行 cp "$GOROOT"/src/pkg/runtime/asm_amd64.h "$WORK"/runtime/_obj/asm_GOARCH.h は、Goのビルドプロセスにおいて、runtime パッケージのアセンブリコードが依存するヘッダーファイルを、コンパイル時に参照可能な一時ディレクトリに配置するためのものでした。

この行が削除されたということは、以下のいずれかの理由が考えられます。

  1. ビルドツールの改善: 6g コンパイラや 6l リンカ、あるいはそれらを統合する上位のビルドツールが、asm_amd64.h を自動的に適切な場所から探し出すようになった。これにより、明示的な cp コマンドによるコピーが不要になった。これは、ビルドシステムの自動化と堅牢化の一環です。
  2. ファイル配置の変更: asm_amd64.h の内容が、ビルド時に生成される他のファイルに統合されたか、あるいは、runtime パッケージのビルドプロセスにおいて、このヘッダーファイルが別の方法で処理されるようになった。例えば、Goのツールチェーンが内部的にこのファイルを処理し、必要な情報を直接オブジェクトファイルに埋め込むようになった、などが考えられます。
  3. 依存関係の解消: runtime パッケージのアセンブリコードが、もはや asm_amd64.h に直接依存しなくなった。これは、コードのリファクタリングや、より汎用的なヘッダーファイルへの移行によって実現された可能性があります。

いずれにしても、この変更はGoのビルドプロセスがより洗練され、手動でのファイル管理が減り、ツールチェーンがより多くの責任を負うようになったことを示しています。これにより、ビルドスクリプトの複雑性が軽減され、メンテナンス性が向上します。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント (一般的なGoのビルドプロセスとツールに関する知識)
  • Go言語のソースコード (特に src/build ディレクトリや src/pkg/runtime ディレクトリの構造)
  • Go言語の初期のビルドシステムに関する議論やメーリングリストのアーカイブ (必要に応じて golang-dev メーリングリストなどを検索)
  • Goのコミット履歴 (類似のビルド関連のコミットから背景を推測)
  • Goの asm_amd64.h の役割に関する一般的な情報 (Goのアセンブリコードとランタイムに関する知識)
  • Go CL 5498075: https://golang.org/cl/5498075 (このコミットのCode Reviewリンク)