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

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

このコミットは、Go言語のWindows向けインストールスクリプト(misc/windows/package.bash)に、Goランタイムに関連するsrc/pkg/runtime/z*ファイル群を追加するものです。これにより、Windows環境でのGoのビルドおよび実行に必要なファイルが適切にパッケージに含まれるようになり、Goのインストールが完全に行われるようになります。

コミット

commit 83d540244337214922802776eaf5ea4b6f597be5
Author: Alex Brainman <alex.brainman@gmail.com>
Date:   Mon Dec 26 20:25:31 2011 +1100

    misc/windows: add src/pkg/runtime/z* files to installation script
    
    Fixes #2614.
    
    R=golang-dev, jdpoirier
    CC=golang-dev
    https://golang.org/cl/5505070

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

https://github.com/golang/go/commit/83d540244337214922802776eaf5ea4b6f597be5

元コミット内容

misc/windows: add src/pkg/runtime/z* files to installation script

Fixes #2614.

R=golang-dev, jdpoirier
CC=golang-dev
https://golang.org/cl/5505070

変更の背景

この変更の背景には、Go言語のWindows向けバイナリ配布パッケージが不完全であったという問題があります。具体的には、Goのランタイム(src/pkg/runtime)ディレクトリ内に存在するz*.cz*.goz*.hといったファイル群が、Windows用のインストールスクリプトによって適切にパッケージングされていませんでした。

これらのz*ファイルは、Goのビルドプロセス中に生成される、プラットフォーム固有のコードや最適化されたコード、あるいはGoの内部的なデータ構造を表現するC言語のヘッダファイルなどを含んでいます。これらが欠落していると、Goのプログラムが正しくコンパイルできなかったり、実行時にランタイムエラーが発生したりする可能性がありました。

コミットメッセージにある「Fixes #2614」は、この問題がGoのIssueトラッカーで報告されていたことを示しています。このコミットは、WindowsユーザーがGoをインストールした際に、必要なランタイムファイルがすべて揃うようにすることで、Go開発環境の安定性と完全性を確保することを目的としています。

前提知識の解説

  • Goランタイム (Go Runtime): Go言語で書かれたプログラムが実行される際に、メモリ管理(ガベージコレクション)、ゴルーチン(軽量スレッド)のスケジューリング、チャネル通信、システムコールなど、低レベルな操作を司る部分です。Goのランタイムは、Go言語自体とC言語(またはアセンブリ言語)で書かれており、各プラットフォームに最適化されています。
  • src/pkg/runtime: Goのソースコードリポジトリにおける、ランタイムのソースコードが格納されているディレクトリです。ここには、Goプログラムの実行を支える基盤となるコードが含まれています。
  • z*.c, z*.go, z*.h ファイル: これらのファイルは、Goのビルドシステムによって生成される特殊なファイルです。
    • z*.c: Goのランタイムの一部としてコンパイルされるC言語のソースファイル。
    • z*.go: Goのランタイムの一部としてコンパイルされるGo言語のソースファイル。
    • z*.h: C言語のヘッダファイルで、GoのランタイムがCコードと連携する際に使用される定義や構造体が含まれることがあります。 これらのファイルは、例えば、Goの型情報や、特定のアーキテクチャ・OSに特化したランタイムの挙動を定義するために、ビルド時に自動生成されることが多いです。
  • package.bash: このファイルは、Goのソースコードリポジトリのmisc/windowsディレクトリに存在するBashスクリプトです。その名の通り、Windows環境向けのGoのバイナリ配布パッケージを作成するためのスクリプトです。Goのソースコードをビルドし、必要なバイナリ、ライブラリ、ソースファイルなどをまとめて、ZIPアーカイブとして配布可能な形式にパッケージングする役割を担っています。
  • cp -a コマンド: Unix/Linux系のシステムでファイルをコピーするためのコマンドです。-aオプションは「アーカイブモード」を意味し、ファイルの属性(パーミッション、タイムスタンプなど)を保持したまま、ディレクトリを再帰的にコピーします。
  • cp コマンドとワイルドカード (*): cpコマンドはファイルをコピーするために使用されます。*はワイルドカード文字で、任意の文字列にマッチします。例えば、z*.czで始まり.cで終わるすべてのファイルにマッチします。

技術的詳細

このコミットは、GoのWindows向けパッケージングプロセスにおける重要な修正です。misc/windows/package.bashスクリプトは、GoのソースコードからWindows向けの実行可能ファイルやライブラリを生成し、それらをZIPアーカイブにまとめる役割を担っています。

従来のスクリプトでは、Goのコンパイラや標準ライブラリのパッケージ(pkgディレクトリ)および実行可能ファイル(binディレクトリ)はコピーされていましたが、Goランタイムのsrc/pkg/runtimeディレクトリ内に存在するz*.cz*.goz*.hといった特定のファイル群がパッケージに含まれていませんでした。

