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

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

このコミットは、Go言語のプロファイリングツールである cmd/prof が、Plan 9オペレーティングシステム上でビルドされないようにするための変更です。具体的には、src/cmd/prof/main.c ファイルにビルド制約 // +build !plan9 を追加することで、Plan 9環境でのコンパイルをスキップするように設定されています。これにより、Plan 9環境における cmd/prof のビルドエラーや互換性の問題を一時的に回避しています。

コミット

  • コミットハッシュ: 3192cac58732eb44ae68296c79818b288b68a561
  • 作者: Anthony Martin ality@pbrane.org
  • コミット日時: Mon Apr 16 17:36:36 2012 -0700

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

https://github.com/golang/go/commit/3192cac58732eb44ae68296c79818b288b68a561

元コミット内容

cmd/prof: don't build on Plan 9 for now.

R=golang-dev, bradfitz, akumar
CC=golang-dev
https://golang.org/cl/5629054

変更の背景

この変更の背景には、cmd/prof ツールがPlan 9環境で正常にビルドまたは動作しない問題があったと考えられます。プロファイリングツールは、CPU使用率、メモリ割り当て、システムコールなど、オペレーティングシステム固有の機能に深く依存することが多いため、異なるOS環境では互換性の問題が発生しやすいです。

考えられる具体的な理由は以下の通りです。

  1. Plan 9固有のAPIの欠如または違い: cmd/prof が利用しているC言語のコードや、それが依存するライブラリが、Plan 9には存在しないか、Unix系OS(Linux, macOSなど)とは異なるAPIを提供していた可能性があります。
  2. ビルド環境の制約: 当時のGoのPlan 9向けクロスコンパイル環境や、Plan 9ネイティブのビルド環境において、cmd/prof のビルドに必要なツールチェインや依存関係が適切に機能しなかった可能性があります。
  3. 開発優先度: cmd/prof のPlan 9サポートが当時の開発優先度リストで低かったため、一時的にビルドを無効にすることで、他の重要な開発やCI/CDパイプラインの進行を妨げないようにしたと考えられます。コミットメッセージの「for now.(今のところ)」という表現は、将来的にこの問題が解決される可能性を示唆しています。

前提知識の解説

Go Build Tags (ビルド制約)

Go言語には「ビルドタグ(Build Tags)」または「ビルド制約(Build Constraints)」と呼ばれる強力な機能があります。これは、ソースファイルの先頭に特定のコメント行を追加することで、そのファイルを特定の環境(オペレーティングシステム、アーキテクチャ、またはカスタムタグ)でのみコンパイル対象とする、あるいは除外するメカニズムです。

構文は以下の通りです。

// +build tag1,tag2 !tag3
  • tag1,tag2: tag1tag2 の両方が有効な場合にファイルがコンパイルされます(AND条件)。
  • tag1 || tag2: tag1 または tag2 のいずれかが有効な場合にファイルがコンパイルされます(OR条件)。これは複数行に分けて記述します。
  • !tag3: tag3 が有効でない場合にファイルがコンパイルされます(否定)。

このコミットで使用されている // +build !plan9 は、「Plan 9環境ではない場合にこのファイルをコンパイルする」という意味になります。これにより、Plan 9上では src/cmd/prof/main.c がビルドプロセスから除外され、結果として cmd/prof ツール全体がPlan 9向けにビルドされなくなります。

Plan 9 from Bell Labs

Plan 9 from Bell Labsは、1980年代後半にベル研究所で開発された分散オペレーティングシステムです。Unixの後継として設計され、その設計思想は「すべてをファイルとして扱う」という点で非常に特徴的です。ネットワーク上のリソース(プロセス、デバイス、ファイルなど)もすべてファイルシステムを通じてアクセス可能であり、これにより分散コンピューティングをシンプルに実現しようとしました。

Go言語の開発者の一部はベル研究所の出身であり、Go言語の設計にはPlan 9の思想が少なからず影響を与えています。そのため、Go言語は初期からPlan 9に対する一定のサポートを提供してきました。しかし、Plan 9はUnix系OSほど広く普及しているわけではなく、特定のシステムプログラミングインターフェースやツールチェインの互換性において課題が生じることがあります。

cmd/prof

