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

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

このコミットは、Go言語のドキュメントに含まれるプログラムの実行スクリプト doc/progs/run に関連する変更です。このスクリプトは、Goのプログラム例をビルドおよび実行する際に使用されるもので、特にCGOに関連するテストの挙動を改善することを目的としています。

コミット

commit db3374e24de5844dad9c52620058259a95cc7481
Author: Ian Lance Taylor <iant@golang.org>
Date:   Fri Oct 11 08:55:13 2013 -0700

    doc/progs: don't try building cgo tests if CGO_ENABLED=0
    
    R=golang-dev, jsing, r
    CC=golang-dev
    https://golang.org/cl/14523056

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

https://github.com/golang/go/commit/db3374e24de5844dad9c52620058259a95cc7481

元コミット内容

doc/progs: don't try building cgo tests if CGO_ENABLED=0

このコミットメッセージは、「CGO_ENABLED=0 の場合、cgoテストのビルドを試みない」という簡潔な内容です。これは、CGO_ENABLED 環境変数が無効になっている場合に、cgoに依存するテストのビルドが失敗するのを防ぐための修正であることを示唆しています。

変更の背景

Go言語では、C言語のコードをGoプログラムから呼び出すためのcgoという機能があります。cgoを使用するかどうかは、CGO_ENABLEDという環境変数によって制御されます。CGO_ENABLED=1(デフォルト)の場合、cgoが有効になり、Cコードとの連携が可能になります。一方、CGO_ENABLED=0の場合、cgoは無効になり、純粋なGoコードのみがビルドされます。

このコミットが行われる前は、doc/progs/runスクリプトが、CGO_ENABLED=0の環境下であっても、cgoに依存するテスト(cgo1, cgo2など)のビルドを試みていました。当然ながら、cgoが無効な環境ではcgoに依存するコードはビルドできないため、これらのテストのビルドは失敗していました。これは、ユーザーや開発者がCGO_ENABLED=0でGoのプログラム例をテストしようとした際に、不必要なエラーや混乱を引き起こす原因となっていました。

この変更の背景には、GoのビルドシステムがCGO_ENABLEDの設定を尊重し、不要なビルドエラーを回避するという設計思想があります。特に、クロスコンパイル時など、CGO_ENABLED=0がデフォルトとなるシナリオでは、この問題はより顕著になります。このコミットは、このような状況下でのビルドの安定性とユーザーエクスペリエンスを向上させることを目的としています。

前提知識の解説

Go言語のビルドプロセスとCGO

Go言語は、その強力なクロスコンパイル機能と、C言語との連携を可能にするcgoツールで知られています。

  • cgo: GoプログラムからC言語の関数を呼び出したり、C言語のコードをGoプログラムに埋め込んだりするためのツールです。import "C"という特殊なインポート宣言を使用することで、Goコード内でC言語の関数やデータ構造を利用できるようになります。cgoが有効な場合、GoコンパイラはCコンパイラ(通常はGCCなど)と連携して、Cコード部分をコンパイルし、Goのオブジェクトファイルとリンクします。

  • CGO_ENABLED環境変数: この環境変数は、Goのビルドプロセスにおいてcgoを有効にするか無効にするかを制御します。

    • CGO_ENABLED=1: cgoが有効になります。これがデフォルトの設定であり、GoプログラムがCライブラリに依存する場合(例えば、netパッケージがDNSルックアップのためにCライブラリを使用する場合など)に必要です。この設定では、ビルド時にCコンパイラがシステムにインストールされている必要があります。生成されるバイナリは、通常、動的リンクされたCライブラリに依存します。
    • CGO_ENABLED=0: cgoが無効になります。この場合、GoコードはC関数を呼び出すことができません。生成されるバイナリは純粋なGoコードのみで構成され、外部のCライブラリに依存しない完全に静的な実行ファイルとなります。これは、特にコンテナ環境(例: Alpine Linux)でのデプロイや、クロスコンパイル時に非常に有用です。CGO_ENABLED=0でビルドすると、標準ライブラリの一部(netos/userなど)もcgoを使用しない純粋なGo実装に切り替わります。

