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

[インデックス 15534] ファイルの概要

このコミットは、Go言語のビルドシステムにおいて、Windows環境でのcgoのテストを無効化する変更を導入しています。具体的には、src/run.batファイルに2行の変更が加えられ、cgo関連のテストがスキップされるようになっています。これは、当時のWindows環境におけるcgoの既知の問題(Issue 4955)に対応するための暫定的な措置です。

コミット

commit 2202663a93bacb1cedf0f807f9b76333ac05e892
Author: Russ Cox <rsc@golang.org>
Date:   Fri Mar 1 11:55:00 2013 -0500

    build: disable cgo on windows
    
    Update #4955.
    
    R=golang-dev
    CC=golang-dev
    https://golang.org/cl/7435049

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/2202663a93bacb1cedf0f807f9b76333ac05e892

元コミット内容

build: disable cgo on windows

Update #4955.

変更の背景

この変更は、Go言語のIssue 4955に対応するために行われました。コミットメッセージに「cgo is broken」と明記されている通り、当時のWindows環境ではcgo(C言語との相互運用機能)が正常に動作しない、あるいは不安定な状態にあったため、ビルドプロセスにおけるcgo関連のテストを一時的に無効化する必要がありました。これにより、Windows上でのGoのビルドがcgoの問題によって妨げられることを防ぎ、開発の継続性を確保することが目的でした。

前提知識の解説

Go言語

Goは、Googleによって開発されたオープンソースのプログラミング言語です。静的型付け、コンパイル型、並行処理のサポート、ガベージコレクションなどの特徴を持ち、シンプルさと効率性を重視しています。システムプログラミング、Webサービス、ネットワークプログラミングなどで広く利用されています。

cgo

cgoは、GoプログラムからC言語のコードを呼び出したり、C言語のプログラムからGoの関数を呼び出したりするためのGoの機能です。これにより、既存のCライブラリをGoプロジェクトで再利用したり、パフォーマンスが重要な部分をCで記述したりすることが可能になります。cgoを使用するGoプログラムは、Goコンパイラだけでなく、Cコンパイラ(通常はGCCやClangなど)も必要とします。

Windows環境におけるcgoの課題

Windows環境でcgoを使用する場合、いくつかの特有の課題が存在します。

  1. Cコンパイラの依存性: Windowsには標準でCコンパイラが搭載されていないため、MinGW-w64やMSYS2などのGCC互換コンパイラを別途インストールし、適切にパスを設定する必要があります。
  2. クロスコンパイルの複雑さ: 異なるアーキテクチャ(例: amd64 Windows上で386向けにビルド)へのクロスコンパイルは、ターゲットアーキテクチャ用のC/C++コンパイラ(例: mingw-w64)のセットアップが必要となり、複雑さが増します。
  3. ビルドエラー: GCCのバージョン、環境変数の設定、リンカの問題などにより、様々なビルドエラーが発生することがあります。シンボルの再定義やcmd/linkに関する問題が報告されることもあります。
  4. DLLのクラッシュ: cgoを使用してビルドされたGoのDLLがWindows上でクラッシュする事例も報告されています。
  5. ビルドのステートフルネス: cgoを含むクロスコンパイルでは、ビルドの順序や特定の環境変数(CC_FOR_TARGETCXX_FOR_TARGETなど)の設定が結果に影響を与える「ステートフルネス」な挙動を示すことがあります。

これらの課題は、当時のGoのビルドシステムにおいて、Windows環境でのcgoテストの安定性を損なう要因となっていました。

技術的詳細

このコミットは、Goのビルドスクリプトであるsrc/run.batに修正を加えることで、Windows環境でのcgoテストを無効化しています。run.batは、Goのテストスイートを実行するためのバッチファイルであり、様々なテストカテゴリを順次実行します。

変更の核心は、cgoテストのセクションの冒頭にgoto nocgoという行を追加したことです。これは、バッチスクリプトの制御フローを変更するコマンドです。gotoコマンドは、指定されたラベル(この場合はnocgo)に処理をジャンプさせます。これにより、if x%CGO_ENABLED% == x0 goto nocgoという既存の条件分岐よりも前に無条件でcgoテストセクションをスキップするようになります。

また、:: issue 4955 - cgo is brokenというコメントが追加されており、この変更がIssue 4955に関連するものであり、cgoが当時Windowsで問題があったことを明確に示しています。

このアプローチは、問題が解決されるまでの間、Windows上でのGoのビルドプロセスがcgoの不安定性に影響されないようにするための、シンプルかつ効果的な回避策でした。

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

src/run.batファイルに以下の2行が追加されました。

--- a/src/run.bat
+++ b/src/run.bat
@@ -72,6 +72,8 @@ if errorlevel 1 goto fail
 echo.
 
 :: cgo tests
+:: issue 4955 - cgo is broken
+goto nocgo
 if x%CGO_ENABLED% == x0 goto nocgo
 echo # ..\misc\cgo\life
 go run %GOROOT%\test\run.go - ..\misc\cgo\life

コアとなるコードの解説

  • :: cgo tests: これはバッチファイルのコメント行で、続くセクションがcgo関連のテストであることを示しています。
  • :: issue 4955 - cgo is broken: 新しく追加されたコメント行です。この行は、この変更がGoのIssue 4955に関連しており、当時のWindows環境でcgoが正常に機能していなかった("cgo is broken")という背景を説明しています。
  • goto nocgo: 新しく追加された行です。このコマンドは、スクリプトの実行フローをnocgoというラベルが付けられた行に無条件でジャンプさせます。これにより、この行以降に記述されているcgo関連のテストコードが実行されることなくスキップされます。
  • if x%CGO_ENABLED% == x0 goto nocgo: これは元々存在していた行で、環境変数CGO_ENABLED0に設定されている場合にcgoテストをスキップするための条件分岐でした。しかし、今回の変更でgoto nocgoがその前に挿入されたため、この条件分岐は実質的に意味をなさなくなりました。

この変更により、src/run.batがWindows上で実行される際、cgoテストセクションに到達するとすぐにnocgoラベルにジャンプし、cgoテストが完全にスキップされるようになります。

関連リンク

Go言語のIssueトラッカーで「Issue 4955」を直接検索しましたが、関連する情報は見つかりませんでした。これは、非常に古いIssueであるか、内部的な追跡番号である可能性があります。しかし、cgoとWindowsに関する一般的な課題は、Goコミュニティで広く議論されてきました。

参考にした情報源リンク