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

[インデックス 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/distpkg/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/distpkg/runtime のビルド能力を直接持たせることで、この依存関係を解消し、より柔軟なテスト環境を提供することを目的としています。これにより、Goのブートストラップや開発の初期段階でのテストカバレッジが向上し、Goツールチェイン全体の堅牢性が高まります。

また、同時に行われたタイプミスの修正は、コードの品質と可読性を向上させるための一般的なメンテナンス作業です。

前提知識の解説

このコミットを理解するためには、以下のGo言語のビルドシステムと関連する概念についての知識が必要です。

  1. cmd/dist:

    • Go言語のソースコードからGoツールチェイン自体(コンパイラ、リンカ、アセンブラ、cmd/go など)をビルドするための低レベルなツールです。
    • Goのブートストラッププロセスにおいて中心的な役割を果たします。Goの初期バージョンでは、C言語で書かれたコンパイラ(gc)を使用してGoのソースコードをコンパイルし、そのGoコンパイラを使ってGoツールチェイン全体をビルドするという自己ホスト(self-hosting)のプロセスが確立されました。cmd/dist はこのブートストラップのオーケストレーションを担当します。
    • Goのソースツリーの src/cmd/dist ディレクトリに存在します。
  2. cmd/go:

    • Go言語のユーザーが日常的に使用する高レベルなコマンドラインツールです。
    • go buildgo testgo installgo get などのサブコマンドを提供し、Goパッケージのビルド、テスト、依存関係の管理、インストールなどを容易にします。
    • cmd/dist によってビルドされた後、ユーザーが利用できるようになります。
  3. pkg/runtime:

    • Go言語のランタイムパッケージです。
    • ガベージコレクション、スケジューラ、ゴルーチン管理、メモリ割り当て、システムコールインターフェースなど、Goプログラムの実行に必要な低レベルな機能を提供します。
    • Goプログラムが実行される際に常にリンクされる、Go言語の根幹をなす部分です。
  4. Goのビルドプロセス(ブートストラップ):

    • GoのソースコードからGoツールチェインを構築するプロセスは、通常、既存のGoツールチェイン(またはCコンパイラ)を使用して、新しいGoツールチェインをビルドすることから始まります。
    • cmd/dist は、このプロセスを自動化し、必要なコンポーネント(コンパイラ、アセンブラ、リンカ、標準ライブラリ、cmd/go など)を正しい順序でビルドします。
    • このコミットの目的は、このブートストラッププロセス中に pkg/runtime のテストをより容易に実行できるようにすることです。
  5. hasprefixhassuffixstreq:

    • これらはC言語で書かれた文字列操作関数で、それぞれ文字列が特定のプレフィックスで始まるか、特定のサフィックスで終わるか、または2つの文字列が完全に等しいかをチェックします。
    • cmd/dist はC言語で書かれているため、これらの関数が内部的に使用されています。

技術的詳細

このコミットは、主に src/cmd/dist/build.csrc/cmd/dist/buildruntime.c の2つのファイルに変更を加えています。

src/cmd/dist/build.c の変更

このファイルでは、install 関数内のパス比較ロジックが変更されています。install 関数は、Goの標準ライブラリやツールをインストールする際に、どのディレクトリにどのファイルをインストールするかを決定する役割を担っています。

元のコードでは、deptab(依存関係テーブル)内のプレフィックスと現在のディレクトリ dir を比較する際に、単純に hasprefix(dir, deptab[i].prefix) を使用していました。これは、dirdeptab[i].prefix で始まるかどうかをチェックするものです。

変更後のコードでは、以下の2つの条件が追加されています。

  1. streq(dir, deptab[i].prefix): これは、dirdeptab[i].prefix と完全に一致する場合を意味します。例えば、deptab[i].prefix が "pkg/runtime" で、dir も "pkg/runtime" の場合にマッチします。
  2. (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つのケースを明示的にカバーします。

  1. streq(dir, deptab[i].prefix): dirdeptab[i].prefix と完全に一致する場合。これは、pkg/runtime のような特定のパッケージディレクトリ自体をターゲットとする場合に重要です。
  2. (hassuffix(deptab[i].prefix, "/") && hasprefix(dir, deptab[i].prefix)): deptab[i].prefix がスラッシュで終わり、かつ dir がそのプレフィックスで始まる場合。これは、pkg/runtime/ のようにディレクトリの階層全体を指すプレフィックスに対して、そのサブディレクトリ(例: pkg/runtime/internal)がマッチするようにします。

この修正により、cmd/distpkg/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/distpkg/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/distpkg/runtime のビルド能力を直接持たせることで、この依存関係を解消し、より柔軟なテスト環境を提供することを目的としています。これにより、Goのブートストラップや開発の初期段階でのテストカバレッジが向上し、Goツールチェイン全体の堅牢性が高まります。

また、同時に行われたタイプミスの修正は、コードの品質と可読性を向上させるための一般的なメンテナンス作業です。

前提知識の解説

このコミットを理解するためには、以下のGo言語のビルドシステムと関連する概念についての知識が必要です。

  1. cmd/dist:

    • Go言語のソースコードからGoツールチェイン自体(コンパイラ、リンカ、アセンブラ、cmd/go など)をビルドするための低レベルなツールです。
    • Goのブートストラッププロセスにおいて中心的な役割を果たします。Goの初期バージョンでは、C言語で書かれたコンパイラ(gc)を使用してGoのソースコードをコンパイルし、そのGoコンパイラを使ってGoツールチェイン全体をビルドするという自己ホスト(self-hosting)のプロセスが確立されました。cmd/dist はこのブートストラップのオーケストレーションを担当します。
    • Goのソースツリーの src/cmd/dist ディレクトリに存在します。
  2. cmd/go:

    • Go言語のユーザーが日常的に使用する高レベルなコマンドラインツールです。
    • go buildgo testgo installgo get などのサブコマンドを提供し、Goパッケージのビルド、テスト、依存関係の管理、インストールなどを容易にします。
    • cmd/dist によってビルドされた後、ユーザーが利用できるようになります。
  3. pkg/runtime:

    • Go言語のランタイムパッケージです。
    • ガベージコレクション、スケジューラ、ゴルーチン管理、メモリ割り当て、システムコールインターフェースなど、Goプログラムの実行に必要な低レベルな機能を提供します。
    • Goプログラムが実行される際に常にリンクされる、Go言語の根幹をなす部分です。
  4. Goのビルドプロセス(ブートストラップ):

    • GoのソースコードからGoツールチェインを構築するプロセスは、通常、既存のGoツールチェイン(またはCコンパイラ)を使用して、新しいGoツールチェインをビルドすることから始まります。
    • cmd/dist は、このプロセスを自動化し、必要なコンポーネント(コンパイラ、アセンブラ、リンカ、標準ライブラリ、cmd/go など)を正しい順序でビルドします。
    • このコミットの目的は、このブートストラッププロセス中に pkg/runtime のテストをより容易に実行できるようにすることです。
  5. hasprefixhassuffixstreq:

    • これらはC言語で書かれた文字列操作関数で、それぞれ文字列が特定のプレフィックスで始まるか、特定のサフィックスで終わるか、または2つの文字列が完全に等しいかをチェックします。
    • cmd/dist はC言語で書かれているため、これらの関数が内部的に使用されています。

技術的詳細

このコミットは、主に src/cmd/dist/build.csrc/cmd/dist/buildruntime.c の2つのファイルに変更を加えています。

src/cmd/dist/build.c の変更

このファイルでは、install 関数内のパス比較ロジックが変更されています。install 関数は、Goの標準ライブラリやツールをインストールする際に、どのディレクトリにどのファイルをインストールするかを決定する役割を担っています。

元のコードでは、deptab(依存関係テーブル)内のプレフィックスと現在のディレクトリ dir を比較する際に、単純に hasprefix(dir, deptab[i].prefix) を使用していました。これは、dirdeptab[i].prefix で始まるかどうかをチェックするものです。

変更後のコードでは、以下の2つの条件が追加されています。

  1. streq(dir, deptab[i].prefix): これは、dirdeptab[i].prefix と完全に一致する場合を意味します。例えば、deptab[i].prefix が "pkg/runtime" で、dir も "pkg/runtime" の場合にマッチします。
  2. (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つのケースを明示的にカバーします。

  1. streq(dir, deptab[i].prefix): dirdeptab[i].prefix と完全に一致する場合。これは、pkg/runtime のような特定のパッケージディレクトリ自体をターゲットとする場合に重要です。
  2. (hassuffix(deptab[i].prefix, "/") && hasprefix(dir, deptab[i].prefix)): deptab[i].prefix がスラッシュで終わり、かつ dir がそのプレフィックスで始まる場合。これは、pkg/runtime/ のようにディレクトリの階層全体を指すプレフィックスに対して、そのサブディレクトリ(例: pkg/runtime/internal)がマッチするようにします。

この修正により、cmd/distpkg/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 の一般的な知識