[インデックス 10939] ファイルの概要
このコミットは、Go言語の標準ライブラリに含まれる os/signal
パッケージのビルド設定を変更するものです。具体的には、このパッケージがPlan 9オペレーティングシステム上でビルドされないように、Goのビルドタグ(+build
ディレクティブ)が追加されました。これにより、os/signal
パッケージは、Darwin (macOS)、FreeBSD、Linux、NetBSD、OpenBSD、およびWindowsといったPOSIXライクなシステムでのみコンパイルされるようになります。
コミット
commit 6645602c0b24e762a9fc009376fef1d83760763d
Author: Anthony Martin <ality@pbrane.org>
Date: Wed Dec 21 07:52:07 2011 -0500
os/signal: do not build on Plan 9
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5503057
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/6645602c0b24e762a9fc009376fef1d83760763d
元コミット内容
os/signal: do not build on Plan 9
このコミットは、os/signal
パッケージがPlan 9オペレーティングシステム上でビルドされないようにするための変更です。
変更の背景
このコミットが行われた2011年12月は、Go言語がまだ初期開発段階にあり、Go 1.0のリリース(2012年3月)を控えた時期でした。os/signal
パッケージは、オペレーティングシステムからのシグナル(信号)を処理するための機能を提供します。
Unix系オペレーティングシステム(Linux, macOS, BSDなど)では、プロセス間通信やイベント通知のメカニズムとしてPOSIXシグナルが広く利用されています。しかし、Plan 9オペレーティングシステムは、Unixとは異なる設計思想に基づいており、シグナル処理のメカニズムも大きく異なります。Plan 9では、Unixのシグナルに相当する機能として「notes」と呼ばれる文字列ベースの通知メカニズムを使用します。
os/signal
パッケージの初期の実装は、主にPOSIXシグナルに焦点を当てて設計されていたため、Plan 9のnotesシステムとは直接互換性がありませんでした。このため、Plan 9上で os/signal
パッケージをビルドしようとすると、コンパイルエラーが発生したり、意図しない動作を引き起こしたりする可能性がありました。
このコミットは、当時の os/signal
パッケージがPlan 9のシグナル処理モデルに完全に対応していなかったため、一時的な措置として、Plan 9でのビルドを明示的に無効にすることで、ビルドエラーや互換性の問題を回避することを目的としています。これにより、Goのビルドシステムは、Plan 9をターゲットとする場合に os/signal
パッケージのソースファイルを無視するようになります。
前提知識の解説
Go Build Tags (ビルドタグ)
Go言語には、特定の環境(オペレーティングシステム、アーキテクチャ、Goのバージョンなど)でのみコードをコンパイルするための「ビルドタグ」というメカニズムがあります。これは、ソースファイルの先頭に // +build
ディレクティブとして記述されます。
例:
// +build linux darwin
このディレクティブがファイルの先頭にある場合、そのファイルはLinuxまたはmacOS (Darwin) をターゲットとするビルドでのみコンパイルされます。それ以外のOSでは、そのファイルはビルドプロセスから除外されます。複数のタグをスペースで区切って記述すると、それらのタグのいずれかが満たされればコンパイルされます。カンマで区切るとAND条件になります。
オペレーティングシステムにおけるシグナル (POSIX Signals)
Unix系オペレーティングシステムにおいて、シグナルはソフトウェア割り込みの一種であり、プロセスに対して非同期的にイベントを通知するメカニズムです。例えば、Ctrl+Cを押すと SIGINT
シグナルがプロセスに送られ、プロセスは通常終了します。他にも、子プロセスの終了 (SIGCHLD
)、セグメンテーション違反 (SIGSEGV
) など、様々なシグナルが存在します。プログラムはこれらのシグナルを捕捉し、特定のアクションを実行するように設定できます。
Plan 9 オペレーティングシステム
Plan 9 from Bell Labsは、Unixの後継として設計された分散型オペレーティングシステムです。Unixとは異なる設計哲学を持ち、特に「すべてがファイルである」という原則を徹底しています。Plan 9では、Unixのようなシグナルメカニズムは存在せず、代わりに「notes」と呼ばれる文字列ベースの通知システムを使用します。プロセスは他のプロセスに文字列メッセージ(note)を送信でき、受信側はこれを処理します。この根本的な違いが、Goの os/signal
パッケージがPlan 9で直接動作しない理由です。
技術的詳細
このコミットの技術的な核心は、Goのビルドシステムが持つ条件付きコンパイルの機能、すなわちビルドタグの利用にあります。
os/signal
パッケージの signal.go
および signal_test.go
ファイルは、Goの標準ライブラリの一部として、オペレーティングシステム固有のシグナル処理ロジックを含んでいます。これらのファイルは、Unix系システムが提供するPOSIXシグナルAPI(例: signal(2)
、sigaction(2)
)に依存して実装されています。
Plan 9はこれらのPOSIXシグナルAPIを提供しないため、os/signal
パッケージのコードをPlan 9上でコンパイルしようとすると、未定義の関数呼び出しや型不一致などのコンパイルエラーが発生します。また、仮にコンパイルできたとしても、実行時にシグナル処理が正しく機能しないという問題が生じます。
この問題を解決するため、開発者は // +build
ディレクティブを利用しました。このディレクティブは、Goコンパイラに対して、特定のソースファイルをどのビルドターゲットに含めるかを指示します。
コミットによって追加された // +build darwin freebsd linux netbsd openbsd windows
という行は、Goツールチェーンに対し、signal.go
と signal_test.go
の両ファイルを、指定されたオペレーティングシステム(macOS、FreeBSD、Linux、NetBSD、OpenBSD、Windows)のいずれかをターゲットとするビルドでのみ含めるように指示します。
これにより、GoツールチェーンがPlan 9をターゲットとしてビルドを実行する場合、これらのファイルはビルドプロセスから自動的に除外されます。結果として、Plan 9固有のシグナル処理の実装がないにもかかわらず、os/signal
パッケージが原因でビルドが失敗するのを防ぎ、Goの標準ライブラリ全体のビルドを成功させることができます。
これは、クロスプラットフォーム開発において、特定のプラットフォームに依存するコードを適切に分離し、ビルドエラーを防ぐための一般的なプラクティスです。
コアとなるコードの変更箇所
このコミットでは、以下の2つのファイルの先頭にビルドタグが追加されました。
src/pkg/os/signal/signal.go
src/pkg/os/signal/signal_test.go
具体的な変更は、各ファイルの2行目に追加された // +build darwin freebsd linux netbsd openbsd windows
というコメント行です。
--- a/src/pkg/os/signal/signal.go
+++ b/src/pkg/os/signal/signal.go
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+// +build darwin freebsd linux netbsd openbsd windows
+
// Package signal implements operating system-independent signal handling.
package signal
--- a/src/pkg/os/signal/signal_test.go
+++ b/src/pkg/os/signal/signal_test.go
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+// +build darwin freebsd linux netbsd openbsd windows
+
package signal
import (
コアとなるコードの解説
追加された // +build darwin freebsd linux netbsd openbsd windows
という行は、Goのビルドシステムに対する指示です。
// +build
: これはGoのビルドタグを示す特別なコメントプレフィックスです。darwin freebsd linux netbsd openbsd windows
: これらのキーワードは、Goがサポートするオペレーティングシステムの識別子です。
この行が signal.go
と signal_test.go
の両ファイルの先頭に追加されたことで、Goのビルドツール(go build
など)は、これらのファイルが指定されたオペレーティングシステム(macOS、FreeBSD、Linux、NetBSD、OpenBSD、Windows)のいずれかをターゲットとする場合にのみ、コンパイル対象に含めるようになります。
もしビルドターゲットがこれらのリストに含まれていない場合(このコミットの文脈ではPlan 9が該当)、Goツールチェーンはこれらのファイルを無視し、コンパイルプロセスから除外します。これにより、Plan 9のようなシグナル処理のメカニズムが異なるシステムで、os/signal
パッケージのコードが不適切にコンパイルされることを防ぎ、ビルドエラーを回避します。
この変更は、Go言語が多様なプラットフォームをサポートする上で、プラットフォーム固有のコードを適切に管理するための基本的な手法を示しています。
関連リンク
- Go Code Review: https://golang.org/cl/5503057
参考にした情報源リンク
- Go Command Documentation: Build constraints: https://pkg.go.dev/cmd/go#hdr-Build_constraints
- Plan 9 from Bell Labs: https://9p.io/plan9/
- Wikipedia: POSIX Signals: https://en.wikipedia.org/wiki/Signal_(IPC)
- Go os/signal package documentation (general): https://pkg.go.dev/os/signal
- Web search results for "Go os/signal Plan 9" (used for background context on Plan 9 signal handling in Go's early days).