[インデックス 14292] ファイルの概要
このコミットは、Go言語のビルドシステムにおいて、CGOが無効な環境ではデータ競合検出(Race Detector)テストを実行しないようにする変更を導入しています。これにより、CGOに依存するRace Detectorが正しく機能しない環境でのテストの誤検出や失敗を防ぎ、ビルドプロセスの信頼性を向上させます。
コミット
commit 8fadb70cf8d8a2a10673cdcb1441104ce2e437cf
Author: Russ Cox <rsc@golang.org>
Date: Thu Nov 1 15:13:00 2012 -0400
build: do not run race tests with cgo disabled
R=dvyukov
CC=golang-dev
https://golang.org/cl/6810067
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/8fadb70cf8d8a2a10673cdcb1441104ce2e437cf
元コミット内容
commit 8fadb70cf8d8a2a10673cdcb1441104ce2e437cf
Author: Russ Cox <rsc@golang.org>
Date: Thu Nov 1 15:13:00 2012 -0400
build: do not run race tests with cgo disabled
R=dvyukov
CC=golang-dev
https://golang.org/cl/6810067
---
src/run.bash | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)\n
diff --git a/src/run.bash b/src/run.bash
index 7fdd637d99..0de36feca4 100755
--- a/src/run.bash
+++ b/src/run.bash
@@ -46,8 +46,8 @@ echo
echo '# sync -cpu=10'
go test sync -short -timeout=120s -cpu=10
-case "$GOHOSTOS-$GOOS-$GOARCH" in
-linux-linux-amd64 | darwin-darwin-amd64)\
+case "$GOHOSTOS-$GOOS-$GOARCH-$CGO_ENABLED" in
+linux-linux-amd64-1 | darwin-darwin-amd64-1)\
echo
echo '# Testing race detector.'
go test -race -i flag
変更の背景
Go言語のデータ競合検出器(Race Detector)は、並行処理におけるデータ競合を検出するための強力なツールです。しかし、このRace Detectorは内部的にCGO(GoとC言語の相互運用機能)に依存しています。CGOが有効になっていない環境(例えば、CGO_ENABLED=0
でビルドされた場合)でRace Detectorを有効にしたテストを実行しようとすると、正しく機能しないか、ビルドエラーやランタイムエラーを引き起こす可能性があります。
このコミットが行われた背景には、Goのビルドおよびテストインフラストラクチャの堅牢性を高める目的があります。特定の環境設定(CGO無効)下でRace Detectorテストが不必要に実行され、その結果として誤った失敗やリソースの無駄が発生するのを防ぐため、この条件分岐が導入されました。これにより、テストスイートの実行がより効率的かつ正確になります。
前提知識の解説
Go Race Detector (データ競合検出器)
Go Race Detectorは、Goプログラム内のデータ競合を検出するためにGoランタイムに組み込まれたツールです。データ競合は、複数のゴルーチンが同時に同じメモリ位置にアクセスし、少なくとも1つのアクセスが書き込みであり、かつそれらのアクセスが同期メカニズムによって順序付けされていない場合に発生します。データ競合は、予測不能なプログラムの動作やバグの一般的な原因となります。
Race Detectorは、プログラムの実行中にメモリアクセスを監視し、競合のパターンを検出すると警告を出力します。Goのテストコマンドに-race
フラグを追加することで有効にできます(例: go test -race ./...
)。
CGO
CGOは、GoプログラムからC言語のコードを呼び出したり、C言語のコードからGoの関数を呼び出したりするためのGoの機能です。Goは通常、純粋なGoコードで記述されますが、既存のCライブラリを利用したり、特定のプラットフォーム固有の機能にアクセスしたりする必要がある場合にCGOが使用されます。
CGOを有効にするには、環境変数CGO_ENABLED
を1
に設定します(デフォルトは1
)。無効にするには0
に設定します。CGOを無効にすると、GoコンパイラはCGOのコードをコンパイルせず、純粋なGoコードのみを扱います。Race Detectorは、その実装の一部でCGOを利用しているため、CGOが無効な環境では機能しません。
src/run.bash
スクリプト
src/run.bash
は、Goプロジェクトのテストスイートを実行するためのシェルスクリプトです。Goの標準ライブラリやツールのテストは、このスクリプトを通じて実行されることが多く、様々な環境変数やビルド設定に応じてテストの挙動を制御します。このスクリプトは、GoのCI/CDパイプラインや開発者のローカル環境でのテスト実行において重要な役割を果たします。
技術的詳細
このコミットの技術的な核心は、src/run.bash
スクリプト内の条件分岐の変更にあります。以前は、Race Detectorテストの実行条件が$GOHOSTOS-$GOOS-$GOARCH
(ホストOS-ターゲットOS-ターゲットアーキテクチャ)の組み合わせのみに基づいていました。これは、特定のプラットフォーム(例: linux-linux-amd64
やdarwin-darwin-amd64
)でのみRace Detectorテストを実行するという意図でした。
しかし、この条件だけでは、これらのプラットフォームであってもCGO_ENABLED=0
が設定されている場合にRace Detectorテストが実行されてしまうという問題がありました。Race DetectorはCGOに依存しているため、CGOが無効な状態でテストを実行しても意味がなく、むしろエラーを引き起こす可能性がありました。
この変更では、case
文のパターンに-$CGO_ENABLED
を追加し、さらにlinux-linux-amd64-1
やdarwin-darwin-amd64-1
のように、CGO_ENABLED
が1
(有効)であることも条件に含めるようにしました。これにより、Race Detectorテストは、対象のプラットフォームであり、かつCGOが明示的に有効になっている場合にのみ実行されるようになります。
この修正は、Goのビルドシステムがより賢く、環境設定に応じて適切なテストのみを実行するようにするための重要な改善です。
コアとなるコードの変更箇所
--- a/src/run.bash
+++ b/src/run.bash
@@ -46,8 +46,8 @@ echo
echo '# sync -cpu=10'
go test sync -short -timeout=120s -cpu=10
-case "$GOHOSTOS-$GOOS-$GOARCH" in
-linux-linux-amd64 | darwin-darwin-amd64)\
+case "$GOHOSTOS-$GOOS-$GOARCH-$CGO_ENABLED" in
+linux-linux-amd64-1 | darwin-darwin-amd64-1)\
echo
echo '# Testing race detector.'
go test -race -i flag
コアとなるコードの解説
変更はsrc/run.bash
ファイル内のcase
文にあります。
変更前:
case "$GOHOSTOS-$GOOS-$GOARCH" in
linux-linux-amd64 | darwin-darwin-amd64)
echo
echo '# Testing race detector.'
go test -race -i flag
このコードでは、$GOHOSTOS
(ビルドホストのOS)、$GOOS
(ターゲットOS)、$GOARCH
(ターゲットアーキテクチャ)の組み合わせがlinux-linux-amd64
またはdarwin-darwin-amd64
である場合に、Race Detectorテスト(go test -race -i flag
)が実行されていました。
変更後:
case "$GOHOSTOS-$GOOS-$GOARCH-$CGO_ENABLED" in
linux-linux-amd64-1 | darwin-darwin-amd64-1)
echo
echo '# Testing race detector.'
go test -race -i flag
変更後では、case
文の評価対象の文字列に-$CGO_ENABLED
が追加されました。CGO_ENABLED
はCGOが有効な場合は1
、無効な場合は0
となる環境変数です。
これにより、パターンマッチングはlinux-linux-amd64-1
またはdarwin-darwin-amd64-1
に対して行われるようになりました。つまり、Race Detectorテストは、以下の両方の条件が満たされた場合にのみ実行されます。
- プラットフォームが
linux-linux-amd64
またはdarwin-darwin-amd64
である。 CGO_ENABLED
が1
(CGOが有効)である。
この修正により、CGOが無効な環境ではRace Detectorテストがスキップされるようになり、テストの実行がより適切かつ効率的になりました。
関連リンク
- Go言語公式ドキュメント - The Go Race Detector: https://go.dev/doc/articles/race_detector
- Go言語公式ドキュメント - Cgo: https://go.dev/blog/cgo
参考にした情報源リンク
- 上記のGo言語公式ドキュメント
- コミットメッセージとdiffの内容
- Go言語のビルドシステムとテストに関する一般的な知識
- シェルスクリプト(bash)の
case
文に関する知識 - Goの環境変数に関する知識
[インデックス 14292] ファイルの概要
このコミットは、Go言語のビルドシステムにおいて、CGOが無効な環境ではデータ競合検出(Race Detector)テストを実行しないようにする変更を導入しています。これにより、CGOに依存するRace Detectorが正しく機能しない環境でのテストの誤検出や失敗を防ぎ、ビルドプロセスの信頼性を向上させます。
コミット
commit 8fadb70cf8d8a2a10673cdcb1441104ce2e437cf
Author: Russ Cox <rsc@golang.org>
Date: Thu Nov 1 15:13:00 2012 -0400
build: do not run race tests with cgo disabled
R=dvyukov
CC=golang-dev
https://golang.org/cl/6810067
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/8fadb70cf8d8a2a10673cdcb1441104ce2e437cf
元コミット内容
commit 8fadb70cf8d8a2a10673cdcb1441104ce2e437cf
Author: Russ Cox <rsc@golang.org>
Date: Thu Nov 1 15:13:00 2012 -0400
build: do not run race tests with cgo disabled
R=dvyukov
CC=golang-dev
https://golang.org/cl/6810067
---
src/run.bash | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)\n
diff --git a/src/run.bash b/src/run.bash
index 7fdd637d99..0de36feca4 100755
--- a/src/run.bash
+++ b/src/run.bash
@@ -46,8 +46,8 @@ echo
echo '# sync -cpu=10'
go test sync -short -timeout=120s -cpu=10
-case "$GOHOSTOS-$GOOS-$GOARCH" in
-linux-linux-amd64 | darwin-darwin-amd64)\
+case "$GOHOSTOS-$GOOS-$GOARCH-$CGO_ENABLED" in
+linux-linux-amd64-1 | darwin-darwin-amd64-1)\
echo
echo '# Testing race detector.'
go test -race -i flag
変更の背景
Go言語のデータ競合検出器(Race Detector)は、並行処理におけるデータ競合を検出するための強力なツールです。しかし、このRace Detectorは内部的にCGO(GoとC言語の相互運用機能)に依存しています。具体的には、Race DetectorはC/C++のThreadSanitizerランタイムライブラリを基盤としており、このライブラリの利用にはCGOが必須となります。
CGOが有効になっていない環境(例えば、CGO_ENABLED=0
でビルドされた場合)でRace Detectorを有効にしたテストを実行しようとすると、正しく機能しないか、ビルドエラーやランタイムエラーを引き起こす可能性があります。実際、CGO_ENABLED
が0
の状態で-race
フラグを付けてビルドしようとするとエラーが発生します。
このコミットが行われた背景には、Goのビルドおよびテストインフラストラクチャの堅牢性を高める目的があります。特定の環境設定(CGO無効)下でRace Detectorテストが不必要に実行され、その結果として誤った失敗やリソースの無駄が発生するのを防ぐため、この条件分岐が導入されました。これにより、テストスイートの実行がより効率的かつ正確になります。
前提知識の解説
Go Race Detector (データ競合検出器)
Go Race Detectorは、Goプログラム内のデータ競合を検出するためにGoランタイムに組み込まれたツールです。データ競合は、複数のゴルーチンが同時に同じメモリ位置にアクセスし、少なくとも1つのアクセスが書き込みであり、かつそれらのアクセスが同期メカニズムによって順序付けされていない場合に発生します。データ競合は、予測不能なプログラムの動作やバグの一般的な原因となります。
Race Detectorは、プログラムの実行中にメモリアクセスを監視し、競合のパターンを検出すると警告を出力します。Goのテストコマンドに-race
フラグを追加することで有効にできます(例: go test -race ./...
)。
CGO
CGOは、GoプログラムからC言語のコードを呼び出したり、C言語のコードからGoの関数を呼び出したりするためのGoの機能です。Goは通常、純粋なGoコードで記述されますが、既存のCライブラリを利用したり、特定のプラットフォーム固有の機能にアクセスしたりする必要がある場合にCGOが使用されます。
CGOを有効にするには、環境変数CGO_ENABLED
を1
に設定します(デフォルトは1
)。無効にするには0
に設定します。CGOを無効にすると、GoコンパイラはCGOのコードをコンパイルせず、純粋なGoコードのみを扱います。Race Detectorは、その実装の一部でCGOを利用しているため、CGOが無効な環境では機能しません。ほとんどのオペレーティングシステム(Linux、Windows、その他のUnix系システム)では、Race Detectorを機能させるためにCコンパイラがインストールされている必要があります。ただし、Go 1.20以降のmacOSでは、Race DetectorがCGOの依存関係を排除するように書き直されたため、XcodeやCGOを有効にすることなくRace Detectorを有効にしたプログラムをビルドおよび実行できます。
src/run.bash
スクリプト
src/run.bash
は、Goプロジェクトのテストスイートを実行するためのシェルスクリプトです。Goの標準ライブラリやツールのテストは、このスクリプトを通じて実行されることが多く、様々な環境変数やビルド設定に応じてテストの挙動を制御します。このスクリプトは、GoのCI/CDパイプラインや開発者のローカル環境でのテスト実行において重要な役割を果たします。
技術的詳細
このコミットの技術的な核心は、src/run.bash
スクリプト内の条件分岐の変更にあります。以前は、Race Detectorテストの実行条件が$GOHOSTOS-$GOOS-$GOARCH
(ホストOS-ターゲットOS-ターゲットアーキテクチャ)の組み合わせのみに基づいていました。これは、特定のプラットフォーム(例: linux-linux-amd64
やdarwin-darwin-amd64
)でのみRace Detectorテストを実行するという意図でした。
しかし、この条件だけでは、これらのプラットフォームであってもCGO_ENABLED=0
が設定されている場合にRace Detectorテストが実行されてしまうという問題がありました。Race DetectorはCGOに依存しているため、CGOが無効な状態でテストを実行しても意味がなく、むしろエラーを引き起こす可能性がありました。
この変更では、case
文のパターンに-$CGO_ENABLED
を追加し、さらにlinux-linux-amd64-1
やdarwin-darwin-amd64-1
のように、CGO_ENABLED
が1
(有効)であることも条件に含めるようにしました。これにより、Race Detectorテストは、対象のプラットフォームであり、かつCGOが明示的に有効になっている場合にのみ実行されるようになります。
この修正は、Goのビルドシステムがより賢く、環境設定に応じて適切なテストのみを実行するようにするための重要な改善です。
コアとなるコードの変更箇所
--- a/src/run.bash
+++ b/src/run.bash
@@ -46,8 +46,8 @@ echo
echo '# sync -cpu=10'
go test sync -short -timeout=120s -cpu=10
-case "$GOHOSTOS-$GOOS-$GOARCH" in
-linux-linux-amd64 | darwin-darwin-amd64)\
+case "$GOHOSTOS-$GOOS-$GOARCH-$CGO_ENABLED" in
+linux-linux-amd64-1 | darwin-darwin-amd64-1)\
echo
echo '# Testing race detector.'
go test -race -i flag
コアとなるコードの解説
変更はsrc/run.bash
ファイル内のcase
文にあります。
変更前:
case "$GOHOSTOS-$GOOS-$GOARCH" in
linux-linux-amd64 | darwin-darwin-amd64)
echo
echo '# Testing race detector.'
go test -race -i flag
このコードでは、$GOHOSTOS
(ビルドホストのOS)、$GOOS
(ターゲットOS)、$GOARCH
(ターゲットアーキテクチャ)の組み合わせがlinux-linux-amd64
またはdarwin-darwin-amd64
である場合に、Race Detectorテスト(go test -race -i flag
)が実行されていました。
変更後:
case "$GOHOSTOS-$GOOS-$GOARCH-$CGO_ENABLED" in
linux-linux-amd64-1 | darwin-darwin-amd64-1)
echo
echo '# Testing race detector.'
go test -race -i flag
変更後では、case
文の評価対象の文字列に-$CGO_ENABLED
が追加されました。CGO_ENABLED
はCGOが有効な場合は1
、無効な場合は0
となる環境変数です。
これにより、パターンマッチングはlinux-linux-amd64-1
またはdarwin-darwin-amd64-1
に対して行われるようになりました。つまり、Race Detectorテストは、以下の両方の条件が満たされた場合にのみ実行されます。
- プラットフォームが
linux-linux-amd64
またはdarwin-darwin-amd64
である。 CGO_ENABLED
が1
(CGOが有効)である。
この修正により、CGOが無効な環境ではRace Detectorテストがスキップされるようになり、テストの実行がより適切かつ効率的になりました。
関連リンク
- Go言語公式ドキュメント - The Go Race Detector: https://go.dev/doc/articles/race_detector
- Go言語公式ドキュメント - Cgo: https://go.dev/blog/cgo
参考にした情報源リンク
- 上記のGo言語公式ドキュメント
- コミットメッセージとdiffの内容
- Go言語のビルドシステムとテストに関する一般的な知識
- シェルスクリプト(bash)の
case
文に関する知識 - Goの環境変数に関する知識
- Web検索結果: "Go race detector CGO dependency"