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

[インデックス 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.gosignal_test.go の両ファイルを、指定されたオペレーティングシステム(macOS、FreeBSD、Linux、NetBSD、OpenBSD、Windows)のいずれかをターゲットとするビルドでのみ含めるように指示します。

これにより、GoツールチェーンがPlan 9をターゲットとしてビルドを実行する場合、これらのファイルはビルドプロセスから自動的に除外されます。結果として、Plan 9固有のシグナル処理の実装がないにもかかわらず、os/signal パッケージが原因でビルドが失敗するのを防ぎ、Goの標準ライブラリ全体のビルドを成功させることができます。

これは、クロスプラットフォーム開発において、特定のプラットフォームに依存するコードを適切に分離し、ビルドエラーを防ぐための一般的なプラクティスです。

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

このコミットでは、以下の2つのファイルの先頭にビルドタグが追加されました。

  1. src/pkg/os/signal/signal.go
  2. 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.gosignal_test.go の両ファイルの先頭に追加されたことで、Goのビルドツール(go build など)は、これらのファイルが指定されたオペレーティングシステム(macOS、FreeBSD、Linux、NetBSD、OpenBSD、Windows)のいずれかをターゲットとする場合にのみ、コンパイル対象に含めるようになります。

もしビルドターゲットがこれらのリストに含まれていない場合(このコミットの文脈ではPlan 9が該当)、Goツールチェーンはこれらのファイルを無視し、コンパイルプロセスから除外します。これにより、Plan 9のようなシグナル処理のメカニズムが異なるシステムで、os/signal パッケージのコードが不適切にコンパイルされることを防ぎ、ビルドエラーを回避します。

この変更は、Go言語が多様なプラットフォームをサポートする上で、プラットフォーム固有のコードを適切に管理するための基本的な手法を示しています。

関連リンク

参考にした情報源リンク