[インデックス 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
でビルドすると、標準ライブラリの一部(net
やos/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ごとの条件分岐(例: goos
がopenbsd
の場合に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
変数にcgo1
とcgo2
というテスト名を割り当てています。これは、特定のOS環境でのみ実行されるべきcgoテストがあることを示しています。 -
if [ "$CGO_ENABLED" != 1 ]; then
: この行がこのコミットによって追加された主要な変更点です。これはシェルスクリプトの条件分岐であり、環境変数CGO_ENABLED
の値が文字列"1"
と等しくない場合に、続くブロック内のコマンドを実行することを意味します。$CGO_ENABLED
:CGO_ENABLED
環境変数の値を取得します。!= 1
: 比較演算子で、値が1
と等しくないことをチェックします。
-
c_go_cgo=""
: 上記のif
条件が真(つまり、CGO_ENABLED
が1
ではない)の場合に実行されるコマンドです。このコマンドは、c_go_cgo
変数を空文字列に設定します。これにより、c_go_cgo
リストに含まれるはずだったcgo
テストが、後続のビルドプロセスから完全に除外されます。結果として、CGO_ENABLED=0
の環境では、cgo
に依存するテストのビルドが試みられなくなり、ビルドエラーが回避されます。
この変更は、GoのビルドシステムがCGO_ENABLED
の設定をより適切に尊重し、環境に応じた適切なテストセットを選択するようになったことを意味します。
関連リンク
- Go CL 14523056: https://golang.org/cl/14523056
参考にした情報源リンク
- Go
CGO_ENABLED
environment variable: https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGJd0aLhBZcIA2OVgI0BDY6elBhZJ3hJn1uao1JbblbZRE3r5y0zbZuvvz3lT-veM_lyagfpF5u6rlsa9-6pfkZLYe0ISbtr3D191YEMRQiJjx_eKFO8AHWsLVEgPPnLqSC3TfJjlYwdT3YmIkM5pgnnHri3n-Kqq7uhkfOkSDLdkmjzePy - Go
CGO_ENABLED
explanation: https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFHJycI4Gj1lGjRXVsMC390MtJiaSIPetaFPMCocdvKd-iY1ZTuAkH-4RI9rK9aVmQzYOxUsN2AHXLIJH_GGGa0MHMDJPlZJp5oMW8qNqFVY-pUizbN7WVmX5p-qBfPWhoACvI1qmLTmfX0GD_wFkxEqga8XrV58Ze3Fzz3LTUSbGcr4qaYtyh8AQn9SdflwW0t - Go
CGO_ENABLED
default behavior: https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEbpnQS0kxSKungpofs1lV-Q-QJFyS3FBBu_INkWZfiD3HkY5NomCMZxbVO_S3RPuHPYWktptGqzoEKzNVvMADwLInn91S-8CkQLdVLR2rKkyFCefUIt7USxgso2KLeoA_QUxLJFY4kD6SvTDZh5HA= - Go
CGO_ENABLED
and cross-compilation: https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEt6ZmurVLUSQXBebOPEBNfPk6u0Do_kFbRBakR3Co2FEcwbpd0AS67W4AWtY03WmolTZ5QjIGE9RPG_szloJZp3qo2nv9ZgdBkle7Pmz_TOK6lOgpCSDmCITRQgFb9R5dpdYEDuiFHxNfHS-2u1EMZ8gFA5cwrnB0rUx5PMfP6RNF-HZy4wD-jiBX6u3l0azYtW-15Y8n8 - Go
CGO_ENABLED
and GCC: https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFyC81OQn7oBCfUJtdTPFQpvdwYe2kol4oQwvW0qr_aLksXaWz0bb_o9pl6rCax7XEZsmKrPi1JAxkkxjSfMF_7GaVztwqMb_Bv4yIYJArjdMZa-NeJI7ujk_QIPsptM06ojtU74Ra75Qi6-tJ0QWc6fKH4-K5RWoW-1xqalPhR01Pip71S7FLIH8q3oq8ymXAR-w9SWLsHP1s= - Go
CGO_ENABLED
build speed: https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQG_bOCMrbtd8cdREadg7AytxL5qncF9-KSmjLW-Aw9Jti1f4kFfke8P7Oay_yJLzMXlPZhnhd5ymPGT6qGuNXxxR7L3IEr6oqolGFpcssZpAsQbl1l3SgQpXXYJmumZK86r2PhVJpT73RIp8XxAHM7EjmMkYJr3cDKmoVWSfN14c0Z5KG3sphRUD7O3UljjPn7vzw==