cmd/prof は、Go言語の標準ライブラリやツールの一部として提供されるコマンドラインツールであると推測されます。Go言語には、プログラムのパフォーマンスを分析するためのプロファイリングツールが組み込まれており、通常は go tool pprof のような形で利用されます。cmd/prof は、その内部実装の一部、あるいは関連するユーティリティであった可能性が高いです。プロファイリングは、実行中のプログラムからCPU時間、メモリ使用量、ゴルーチン(Goの軽量スレッド)のスタックトレースなどの情報を収集するプロセスであり、OSレベルの機能へのアクセスを必要とします。

技術的詳細

このコミットの技術的詳細の中心は、Goのビルドシステムが // +build コメントをどのように解釈し、コンパイルプロセスに影響を与えるかという点です。

src/cmd/prof/main.c はC言語のソースファイルですが、GoのビルドシステムはGoのソースファイルだけでなく、Cやアセンブリ言語のソースファイル(cgoを使用する場合など)に対してもビルドタグを適用できます。この場合、main.ccmd/prof の一部としてGoのビルドプロセスによってコンパイルされるCコードであり、そのコンパイルを制御するためにビルドタグが使用されています。

// +build !plan9 という行がファイルに追加されると、Goのコンパイラ(またはビルドツール)は、現在のターゲットOSが plan9 であるかどうかをチェックします。

  • もしターゲットOSが plan9 であれば、!plan9 という条件は偽となり、main.c ファイルはコンパイル対象から除外されます。
  • もしターゲットOSが plan9 以外(例: linux, darwin, windows など)であれば、!plan9 という条件は真となり、main.c ファイルは通常通りコンパイルされます。

この変更により、Plan 9環境で cmd/prof をビルドしようとすると、main.c が含まれないため、必要なシンボルや関数が定義されていないというリンクエラーが発生するか、あるいは cmd/prof 自体がビルド対象から外れることになります。これは、Plan 9環境でのビルド失敗を回避するための効果的かつ一般的な手法です。

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

--- a/src/cmd/prof/main.c
+++ b/src/cmd/prof/main.c
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.\n
 \n+// +build !plan9\n+\n #include <u.h>\n #include <time.h>\n #include <libc.h>\n```

## コアとなるコードの解説

変更は `src/cmd/prof/main.c` ファイルの冒頭に `// +build !plan9` という行を追加した点です。

*   `//`: これはC言語のコメント記号ですが、GoのビルドシステムはGoのソースファイルと同様に、C/C++ソースファイルの先頭にある `// +build` コメントを特別な指示として解釈します。
*   `+build`: これはGoのビルドタグの開始を示すキーワードです。
*   `!plan9`: これはビルド制約の具体的な内容です。`!` は否定を意味し、`plan9` はGoが認識するオペレーティングシステムのタグの一つです。したがって、この行全体で「Plan 9ではない環境でのみこのファイルをビルドする」という指示を与えています。

この一行の追加により、Goのビルドツールは、Plan 9をターゲットとするビルドにおいては `main.c` をコンパイル対象から外し、それ以外のOSをターゲットとするビルドでは通常通りコンパイルするようになります。

## 関連リンク

*   **Gerrit Change-ID**: `https://golang.org/cl/5629054`
    *   これはGoプロジェクトがコードレビューに利用しているGerritシステムにおける変更セットのIDです。Goのコミットメッセージには、関連するGerritの変更へのリンクがよく含まれています。このリンクを辿ることで、このコミットに至るまでの議論やレビューの履歴を確認できます。

## 参考にした情報源リンク

*   **Go Command Documentation - Build Constraints**:
    *   Go言語の公式ドキュメントにおけるビルド制約に関する説明。
    *   [https://pkg.go.dev/cmd/go#hdr-Build_constraints](https://pkg.go.dev/cmd/go#hdr-Build_constraints)
*   **Wikipedia - Plan 9 from Bell Labs**:
    *   Plan 9オペレーティングシステムに関する一般的な情報。
    *   [https://ja.wikipedia.org/wiki/Plan_9_from_Bell_Labs](https://ja.wikipedia.org/wiki/Plan_9_from_Bell_Labs)
*   **Go Source Code (GitHub)**:
    *   Go言語のソースコードリポジトリ。`cmd/prof` やその他のツールの実装を直接確認できます。
    *   [https://github.com/golang/go](https://github.com/golang/go)
*   **Go Wiki - Go on Plan 9**:
    *   Go言語のPlan 9サポートに関する情報が掲載されている場合があります。
    *   [https://go.dev/wiki/GoOnPlan9](https://go.dev/wiki/GoOnPlan9) (一般的なGo WikiのURLであり、特定のページは検索が必要)