[インデックス 16499] ファイルの概要
このコミットは、Go言語のテストスイートにおける特定の変更を元に戻すものです。具体的には、test/sigchld.go
ファイルのビルドタグを修正し、以前の変更(CL 10017045 / 6ec8c49421a0)によって導入された問題を解決します。この問題は、テストが適切にテストされていなかったこと、およびWindows環境でテストが壊れることが原因でした。
コミット
- コミットハッシュ:
63a707e35424dfa0e4d1dffb8b22099a8d54c9f2
- 作者: Brad Fitzpatrick bradfitz@golang.org
- コミット日時: 2013年6月4日 火曜日 21:51:22 -0700
- コミットメッセージ:
undo CL 10017045 / 6ec8c49421a0 It was never tested and also breaks Windows. run.go doesn't yet support the proper !windows,!plan9 syntax. ««« original CL description test: do not run SIGCHLD test on Plan 9 R=golang-dev, bradfitz CC=golang-dev https://golang.org/cl/10017045 »»» R=golang-dev, dave CC=golang-dev https://golang.org/cl/10024044
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/63a707e35424dfa0e4d1dffb8b22099a8d54c9f2
元コミット内容
このコミットが元に戻した元の変更(CL 10017045 / 6ec8c49421a0)の目的は、「test: do not run SIGCHLD test on Plan 9」と記載されています。これは、SIGCHLD
に関連するテストをPlan 9オペレーティングシステムでは実行しないようにするためのものでした。
変更の背景
このコミットが行われた背景には、以下の2つの主要な問題がありました。
- テスト不足とWindowsでの破損: 元の変更(CL 10017045)は、適切にテストされないままマージされたため、Windows環境で
sigchld.go
テストが正しく動作しないという問題を引き起こしました。Goのテストスイートは様々なプラットフォームで実行されるため、特定のプラットフォームでテストが失敗することは許容されません。 run.go
のビルドタグ構文の制限: Goのテストランナーであるrun.go
が、!windows,!plan9
のような複数の否定条件を含むビルドタグ構文を当時まだ適切にサポートしていなかったことが挙げられます。これにより、test/sigchld.go
ファイルに// +build !windows !plan9
というビルドタグが追加された際に、run.go
がその意図を正しく解釈できず、結果としてWindowsでテストが実行されてしまい、問題が発生しました。
これらの問題に対処するため、元の変更を元に戻すことが決定されました。
前提知識の解説
1. Goのビルドタグ(Build Tags)
Go言語では、ソースコードファイルの先頭に// +build
ディレクティブを記述することで、特定の条件に基づいてファイルをコンパイルに含めるか除外するかを制御できます。これは、異なるオペレーティングシステム(OS)やアーキテクチャ、または特定のビルド設定に応じてコードを切り替える際に非常に有用です。
- 構文:
// +build tag1,tag2 !tag3
- カンマ(
,
)は論理OR (||
) を意味します。tag1
またはtag2
のいずれかが有効な場合にファイルがコンパイルされます。 - スペースは論理AND (
&&
) を意味します。tag1
とtag2
の両方が有効な場合にファイルがコンパイルされます。 - 感嘆符(
!
)は否定を意味します。!tag3
はtag3
が有効でない場合にコンパイルされます。
- カンマ(
- 一般的なタグ:
linux
,windows
,darwin
(macOS),freebsd
,plan9
,amd64
,arm
,go1.x
などがあります。 - 例:
// +build linux darwin
: LinuxまたはmacOSでのみコンパイル。// +build go1.18,amd64
: Go 1.18以上かつAMD64アーキテクチャでのみコンパイル。// +build !windows
: Windows以外のOSでのみコンパイル。
2. SIGCHLD
シグナル
SIGCHLD
は、Unix系オペレーティングシステムにおいて、子プロセスが終了したとき、または停止・再開したときに親プロセスに送信されるシグナルです。親プロセスは通常、このシグナルを捕捉して、終了した子プロセスのステータスをwait()
システムコールなどで回収します。これにより、ゾンビプロセス(終了したが親にステータスが回収されていないプロセス)の発生を防ぎます。
WindowsにはSIGCHLD
に直接対応する概念はありません。Windowsのプロセス管理は、イベントやスレッド、ジョブオブジェクトなど、Unix系とは異なるメカニズムに基づいています。そのため、SIGCHLD
に依存するテストは、Windowsでは適切に動作しないか、意味をなさない場合があります。
3. run.go
とGoのテストインフラ
run.go
は、Goの標準ライブラリのテストスイートを実行するための内部ツールです。Goのテストは、go test
コマンドによって実行されますが、その裏側ではrun.go
のようなツールが、テストファイルの発見、ビルドタグの解釈、テストの実行、結果の集計などを行っています。
特に、run.go
はビルドタグを解釈し、特定のプラットフォームで実行すべきでないテストファイルをスキップする役割を担っています。このコミットの背景にある問題は、run.go
が当時の実装では!windows,!plan9
のような複雑な否定条件を正しく処理できなかったことに起因します。
技術的詳細
このコミットの技術的な核心は、test/sigchld.go
ファイルのビルドタグの変更です。
- 変更前:
// +build !windows !plan9
- 変更後:
// +build !windows
この変更がもたらす影響は以下の通りです。
-
!windows !plan9
の解釈:- このタグは、「Windowsでもなく、かつPlan 9でもない」場合にこのファイルをコンパイルするという意味です。
- しかし、コミットメッセージにあるように、当時の
run.go
はこの構文を正しく解釈できませんでした。特に、複数の否定条件がスペースで区切られている場合(論理AND)、その解釈に問題があったと考えられます。 - 結果として、Windows環境でもこのファイルがコンパイル対象と誤って判断され、
SIGCHLD
に依存するテストが実行されてしまい、WindowsではSIGCHLD
が存在しないためテストが失敗していました。
-
!windows
の解釈:- このタグは、「Windowsではない」場合にこのファイルをコンパイルするという意味です。
- これはより単純な条件であり、
run.go
が正しく解釈できる構文でした。 - この変更により、
sigchld.go
テストはWindowsではコンパイルされなくなり、Windowsでのテスト失敗の問題が解決されます。
-
Plan 9への影響:
- 元の変更(CL 10017045)の意図は「Plan 9で
SIGCHLD
テストを実行しない」ことでした。 - しかし、このコミットで
!plan9
タグが削除されたため、sigchld.go
はPlan 9でもコンパイルされるようになります。 - これは、元の変更の意図とは逆の動作ですが、コミットメッセージには「It was never tested and also breaks Windows.」とあり、Windowsでの問題を優先的に解決する必要があったことが示唆されます。また、「run.go doesn't yet support the proper !windows,!plan9 syntax.」という記述から、当時のGoのテストインフラの制約により、Plan 9でのテストスキップを正しく実装することが困難であったことが伺えます。
- 元の変更(CL 10017045)の意図は「Plan 9で
このコミットは、特定のプラットフォームでのテストの安定性を確保するために、一時的に元の変更の意図の一部を犠牲にした、実用的な解決策であったと言えます。
コアとなるコードの変更箇所
変更はtest/sigchld.go
ファイルの一行のみです。
--- a/test/sigchld.go
+++ b/test/sigchld.go
@@ -1,4 +1,4 @@
-// +build !windows !plan9
+// +build !windows
// cmpout
// Copyright 2009 The Go Authors. All rights reserved.
コアとなるコードの解説
test/sigchld.go
ファイルの先頭にあるビルドタグが、// +build !windows !plan9
から// +build !windows
に変更されています。
-
変更前 (
// +build !windows !plan9
):- この行は、このGoソースファイルがWindowsオペレーティングシステムでもなく、かつPlan 9オペレーティングシステムでもない場合にのみコンパイルされるべきであることを示していました。
- しかし、前述の通り、当時の
run.go
テストランナーはこの複雑な否定条件を正しく処理できず、Windows環境で誤ってこのファイルをコンパイルしようとしていました。SIGCHLD
シグナルはUnix系OS特有のものであり、Windowsには存在しないため、Windowsでこのテストが実行されるとビルドエラーやランタイムエラーが発生していました。
-
変更後 (
// +build !windows
):- この行は、このGoソースファイルがWindowsオペレーティングシステムではない場合にのみコンパイルされるべきであることを示します。
- これにより、Windows環境では確実にこのファイルがコンパイル対象から除外されるようになり、Windowsでのテスト失敗の問題が解決されました。
- Plan 9に関しては、元の変更の意図(Plan 9でテストを実行しない)は一時的に無視される形になりますが、Windowsでのテストの安定性確保が優先されました。これは、当時の
run.go
のビルドタグ解釈の限界によるものです。
この変更は、Goのテストインフラの成熟度と、異なるプラットフォームでの互換性を確保するための継続的な努力を示しています。
関連リンク
- Go言語のビルド制約(Build Constraints)に関する公式ドキュメント:
- 元の変更(CL 10017045)のGo Gerritページ:
- このコミット(CL 10024044)のGo Gerritページ:
参考にした情報源リンク
- Go言語の公式ドキュメント
- Go言語のソースコードリポジトリ
SIGCHLD
シグナルに関する一般的なUnix/Linuxプログラミングの知識- Windowsのプロセス管理に関する一般的な知識
- https://github.com/golang/go/commit/63a707e35424dfa0e4d1dffb8b22099a8d54c9f2
- https://golang.org/cl/10017045
- https://golang.org/cl/10024044
- https://pkg.go.dev/cmd/go#hdr-Build_constraints