[インデックス 10749] ファイルの概要
このコミットは、Go言語のビルドシステムにおいて、Windows/amd64環境でのCGO(C言語との連携機能)を無効化する変更を導入したものです。これは、当時のWindows/amd64環境におけるCGOの既知の不具合が、Goダッシュボード(継続的インテグレーションシステム)上での他の問題の検出を妨げていたため、一時的な措置として行われました。
コミット
- コミットハッシュ:
969b71d906f4ee6b438bc051dc7fff98f4fa503c
- Author: Russ Cox rsc@golang.org
- Date: Tue Dec 13 14:20:38 2011 -0500
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/969b71d906f4ee6b438bc051dc7fff98f4fa503c
元コミット内容
build: disable cgo on Windows/amd64
Apparently it is broken. Disable so that dashboard
will let us see other breakages on Windows.
R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/5477081
変更の背景
この変更が行われた2011年当時、Go言語はまだ比較的新しい言語であり、様々なプラットフォームへの対応が進行中でした。特にWindows環境は、Unix系システムとは異なる特性を持つため、ビルドシステムやC言語との連携(CGO)において特有の問題が発生することがありました。
コミットメッセージによると、当時のWindows/amd64環境におけるCGOには「壊れている」("broken")と認識される問題が存在していました。この問題が原因で、Goプロジェクトの継続的インテグレーションシステムである「ダッシュボード」において、Windows環境での他の潜在的なバグやビルドの失敗がCGOの問題に隠れてしまい、適切に検出・報告できない状況にありました。
開発チームは、CGOの問題を修正するまでの間、他の重要な問題の発見を優先するため、一時的にWindows/amd64環境でのCGOを無効化するという判断を下しました。これにより、CGOに起因しないビルドの失敗やテストの不合格がダッシュボード上で明確になり、開発者がそれらの問題に集中して取り組めるようにすることが目的でした。
前提知識の解説
CGO (C Go)
CGOは、GoプログラムからC言語のコードを呼び出したり、C言語のコードからGoの関数を呼び出したりするためのGo言語の機能です。これにより、既存のCライブラリをGoプロジェクトで再利用したり、パフォーマンスが重要な部分をC言語で記述したりすることが可能になります。CGOを使用するには、Goのビルドプロセス中にCコンパイラ(通常はGCCやClang)が必要となります。
GOOS
と GOARCH
Go言語のビルドシステムでは、環境変数の GOOS
と GOARCH
を用いて、ターゲットとなるオペレーティングシステムとアーキテクチャを指定します。
GOOS
: ターゲットOS(例:linux
,windows
,darwin
(macOS),freebsd
,netbsd
など)GOARCH
: ターゲットアーキテクチャ(例:amd64
,386
,arm
,arm64
など)
これらの変数を組み合わせることで、特定のプラットフォーム向けにGoプログラムをクロスコンパイルすることができます。例えば、GOOS=windows GOARCH=amd64
は、64ビットWindows向けの実行ファイルをビルドすることを意味します。
Make.inc
Make.inc
は、Goプロジェクトのビルドシステムで使用されるMakefileのインクルードファイルです。Goプロジェクトは、初期の段階ではUnix系の make
ツールを広範に利用してビルドプロセスを管理していました。Make.inc
には、ビルドに関する共通の設定や変数が定義されており、Makefile
から読み込まれることで、ビルドの挙動を制御します。このファイルは、特定のOSやアーキテクチャに応じたビルド設定を調整するためによく使われます。
CGO_ENABLED
CGO_ENABLED
は、Goのビルドシステムにおける重要な環境変数(またはMakefile変数)です。この変数が 1
に設定されている場合、CGOが有効になり、GoコンパイラはC言語のコードをリンクしようとします。0
に設定されている場合、CGOは無効になり、GoコンパイラはC言語のコードをリンクせず、純粋なGoコードのみでビルドを行います。CGOを無効にすることで、Cコンパイラがインストールされていない環境でもGoプログラムをビルドできるようになりますが、CGOに依存する機能は利用できなくなります。
技術的詳細
このコミットは、Go言語のビルドシステムの中核部分である src/Make.inc
ファイルを変更しています。具体的には、CGO_ENABLED
変数の設定ロジックに新たな条件を追加しています。
既存の Make.inc
では、既にNetBSD環境 (GOOS=netbsd
) でCGOを無効化する設定がありました。これは、NetBSD環境でもCGOに何らかの問題があったか、あるいはサポートが不十分であったためと考えられます。
今回の変更では、この既存の条件に加えて、GOOS
が windows
であり、かつ GOARCH
が amd64
である場合に、CGO_ENABLED
を 0
に設定する行が追加されました。
ifeq ($(GOOS)$(GOARCH),windowsamd64) # ... and not on Windows/amd64
CGO_ENABLED:=0
endif
この ifeq
ディレクティブは、GOOS
と GOARCH
の値を連結した文字列が windowsamd64
と完全に一致する場合に、そのブロック内のコマンドを実行するという意味です。:=
は、Makefileにおける変数の即時展開代入であり、変数が定義された時点で評価されます。
この変更により、GoのビルドプロセスがWindows/amd64環境で実行される際、CGO機能が強制的に無効化されます。結果として、CGOに依存するGoパッケージやプログラムは、この環境ではビルドできなくなります。これは、前述の通り、当時のWindows/amd64環境におけるCGOの不安定性に対処するための、実用的な回避策でした。
コアとなるコードの変更箇所
--- a/src/Make.inc
+++ b/src/Make.inc
@@ -142,6 +142,9 @@ endif
ifeq ($(GOOS),netbsd) # ... and not on NetBSD
CGO_ENABLED:=0
endif
+ifeq ($(GOOS)$(GOARCH),windowsamd64) # ... and not on Windows/amd64
+CGO_ENABLED:=0
+endif
endif
# Make environment more standard.
コアとなるコードの解説
変更は src/Make.inc
ファイルの142行目付近にあります。
ifeq ($(GOOS),netbsd)
ブロックの直後に新しいifeq
ブロックが追加されています。- 追加された行は
ifeq ($(GOOS)$(GOARCH),windowsamd64)
です。これは、GOOS
変数の値とGOARCH
変数の値を連結した文字列が"windowsamd64"
と等しいかどうかをチェックする条件式です。- 例えば、
GOOS
がwindows
でGOARCH
がamd64
の場合、$(GOOS)$(GOARCH)
はwindowsamd64
となり、条件が真となります。
- 例えば、
- この条件が真の場合、次の行
CGO_ENABLED:=0
が実行されます。これにより、CGO機能がビルドプロセス全体で無効化されます。 - コメント
# ... and not on Windows/amd64
は、このコードブロックの目的を明確に示しています。
この変更は、Goのビルドシステムが特定のプラットフォーム(この場合はWindows/amd64)でCGOを強制的に無効にするための、シンプルかつ効果的なメカニズムを提供しています。これにより、CGOの不具合が他のビルド問題の診断を妨げることを防ぎ、開発チームがより重要な問題に集中できるようになりました。
関連リンク
- Go CL (Code Review) へのリンク: https://golang.org/cl/5477081
参考にした情報源リンク
- コミットメッセージの内容
- Go言語のビルドシステムに関する一般的な知識
- Makefileの構文に関する一般的な知識
- CGOに関するGo言語のドキュメント(一般的な情報源として)
GOOS
およびGOARCH
環境変数に関するGo言語のドキュメント(一般的な情報源として)- Go言語の初期の歴史とWindowsサポートに関する情報(一般的な情報源として)# [インデックス 10749] ファイルの概要
このコミットは、Go言語のビルドシステムにおいて、Windows/amd64環境でのCGO(C言語との連携機能)を無効化する変更を導入したものです。これは、当時のWindows/amd64環境におけるCGOの既知の不具合が、Goダッシュボード(継続的インテグレーションシステム)上での他の問題の検出を妨げていたため、一時的な措置として行われました。
コミット
- コミットハッシュ:
969b71d906f4ee6b438bc051dc7fff98f4fa503c
- Author: Russ Cox rsc@golang.org
- Date: Tue Dec 13 14:20:38 2011 -0500
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/969b71d906f4ee6b438bc051dc7fff98f4fa503c
元コミット内容
build: disable cgo on Windows/amd64
Apparently it is broken. Disable so that dashboard
will let us see other breakages on Windows.
R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/5477081
変更の背景
この変更が行われた2011年当時、Go言語はまだ比較的新しい言語であり、様々なプラットフォームへの対応が進行中でした。特にWindows環境は、Unix系システムとは異なる特性を持つため、ビルドシステムやC言語との連携(CGO)において特有の問題が発生することがありました。
コミットメッセージによると、当時のWindows/amd64環境におけるCGOには「壊れている」("broken")と認識される問題が存在していました。この問題が原因で、Goプロジェクトの継続的インテグレーションシステムである「ダッシュボード」において、Windows環境での他の潜在的なバグやビルドの失敗がCGOの問題に隠れてしまい、適切に検出・報告できない状況にありました。
Web検索の結果からも、2011年後半にはWindows/amd64環境でのCGOが「壊れている」と認識されており、このコミットがその問題を回避するために提出されたことが裏付けられています。2012年初頭の議論では、__chkstk
や _assert
といったシンボルの欠落、MinGW GCCコンパイラとの関連性など、Windows上でのCGOの課題がさらに浮き彫りになっています。
開発チームは、CGOの問題を修正するまでの間、他の重要な問題の発見を優先するため、一時的にWindows/amd64環境でのCGOを無効化するという判断を下しました。これにより、CGOに起因しないビルドの失敗やテストの不合格がダッシュボード上で明確になり、開発者がそれらの問題に集中して取り組めるようにすることが目的でした。
前提知識の解説
CGO (C Go)
CGOは、GoプログラムからC言語のコードを呼び出したり、C言語のコードからGoの関数を呼び出したりするためのGo言語の機能です。これにより、既存のCライブラリをGoプロジェクトで再利用したり、パフォーマンスが重要な部分をC言語で記述したりすることが可能になります。CGOを使用するには、Goのビルドプロセス中にCコンパイラ(通常はGCCやClang、WindowsではMinGWやTDM-GCCなど)が必要となります。CGOは、GoとCの間のインターフェースを提供しますが、その性質上、ビルド時間の増加やクロスコンパイルの複雑化といった課題も伴います。
GOOS
と GOARCH
Go言語のビルドシステムでは、環境変数の GOOS
と GOARCH
を用いて、ターゲットとなるオペレーティングシステムとアーキテクチャを指定します。
GOOS
: ターゲットOS(例:linux
,windows
,darwin
(macOS),freebsd
,netbsd
など)GOARCH
: ターゲットアーキテクチャ(例:amd64
,386
,arm
,arm64
など)
これらの変数を組み合わせることで、特定のプラットフォーム向けにGoプログラムをクロスコンパイルすることができます。例えば、GOOS=windows GOARCH=amd64
は、64ビットWindows向けの実行ファイルをビルドすることを意味します。
Make.inc
Make.inc
は、Goプロジェクトのビルドシステムで使用されるMakefileのインクルードファイルです。Goプロジェクトは、初期の段階ではUnix系の make
ツールを広範に利用してビルドプロセスを管理していました。Make.inc
には、ビルドに関する共通の設定や変数が定義されており、Makefile
から読み込まれることで、ビルドの挙動を制御します。このファイルは、特定のOSやアーキテクチャに応じたビルド設定を調整するためによく使われます。
CGO_ENABLED
CGO_ENABLED
は、Goのビルドシステムにおける重要な環境変数(またはMakefile変数)です。この変数が 1
に設定されている場合、CGOが有効になり、GoコンパイラはC言語のコードをリンクしようとします。0
に設定されている場合、CGOは無効になり、GoコンパイラはC言語のコードをリンクせず、純粋なGoコードのみでビルドを行います。CGOを無効にすることで、Cコンパイラがインストールされていない環境でもGoプログラムをビルドできるようになりますが、CGOに依存する機能は利用できなくなります。
技術的詳細
このコミットは、Go言語のビルドシステムの中核部分である src/Make.inc
ファイルを変更しています。具体的には、CGO_ENABLED
変数の設定ロジックに新たな条件を追加しています。
既存の Make.inc
では、既にNetBSD環境 (GOOS=netbsd
) でCGOを無効化する設定がありました。これは、NetBSD環境でもCGOに何らかの問題があったか、あるいはサポートが不十分であったためと考えられます。
今回の変更では、この既存の条件に加えて、GOOS
が windows
であり、かつ GOARCH
が amd64
である場合に、CGO_ENABLED
を 0
に設定する行が追加されました。
ifeq ($(GOOS)$(GOARCH),windowsamd64) # ... and not on Windows/amd64
CGO_ENABLED:=0
endif
この ifeq
ディレクティブは、GOOS
と GOARCH
の値を連結した文字列が windowsamd64
と完全に一致する場合に、そのブロック内のコマンドを実行するという意味です。:=
は、Makefileにおける変数の即時展開代入であり、変数が定義された時点で評価されます。
この変更により、GoのビルドプロセスがWindows/amd64環境で実行される際、CGO機能が強制的に無効化されます。結果として、CGOに依存するGoパッケージやプログラムは、この環境ではビルドできなくなります。これは、前述の通り、当時のWindows/amd64環境におけるCGOの不安定性に対処するための、実用的な回避策でした。
コアとなるコードの変更箇所
--- a/src/Make.inc
+++ b/src/Make.inc
@@ -142,6 +142,9 @@ endif
ifeq ($(GOOS),netbsd) # ... and not on NetBSD
CGO_ENABLED:=0
endif
+ifeq ($(GOOS)$(GOARCH),windowsamd64) # ... and not on Windows/amd64
+CGO_ENABLED:=0
+endif
endif
# Make environment more standard.
コアとなるコードの解説
変更は src/Make.inc
ファイルの142行目付近にあります。
ifeq ($(GOOS),netbsd)
ブロックの直後に新しいifeq
ブロックが追加されています。- 追加された行は
ifeq ($(GOOS)$(GOARCH),windowsamd64)
です。これは、GOOS
変数の値とGOARCH
変数の値を連結した文字列が"windowsamd64"
と等しいかどうかをチェックする条件式です。- 例えば、
GOOS
がwindows
でGOARCH
がamd64
の場合、$(GOOS)$(GOARCH)
はwindowsamd64
となり、条件が真となります。
- 例えば、
- この条件が真の場合、次の行
CGO_ENABLED:=0
が実行されます。これにより、CGO機能がビルドプロセス全体で無効化されます。 - コメント
# ... and not on Windows/amd64
は、このコードブロックの目的を明確に示しています。
この変更は、Goのビルドシステムが特定のプラットフォーム(この場合はWindows/amd64)でCGOを強制的に無効にするための、シンプルかつ効果的なメカニズムを提供しています。これにより、CGOの不具合が他のビルド問題の診断を妨げることを防ぎ、開発チームがより重要な問題に集中できるようになりました。
関連リンク
- Go CL (Code Review) へのリンク: https://golang.org/cl/5477081
参考にした情報源リンク
- コミットメッセージの内容
- Go言語のビルドシステムに関する一般的な知識
- Makefileの構文に関する一般的な知識
- CGOに関するGo言語のドキュメント(一般的な情報源として)
GOOS
およびGOARCH
環境変数に関するGo言語のドキュメント(一般的な情報源として)- Go言語の初期の歴史とWindowsサポートに関する情報(一般的な情報源として)
- Web検索結果: "Go CGO Windows amd64 broken 2011" (特に、2011年12月13日の変更と、2012年初頭のCGO on Windowsに関する議論に言及している情報)