これらのz*ファイルは、Goのビルドシステムによって生成される、ランタイムの内部実装に不可欠なコンポーネントです。例えば、Goのガベージコレクタの動作を定義するコードや、特定のCPUアーキテクチャに最適化されたアセンブリコード、あるいはGoの型システムとC言語のインターフェースを橋渡しする定義などが含まれることがあります。これらが欠落していると、Goのツールチェインが正しく機能しない、あるいはGoで書かれたプログラムが期待通りに動作しないといった問題が発生します。

このコミットでは、package.bashスクリプトに以下の3行を追加することで、これらの重要なファイルがGoのインストールパッケージに確実に含まれるようにしています。

  1. cp ../../src/pkg/runtime/z*.c go/src/pkg/runtime/
  2. cp ../../src/pkg/runtime/z*.go go/src/pkg/runtime/
  3. cp ../../src/pkg/runtime/z*.h go/src/pkg/runtime/

これらのコマンドは、Goのソースツリーのルートから見て相対パスで指定されたsrc/pkg/runtimeディレクトリから、zで始まる.c.go.h拡張子を持つすべてのファイルを、パッケージング対象のgo/src/pkg/runtimeディレクトリにコピーします。これにより、WindowsユーザーがGoをインストールした際に、Goのランタイムが完全に機能するために必要なすべてのファイルが提供されることになります。

また、echoコマンドの出力も変更され、コピーされるファイルの種類がより明確に示されています。これは、スクリプトの実行中にユーザーや開発者が何がコピーされているかを理解しやすくするための小さな改善です。

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

--- a/misc/windows/package.bash
+++ b/misc/windows/package.bash
@@ -34,9 +34,12 @@ hg clone -r $(hg id -n | sed 's/+//') $(hg root) go
 
 rm -rf ./go/.hg ./go/.hgignore ./go/.hgtags
 
-echo "%%%%% Copying pkg and bin %%%%%" 1>&2
+echo "%%%%% Copying pkg, bin and src/pkg/runtime/z* %%%%%" 1>&2
 cp -a ../../pkg go/pkg
 cp -a ../../bin go/bin
+cp ../../src/pkg/runtime/z*.c go/src/pkg/runtime/
+cp ../../src/pkg/runtime/z*.go go/src/pkg/runtime/
+cp ../../src/pkg/runtime/z*.h go/src/pkg/runtime/
 
 echo "%%%%% Starting zip packaging %%%%%" 1>&2
 7za a -tzip -mx=9 gowin$GOARCH"_"$ver.zip "go/\" >/dev/null

コアとなるコードの解説

変更はmisc/windows/package.bashファイルに対して行われています。

  • - echo "%%%%% Copying pkg and bin %%%%%" 1>&2

    • この行は削除されました。これは、パッケージングスクリプトが何を行っているかを示すメッセージです。
  • + echo "%%%%% Copying pkg, bin and src/pkg/runtime/z* %%%%%" 1>&2

    • 削除された行の代わりにこの行が追加されました。メッセージが更新され、src/pkg/runtime/z*ファイルもコピー対象に含まれることが明示されています。1>&2は、このメッセージが標準エラー出力にリダイレクトされることを意味します。
  • cp -a ../../pkg go/pkg

    • この行は変更されていません。Goの標準ライブラリパッケージ(pkgディレクトリ)を、作成中のGoインストールディレクトリ(go/pkg)にコピーしています。-aオプションは、ファイルの属性(パーミッション、タイムスタンプなど)を保持したまま、ディレクトリを再帰的にコピーします。
  • cp -a ../../bin go/bin

    • この行も変更されていません。Goの実行可能バイナリ(binディレクトリ、例: go.exe, gofmt.exeなど)を、作成中のGoインストールディレクトリ(go/bin)にコピーしています。
  • + cp ../../src/pkg/runtime/z*.c go/src/pkg/runtime/

    • この行が新しく追加されました。Goのソースツリーのルートから見て相対パスで指定されたsrc/pkg/runtimeディレクトリにある、zで始まり.c拡張子を持つすべてのファイル(例: zversion.c, zgoarch_windows_amd64.cなど)を、パッケージング対象のgo/src/pkg/runtimeディレクトリにコピーします。
  • + cp ../../src/pkg/runtime/z*.go go/src/pkg/runtime/

    • この行も新しく追加されました。同様に、src/pkg/runtimeディレクトリにある、zで始まり.go拡張子を持つすべてのファイル(例: zruntime_defs.goなど)をコピーします。
  • + cp ../../src/pkg/runtime/z*.h go/src/pkg/runtime/

    • この行も新しく追加されました。src/pkg/runtimeディレクトリにある、zで始まり.h拡張子を持つすべてのファイル(例: zsyscall_windows.hなど)をコピーします。

これらの追加されたcpコマンドにより、GoのランタイムがWindows環境で完全に機能するために必要な、ビルド時に生成される特殊なファイル群が、Goの配布パッケージに確実に含まれるようになりました。これにより、Windowsユーザーはより完全で安定したGoのインストール環境を得ることができます。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント (Goランタイム、ビルドプロセスに関する一般的な情報)
  • Gitの差分表示 (diff) の一般的な理解
  • Bashスクリプトの基本的なコマンド (echo, cp, ワイルドカード) の知識