[インデックス 18760] ファイルの概要
このコミットは、Go言語のビルドツールである cmd/dist
に、pkg/runtime
パッケージのビルドをサポートする機能を追加するものです。これにより、cmd/go
が完全に機能しない環境でも、ランタイム関連のテストを実行できるようになります。また、同時にタイプミス(typo)の修正も行われています。
コミット
commit c8871933829653ede561841f3ed44c9cd2643eed
Author: Shenghou Ma <minux.ma@gmail.com>
Date: Wed Mar 5 14:57:17 2014 -0500
cmd/dist: support building pkg/runtime/*.
Essentialy for running tests without a working cmd/go.
While we're at it, also fix a typo.
LGTM=rsc
R=golang-codereviews, rsc
CC=golang-codereviews
https://golang.org/cl/70640043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/c8871933829653ede561841f3ed44c9cd2643eed
元コミット内容
cmd/dist
が pkg/runtime/*
のビルドをサポートするように変更します。これは主に、cmd/go
が動作しない環境でテストを実行するために必要です。この変更と同時に、タイプミスも修正します。
変更の背景
Go言語のビルドシステムは、その進化の過程で様々なツールと段階を経てきました。このコミットが作成された2014年当時、Goのビルドプロセスは現在とは異なる部分がありました。
cmd/dist
は、GoのソースコードからGoツールチェイン自体をビルドするための低レベルなツールです。これは、Goのブートストラッププロセス(GoコンパイラやツールをGo自身でビルドするプロセス)において重要な役割を担っています。一方、cmd/go
は、ユーザーがGoプログラムをビルド、テスト、インストールするための高レベルなコマンドラインツールです。
このコミットの背景にある問題は、「cmd/go
が完全に機能しない環境でランタイム関連のテストを実行したい」というニーズです。例えば、Goのツールチェインを初めてビルドする際や、クロスコンパイル環境、あるいはGoのブートストラッププロセス中に、cmd/go
がまだ利用できない、または不安定な状態である可能性があります。このような状況下で、Goランタイム(pkg/runtime
)のテストを実行するには、cmd/go
に依存しない方法が必要でした。
このコミットは、cmd/dist
に pkg/runtime
のビルド能力を直接持たせることで、この依存関係を解消し、より柔軟なテスト環境を提供することを目的としています。これにより、Goのブートストラップや開発の初期段階でのテストカバレッジが向上し、Goツールチェイン全体の堅牢性が高まります。
また、同時に行われたタイプミスの修正は、コードの品質と可読性を向上させるための一般的なメンテナンス作業です。
前提知識の解説
このコミットを理解するためには、以下のGo言語のビルドシステムと関連する概念についての知識が必要です。
-
cmd/dist
:- Go言語のソースコードからGoツールチェイン自体(コンパイラ、リンカ、アセンブラ、
cmd/go
など)をビルドするための低レベルなツールです。 - Goのブートストラッププロセスにおいて中心的な役割を果たします。Goの初期バージョンでは、C言語で書かれたコンパイラ(
gc
)を使用してGoのソースコードをコンパイルし、そのGoコンパイラを使ってGoツールチェイン全体をビルドするという自己ホスト(self-hosting)のプロセスが確立されました。cmd/dist
はこのブートストラップのオーケストレーションを担当します。 - Goのソースツリーの
src/cmd/dist
ディレクトリに存在します。
- Go言語のソースコードからGoツールチェイン自体(コンパイラ、リンカ、アセンブラ、
-
cmd/go
:- Go言語のユーザーが日常的に使用する高レベルなコマンドラインツールです。
go build
、go test
、go install
、go get
などのサブコマンドを提供し、Goパッケージのビルド、テスト、依存関係の管理、インストールなどを容易にします。cmd/dist
によってビルドされた後、ユーザーが利用できるようになります。
-
pkg/runtime
:- Go言語のランタイムパッケージです。
- ガベージコレクション、スケジューラ、ゴルーチン管理、メモリ割り当て、システムコールインターフェースなど、Goプログラムの実行に必要な低レベルな機能を提供します。
- Goプログラムが実行される際に常にリンクされる、Go言語の根幹をなす部分です。
-
Goのビルドプロセス(ブートストラップ):
- GoのソースコードからGoツールチェインを構築するプロセスは、通常、既存のGoツールチェイン(またはCコンパイラ)を使用して、新しいGoツールチェインをビルドすることから始まります。
cmd/dist
は、このプロセスを自動化し、必要なコンポーネント(コンパイラ、アセンブラ、リンカ、標準ライブラリ、cmd/go
など)を正しい順序でビルドします。- このコミットの目的は、このブートストラッププロセス中に
pkg/runtime
のテストをより容易に実行できるようにすることです。
-
hasprefix
とhassuffix
、streq
:- これらはC言語で書かれた文字列操作関数で、それぞれ文字列が特定のプレフィックスで始まるか、特定のサフィックスで終わるか、または2つの文字列が完全に等しいかをチェックします。
cmd/dist
はC言語で書かれているため、これらの関数が内部的に使用されています。
技術的詳細
このコミットは、主に src/cmd/dist/build.c
と src/cmd/dist/buildruntime.c
の2つのファイルに変更を加えています。
src/cmd/dist/build.c
の変更
このファイルでは、install
関数内のパス比較ロジックが変更されています。install
関数は、Goの標準ライブラリやツールをインストールする際に、どのディレクトリにどのファイルをインストールするかを決定する役割を担っています。
元のコードでは、deptab
(依存関係テーブル)内のプレフィックスと現在のディレクトリ dir
を比較する際に、単純に hasprefix(dir, deptab[i].prefix)
を使用していました。これは、dir
が deptab[i].prefix
で始まるかどうかをチェックするものです。
変更後のコードでは、以下の2つの条件が追加されています。
streq(dir, deptab[i].prefix)
: これは、dir
がdeptab[i].prefix
と完全に一致する場合を意味します。例えば、deptab[i].prefix
が "pkg/runtime" で、dir
も "pkg/runtime" の場合にマッチします。(hassuffix(deptab[i].prefix, "/") && hasprefix(dir, deptab[i].prefix))
: これは、deptab[i].prefix
がスラッシュ (/
) で終わり、かつdir
がそのプレフィックスで始まる場合を意味します。例えば、deptab[i].prefix
が "pkg/runtime/" で、dir
が "pkg/runtime/internal" の場合にマッチします。
この変更の意図は、deptab
に登録されたプレフィックスがディレクトリ全体を指す場合(例: "pkg/runtime")と、そのディレクトリ以下のサブディレクトリを指す場合(例: "pkg/runtime/")の両方に対応できるようにすることです。これにより、pkg/runtime
ディレクトリ自体、およびそのサブディレクトリ内のファイルが正しくビルドおよびインストールされるようになります。特に pkg/runtime
のようなトップレベルのパッケージを直接指定してビルドする際に、この修正が重要になります。
src/cmd/dist/buildruntime.c
の変更
このファイルでは、コメントのタイプミスが修正されています。
元のコメント:
// mkzsys writes zsys_$GOOS_$GOARCH.h,
修正後のコメント:
// mkzsys writes zsys_$GOOS_$GOARCH.s,
mkzsys
関数は、zsys_$GOOS_$GOARCH.s
というファイル(アセンブリコードを含む)を生成する役割を担っています。元のコメントでは拡張子が .h
(ヘッダーファイル)と誤って記述されていましたが、実際には .s
(アセンブリソースファイル)が生成されるため、これを修正しています。これは機能的な変更ではなく、コードのドキュメントとしての正確性を高めるための修正です。
コアとなるコードの変更箇所
src/cmd/dist/build.c
の変更点
--- a/src/cmd/dist/build.c
+++ b/src/cmd/dist/build.c
@@ -808,7 +808,8 @@ install(char *dir)\n files.len = n;\n
for(i=0; i<nelem(deptab); i++) {\n-\t\tif(hasprefix(dir, deptab[i].prefix)) {\n+\t\tif(streq(dir, deptab[i].prefix) ||\n+\t\t (hassuffix(deptab[i].prefix, "/") && hasprefix(dir, deptab[i].prefix))) {\n \t\t\tfor(j=0; (p=deptab[i].dep[j])!=nil; j++) {\n \t\t\t\tbreset(&b1);\n \t\t\t\tbwritestr(&b1, p);
src/cmd/dist/buildruntime.c
の変更点
--- a/src/cmd/dist/buildruntime.c
+++ b/src/cmd/dist/buildruntime.c
@@ -346,7 +346,7 @@ ok:\n \tvfree(&fields);\n }\n \n-// mkzsys writes zsys_$GOOS_$GOARCH.h,\n+// mkzsys writes zsys_$GOOS_$GOARCH.s,\n // which contains arch or os specific asm code.\n // \n void
コアとなるコードの解説
src/cmd/dist/build.c
の変更の解説
この変更は、install
関数が依存関係を解決する際のロジックをより堅牢にするものです。
元のコード if(hasprefix(dir, deptab[i].prefix))
は、例えば deptab[i].prefix
が "pkg/runtime" で、dir
が "pkg/runtime/internal" のような場合にマッチします。しかし、dir
が "pkg/runtime" そのものである場合には、この条件だけでは不十分な場合があります。
新しい条件 streq(dir, deptab[i].prefix) || (hassuffix(deptab[i].prefix, "/") && hasprefix(dir, deptab[i].prefix))
は、以下の2つのケースを明示的にカバーします。
streq(dir, deptab[i].prefix)
:dir
がdeptab[i].prefix
と完全に一致する場合。これは、pkg/runtime
のような特定のパッケージディレクトリ自体をターゲットとする場合に重要です。(hassuffix(deptab[i].prefix, "/") && hasprefix(dir, deptab[i].prefix))
:deptab[i].prefix
がスラッシュで終わり、かつdir
がそのプレフィックスで始まる場合。これは、pkg/runtime/
のようにディレクトリの階層全体を指すプレフィックスに対して、そのサブディレクトリ(例:pkg/runtime/internal
)がマッチするようにします。
この修正により、cmd/dist
は pkg/runtime
パッケージとその内部のすべてのコンポーネントを、cmd/go
が利用できない状況でも正確にビルドおよびインストールできるようになります。これは、Goのブートストラッププロセスや、特定の環境でのランタイムテストの実行において、より高い信頼性を提供します。
src/cmd/dist/buildruntime.c
の変更の解説
この変更は、mkzsys
関数のコメントにおける単純なタイプミス修正です。
mkzsys
関数は、Goのランタイムが使用するアセンブリコードを含むファイル zsys_$GOOS_$GOARCH.s
を生成します。ここで $GOOS
はオペレーティングシステム(例: linux
)、$GOARCH
はアーキテクチャ(例: amd64
)を表します。
元のコメントでは、生成されるファイルの拡張子が .h
(C言語のヘッダーファイル)と誤って記述されていました。しかし、実際にはアセンブリソースファイルであるため、正しい拡張子である .s
に修正されました。
この修正は、コードの動作には影響を与えませんが、ドキュメンテーションの正確性を向上させ、将来の開発者がこの関数の目的と出力ファイルを正しく理解するのに役立ちます。
関連リンク
- Go言語のソースコード: https://github.com/golang/go
- Go言語のブートストラップに関する議論(一般的な情報源):
- Goの公式ドキュメントやブログ記事で「Go bootstrap」や「Go build process」を検索すると、より詳細な情報が見つかる可能性があります。
- Goの初期の設計に関するドキュメントやメーリングリストのアーカイブも参考になります。
参考にした情報源リンク
- Go言語の公式ドキュメント (Goのビルドプロセスに関する一般的な情報)
- Go言語のソースコード (特に
src/cmd/dist
ディレクトリ内のファイル) - Go言語のコミット履歴とコードレビューシステム (Gerrit)
- Go言語のメーリングリストやフォーラム (過去の議論や設計に関する情報)
- Go言語のブートストラップに関する一般的な知識 (Goの自己ホスト型コンパイラの概念)
- C言語の文字列操作関数
streq
,hasprefix
,hassuffix
の一般的な知識# [インデックス 18760] ファイルの概要
このコミットは、Go言語のビルドツールである cmd/dist
に、pkg/runtime
パッケージのビルドをサポートする機能を追加するものです。これにより、cmd/go
が完全に機能しない環境でも、ランタイム関連のテストを実行できるようになります。また、同時にタイプミス(typo)の修正も行われています。
コミット
commit c8871933829653ede561841f3ed44c9cd2643eed
Author: Shenghou Ma <minux.ma@gmail.com>
Date: Wed Mar 5 14:57:17 2014 -0500
cmd/dist: support building pkg/runtime/*.
Essentialy for running tests without a working cmd/go.
While we're at it, also fix a typo.
LGTM=rsc
R=golang-codereviews, rsc
CC=golang-codereviews
https://golang.org/cl/70640043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/c8871933829653ede561841f3ed44c9cd2643eed
元コミット内容
cmd/dist
が pkg/runtime/*
のビルドをサポートするように変更します。これは主に、cmd/go
が動作しない環境でテストを実行するために必要です。この変更と同時に、タイプミスも修正します。
変更の背景
Go言語のビルドシステムは、その進化の過程で様々なツールと段階を経てきました。このコミットが作成された2014年当時、Goのビルドプロセスは現在とは異なる部分がありました。
cmd/dist
は、GoのソースコードからGoツールチェイン自体をビルドするための低レベルなツールです。これは、Goのブートストラッププロセス(GoコンパイラやツールをGo自身でビルドするプロセス)において重要な役割を担っています。一方、cmd/go
は、ユーザーがGoプログラムをビルド、テスト、インストールするための高レベルなコマンドラインツールです。
このコミットの背景にある問題は、「cmd/go
が完全に機能しない環境でランタイム関連のテストを実行したい」というニーズです。例えば、Goのツールチェインを初めてビルドする際や、クロスコンパイル環境、あるいはGoのブートストラッププロセス中に、cmd/go
がまだ利用できない、または不安定な状態である可能性があります。このような状況下で、Goランタイム(pkg/runtime
)のテストを実行するには、cmd/go
に依存しない方法が必要でした。
このコミットは、cmd/dist
に pkg/runtime
のビルド能力を直接持たせることで、この依存関係を解消し、より柔軟なテスト環境を提供することを目的としています。これにより、Goのブートストラップや開発の初期段階でのテストカバレッジが向上し、Goツールチェイン全体の堅牢性が高まります。
また、同時に行われたタイプミスの修正は、コードの品質と可読性を向上させるための一般的なメンテナンス作業です。
前提知識の解説
このコミットを理解するためには、以下のGo言語のビルドシステムと関連する概念についての知識が必要です。
-
cmd/dist
:- Go言語のソースコードからGoツールチェイン自体(コンパイラ、リンカ、アセンブラ、
cmd/go
など)をビルドするための低レベルなツールです。 - Goのブートストラッププロセスにおいて中心的な役割を果たします。Goの初期バージョンでは、C言語で書かれたコンパイラ(
gc
)を使用してGoのソースコードをコンパイルし、そのGoコンパイラを使ってGoツールチェイン全体をビルドするという自己ホスト(self-hosting)のプロセスが確立されました。cmd/dist
はこのブートストラップのオーケストレーションを担当します。 - Goのソースツリーの
src/cmd/dist
ディレクトリに存在します。
- Go言語のソースコードからGoツールチェイン自体(コンパイラ、リンカ、アセンブラ、
-
cmd/go
:- Go言語のユーザーが日常的に使用する高レベルなコマンドラインツールです。
go build
、go test
、go install
、go get
などのサブコマンドを提供し、Goパッケージのビルド、テスト、依存関係の管理、インストールなどを容易にします。cmd/dist
によってビルドされた後、ユーザーが利用できるようになります。
-
pkg/runtime
:- Go言語のランタイムパッケージです。
- ガベージコレクション、スケジューラ、ゴルーチン管理、メモリ割り当て、システムコールインターフェースなど、Goプログラムの実行に必要な低レベルな機能を提供します。
- Goプログラムが実行される際に常にリンクされる、Go言語の根幹をなす部分です。
-
Goのビルドプロセス(ブートストラップ):
- GoのソースコードからGoツールチェインを構築するプロセスは、通常、既存のGoツールチェイン(またはCコンパイラ)を使用して、新しいGoツールチェインをビルドすることから始まります。
cmd/dist
は、このプロセスを自動化し、必要なコンポーネント(コンパイラ、アセンブラ、リンカ、標準ライブラリ、cmd/go
など)を正しい順序でビルドします。- このコミットの目的は、このブートストラッププロセス中に
pkg/runtime
のテストをより容易に実行できるようにすることです。
-
hasprefix
とhassuffix
、streq
:- これらはC言語で書かれた文字列操作関数で、それぞれ文字列が特定のプレフィックスで始まるか、特定のサフィックスで終わるか、または2つの文字列が完全に等しいかをチェックします。
cmd/dist
はC言語で書かれているため、これらの関数が内部的に使用されています。
技術的詳細
このコミットは、主に src/cmd/dist/build.c
と src/cmd/dist/buildruntime.c
の2つのファイルに変更を加えています。
src/cmd/dist/build.c
の変更
このファイルでは、install
関数内のパス比較ロジックが変更されています。install
関数は、Goの標準ライブラリやツールをインストールする際に、どのディレクトリにどのファイルをインストールするかを決定する役割を担っています。
元のコードでは、deptab
(依存関係テーブル)内のプレフィックスと現在のディレクトリ dir
を比較する際に、単純に hasprefix(dir, deptab[i].prefix)
を使用していました。これは、dir
が deptab[i].prefix
で始まるかどうかをチェックするものです。
変更後のコードでは、以下の2つの条件が追加されています。
streq(dir, deptab[i].prefix)
: これは、dir
がdeptab[i].prefix
と完全に一致する場合を意味します。例えば、deptab[i].prefix
が "pkg/runtime" で、dir
も "pkg/runtime" の場合にマッチします。(hassuffix(deptab[i].prefix, "/") && hasprefix(dir, deptab[i].prefix))
: これは、deptab[i].prefix
がスラッシュ (/
) で終わり、かつdir
がそのプレフィックスで始まる場合を意味します。例えば、deptab[i].prefix
が "pkg/runtime/" で、dir
が "pkg/runtime/internal" の場合にマッチします。
この変更の意図は、deptab
に登録されたプレフィックスがディレクトリ全体を指す場合(例: "pkg/runtime")と、そのディレクトリ以下のサブディレクトリを指す場合(例: "pkg/runtime/")の両方に対応できるようにすることです。これにより、pkg/runtime
ディレクトリ自体、およびそのサブディレクトリ内のファイルが正しくビルドおよびインストールされるようになります。特に pkg/runtime
のようなトップレベルのパッケージを直接指定してビルドする際に、この修正が重要になります。
src/cmd/dist/buildruntime.c
の変更
このファイルでは、コメントのタイプミスが修正されています。
元のコメント:
// mkzsys writes zsys_$GOOS_$GOARCH.h,
修正後のコメント:
// mkzsys writes zsys_$GOOS_$GOARCH.s,
mkzsys
関数は、zsys_$GOOS_$GOARCH.s
というファイル(アセンブリコードを含む)を生成する役割を担っています。元のコメントでは拡張子が .h
(ヘッダーファイル)と誤って記述されていましたが、実際には .s
(アセンブリソースファイル)が生成されるため、これを修正しています。これは機能的な変更ではなく、コードのドキュメントとしての正確性を高めるための修正です。
コアとなるコードの変更箇所
src/cmd/dist/build.c
の変更点
--- a/src/cmd/dist/build.c
+++ b/src/cmd/dist/build.c
@@ -808,7 +808,8 @@ install(char *dir)\n files.len = n;\n
for(i=0; i<nelem(deptab); i++) {\n-\t\tif(hasprefix(dir, deptab[i].prefix)) {\n+\t\tif(streq(dir, deptab[i].prefix) ||\n+\t\t (hassuffix(deptab[i].prefix, "/") && hasprefix(dir, deptab[i].prefix))) {\n \t\t\tfor(j=0; (p=deptab[i].dep[j])!=nil; j++) {\n \t\t\t\tbreset(&b1);\n \t\t\t\tbwritestr(&b1, p);
src/cmd/dist/buildruntime.c
の変更点
--- a/src/cmd/dist/buildruntime.c
+++ b/src/cmd/dist/buildruntime.c
@@ -346,7 +346,7 @@ ok:\n \tvfree(&fields);\n }\n \n-// mkzsys writes zsys_$GOOS_$GOARCH.h,\n+// mkzsys writes zsys_$GOOS_$GOARCH.s,\n // which contains arch or os specific asm code.\n // \n void
コアとなるコードの解説
src/cmd/dist/build.c
の変更の解説
この変更は、install
関数が依存関係を解決する際のロジックをより堅牢にするものです。
元のコード if(hasprefix(dir, deptab[i].prefix))
は、例えば deptab[i].prefix
が "pkg/runtime" で、dir
が "pkg/runtime/internal" のような場合にマッチします。しかし、dir
が "pkg/runtime" そのものである場合には、この条件だけでは不十分な場合があります。
新しい条件 streq(dir, deptab[i].prefix) || (hassuffix(deptab[i].prefix, "/") && hasprefix(dir, deptab[i].prefix))
は、以下の2つのケースを明示的にカバーします。
streq(dir, deptab[i].prefix)
:dir
がdeptab[i].prefix
と完全に一致する場合。これは、pkg/runtime
のような特定のパッケージディレクトリ自体をターゲットとする場合に重要です。(hassuffix(deptab[i].prefix, "/") && hasprefix(dir, deptab[i].prefix))
:deptab[i].prefix
がスラッシュで終わり、かつdir
がそのプレフィックスで始まる場合。これは、pkg/runtime/
のようにディレクトリの階層全体を指すプレフィックスに対して、そのサブディレクトリ(例:pkg/runtime/internal
)がマッチするようにします。
この修正により、cmd/dist
は pkg/runtime
パッケージとその内部のすべてのコンポーネントを、cmd/go
が利用できない状況でも正確にビルドおよびインストールできるようになります。これは、Goのブートストラッププロセスや、特定の環境でのランタイムテストの実行において、より高い信頼性を提供します。
src/cmd/dist/buildruntime.c
の変更の解説
この変更は、mkzsys
関数のコメントにおける単純なタイプミス修正です。
mkzsys
関数は、Goのランタイムが使用するアセンブリコードを含むファイル zsys_$GOOS_$GOARCH.s
を生成します。ここで $GOOS
はオペレーティングシステム(例: linux
)、$GOARCH
はアーキテクチャ(例: amd64
)を表します。
元のコメントでは、生成されるファイルの拡張子が .h
(C言語のヘッダーファイル)と誤って記述されていました。しかし、実際にはアセンブリソースファイルであるため、正しい拡張子である .s
に修正されました。
この修正は、コードの動作には影響を与えませんが、ドキュメンテーションの正確性を向上させ、将来の開発者がこの関数の目的と出力ファイルを正しく理解するのに役立ちます。
関連リンク
- Go言語のソースコード: https://github.com/golang/go
- Go言語のブートストラップに関する議論(一般的な情報源):
- Goの公式ドキュメントやブログ記事で「Go bootstrap」や「Go build process」を検索すると、より詳細な情報が見つかる可能性があります。
- Goの初期の設計に関するドキュメントやメーリングリストのアーカイブも参考になります。
参考にした情報源リンク
- Go言語の公式ドキュメント (Goのビルドプロセスに関する一般的な情報)
- Go言語のソースコード (特に
src/cmd/dist
ディレクトリ内のファイル) - Go言語のコミット履歴とコードレビューシステム (Gerrit)
- Go言語のメーリングリストやフォーラム (過去の議論や設計に関する情報)
- Go言語のブートストラップに関する一般的な知識 (Goの自己ホスト型コンパイラの概念)
- C言語の文字列操作関数
streq
,hasprefix
,hassuffix
の一般的な知識