doc/progs/runスクリプト

doc/progs/runは、Goの公式ドキュメントに含まれるプログラム例をビルドおよび実行するためのシェルスクリプトです。Goのソースツリー内のdoc/progsディレクトリには、Go言語の様々な機能や概念を示す小さなプログラム例が多数含まれています。このrunスクリプトは、これらのプログラムを自動的にテストし、正しく動作することを確認するために使用されます。スクリプトは、特定の環境変数(goosなど)に基づいて、ビルドするテストのリストを動的に決定します。

技術的詳細

このコミットの技術的な核心は、シェルスクリプトの条件分岐によって、CGO_ENABLED環境変数の値に基づいてcgoに依存するテストのリストを動的に調整することです。

具体的には、doc/progs/runスクリプト内で、c_go_cgoという変数がcgoに依存するテストのリスト(cgo1, cgo2など)を保持しています。このコミットでは、既存のOSごとの条件分岐(例: goosopenbsdの場合にc_go_cgoを設定する部分)の後に、新たな条件分岐が追加されました。

追加された条件分岐は以下の通りです。

if [ "$CGO_ENABLED" != 1 ]; then
	c_go_cgo=""
fi

このコードは、CGO_ENABLED環境変数の値が1ではない(つまり、0であるか、設定されていないか、あるいは他の値である)場合に、c_go_cgo変数を空文字列に設定します。これにより、cgoが有効でない環境では、c_go_cgoリストに含まれるはずだったcgoテストが、後続のビルドおよび実行プロセスから除外されるようになります。

この修正により、CGO_ENABLED=0の環境下でdoc/progs/runスクリプトを実行しても、cgoテストのビルドが試みられなくなり、不必要なビルドエラーが発生しなくなりました。これは、GoのビルドシステムがCGO_ENABLEDの設定をより適切に尊重し、環境に応じた適切なテストセットを選択するようになったことを意味します。

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

変更はdoc/progs/runファイルにのみ行われました。

--- a/doc/progs/run
+++ b/doc/progs/run
@@ -50,6 +50,9 @@ fi
 if [ "$goos" == "openbsd" ]; then
 	c_go_cgo="cgo1 cgo2"
 fi
+if [ "$CGO_ENABLED" != 1 ]; then
+	c_go_cgo=""
+fi
 
 timeout="
 	timeout1

コアとなるコードの解説

  • if [ "$goos" == "openbsd" ]; then ... fi: この既存のブロックは、オペレーティングシステムがOpenBSDの場合に、c_go_cgo変数にcgo1cgo2というテスト名を割り当てています。これは、特定のOS環境でのみ実行されるべきcgoテストがあることを示しています。

  • if [ "$CGO_ENABLED" != 1 ]; then: この行がこのコミットによって追加された主要な変更点です。これはシェルスクリプトの条件分岐であり、環境変数CGO_ENABLEDの値が文字列"1"と等しくない場合に、続くブロック内のコマンドを実行することを意味します。

    • $CGO_ENABLED: CGO_ENABLED環境変数の値を取得します。
    • != 1: 比較演算子で、値が1と等しくないことをチェックします。
  • c_go_cgo="": 上記のif条件が真(つまり、CGO_ENABLED1ではない)の場合に実行されるコマンドです。このコマンドは、c_go_cgo変数を空文字列に設定します。これにより、c_go_cgoリストに含まれるはずだったcgoテストが、後続のビルドプロセスから完全に除外されます。結果として、CGO_ENABLED=0の環境では、cgoに依存するテストのビルドが試みられなくなり、ビルドエラーが回避されます。

この変更は、GoのビルドシステムがCGO_ENABLEDの設定をより適切に尊重し、環境に応じた適切なテストセットを選択するようになったことを意味します。

関連リンク

参考にした情報源リンク