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

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

このコミットは、Go言語プロジェクトのビルドおよびテスト環境設定スクリプトである src/env.bash に小さな修正を加えるものです。具体的には、CGO_ENABLED 環境変数が正しくエクスポートされるように変更し、CGO(C言語との連携)を利用するテストが適切に実行されるようにします。

コミット

commit 53c4d81b63984fb4fa1ec91024bc2477ef4e5d6e
Author: Alex Brainman <alex.brainman@gmail.com>
Date:   Tue Dec 13 10:47:51 2011 +1100

    env.bash: export CGO_ENABLED so cgo tests run
    
    R=golang-dev, rsc
    CC=golang-dev
    https://golang.org/cl/5394042

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

https://github.com/golang/go/commit/53c4d81b63984fb4fa1ec91024bc2477ef4e5d6e

元コミット内容

env.bash: export CGO_ENABLED so cgo tests run

このコミットは、env.bash スクリプトが CGO_ENABLED 環境変数をエクスポートするように変更し、それによってCGOを利用するテストが正しく実行されるようにすることを目的としています。

変更の背景

Go言語は、C言語のコードをGoプログラムから呼び出すためのメカニズムとしてCGOを提供しています。CGOを利用するプログラムやテストは、特定の環境変数(特にCGO_ENABLED)が適切に設定されている必要があります。

このコミットが行われた2011年12月時点では、Goのビルドシステムやテスト実行環境はまだ発展途上にありました。src/env.bash は、Goのビルドプロセスや開発環境をセットアップするための重要なスクリプトであり、GOARCH (ターゲットアーキテクチャ)、GOOS (ターゲットOS) などの重要な環境変数を設定していました。しかし、CGO関連のテストを実行する際に、CGO_ENABLED がこのスクリプトによって適切にエクスポートされていなかったため、CGOを利用するテストが期待通りに動作しない、あるいはスキップされてしまう問題が発生していたと考えられます。

この変更は、開発者がCGOを利用するコードやテストを確実に実行できるようにするための、環境設定の修正として行われました。これにより、CGO関連の機能のテストカバレッジが向上し、Go言語のクロスコンパイルや外部Cライブラリ連携の安定性が確保されることに貢献しました。

前提知識の解説

Go言語のCGO

CGOは、GoプログラムからC言語の関数を呼び出したり、C言語のコードをGoプログラムに組み込んだりするためのGoの機能です。これにより、既存のCライブラリをGoから利用したり、パフォーマンスが重要な部分をCで記述したりすることが可能になります。

CGOを有効にするには、通常、CGO_ENABLED 環境変数を 1 に設定します。この変数が 0 に設定されている場合、CGOは無効化され、GoコンパイラはCGOコードを無視します。これは、純粋なGoバイナリを生成したい場合や、クロスコンパイル環境でCコンパイラが利用できない場合に便利です。

env.bash と Go のビルド環境

src/env.bash は、Go言語のソースコードリポジトリに含まれるシェルスクリプトで、Goの開発環境をセットアップするために使用されます。このスクリプトは、GOROOT (Goのインストールディレクトリ)、GOPATH (Goのワークスペースディレクトリ)、GOARCHGOOS などの重要な環境変数を設定します。これらの変数は、Goコンパイラやツールがソースコードをビルドし、テストを実行し、パッケージを管理するために不可欠です。

このスクリプトは、Make.inc というMakefileの一部を実行し、その出力から必要な環境変数の値を抽出し、現在のシェルセッションにエクスポートする役割を担っています。

evalegrep コマンド

  • eval: シェルコマンドの文字列を評価し、実行するコマンドです。このコンテキストでは、$($MAKE ...) の出力(環境変数の設定コマンド)を現在のシェルで実行するために使用されます。
  • egrep: 拡張正規表現をサポートする grep コマンドのバージョンです。ここでは、Make.incgo-env ターゲットが出力する複数の環境変数の中から、特定の変数名(GOARCH, GOOS など)を含む行をフィルタリングするために使用されています。

技術的詳細

このコミットの技術的な核心は、src/env.bash スクリプト内で、Make.inc から取得する環境変数リストに CGO_ENABLED を追加することです。

元のコードでは、eval $($MAKE --no-print-directory -f Make.inc go-env | egrep 'GOARCH|GOOS|GOHOSTARCH|GOHOSTOS|GO_ENV') という行がありました。これは、Make.incgo-env ターゲットを実行し、その出力から GOARCH, GOOS, GOHOSTARCH, GOHOSTOS, GO_ENV のいずれかを含む行を egrep で抽出し、その結果を eval で現在のシェルに適用していました。

この修正により、egrep のパターンに |CGO_ENABLED が追加されました。 eval $($MAKE --no-print-directory -f Make.inc go-env | egrep 'GOARCH|GOOS|GOHOSTARCH|GOHOSTOS|GO_ENV|CGO_ENABLED')

これにより、Make.incCGO_ENABLED の設定を出力する場合、その値も egrep によって捕捉され、eval コマンドを通じて現在のシェル環境にエクスポートされるようになります。結果として、CGO_ENABLED の値がGoのビルドおよびテストプロセス全体で利用可能になり、CGOを利用するテストが正しくその値に基づいて動作するようになります。

この変更は、Goのビルドシステムが環境変数を管理する方法の進化を示しています。初期の段階では、すべての関連変数が明示的にリストアップされていなかった可能性がありますが、CGOの重要性が増すにつれて、その設定もビルド環境の一部として管理されるようになったと考えられます。

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

変更は src/env.bash ファイルの1箇所のみです。

--- a/src/env.bash
+++ b/src/env.bash
@@ -96,7 +96,7 @@ set +o noclobber
 
  # Tried to use . <($MAKE ...) here, but it cannot set environment
  # variables in the version of bash that ships with OS X.  Amazing.
-eval $($MAKE --no-print-directory -f Make.inc go-env | egrep 'GOARCH|GOOS|GOHOSTARCH|GOHOSTOS|GO_ENV')
+eval $($MAKE --no-print-directory -f Make.inc go-env | egrep 'GOARCH|GOOS|GOHOSTARCH|GOHOSTOS|GO_ENV|CGO_ENABLED')
 
  # Shell doesn't tell us whether make succeeded,
  # so Make.inc generates a fake variable name.

コアとなるコードの解説

変更された行は、Make.inc から生成される環境変数を現在のシェルに適用するためのものです。

  • $MAKE --no-print-directory -f Make.inc go-env: これは Make.inc ファイル内の go-env ターゲットを実行します。このターゲットは、Goのビルドに必要な環境変数(例: GOARCH=amd64, GOOS=linux など)を設定するシェルコマンドの形式で標準出力に出力します。
  • | egrep 'GOARCH|GOOS|GOHOSTARCH|GOHOSTOS|GO_ENV|CGO_ENABLED': Make.inc の出力から、指定された環境変数名(GOARCH, GOOS, GOHOSTARCH, GOHOSTOS, GO_ENV、そして今回追加された CGO_ENABLED)のいずれかを含む行のみをフィルタリングします。
  • eval $(...): egrep によってフィルタリングされた結果(例: export CGO_ENABLED=1 のような文字列)を、現在のシェルでコマンドとして実行します。これにより、これらの環境変数が現在のシェルセッションに設定され、以降のGoのビルドやテストコマンドで利用可能になります。

この修正により、CGO_ENABLED の値が src/env.bash を介して正しく伝播されるようになり、CGOに依存するテストが期待通りに実行される環境が整いました。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • Go言語のソースコードリポジトリ (特に src/env.bash および Make.inc ファイル)
  • Go言語のコミット履歴と関連するコードレビュー (CL 5394042)
  • 一般的なシェルスクリプト (eval, egrep) の動作に関する知識```markdown

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

このコミットは、Go言語プロジェクトのビルドおよびテスト環境設定スクリプトである src/env.bash に小さな修正を加えるものです。具体的には、CGO_ENABLED 環境変数が正しくエクスポートされるように変更し、CGO(C言語との連携)を利用するテストが適切に実行されるようにします。

コミット

commit 53c4d81b63984fb4fa1ec91024bc2477ef4e5d6e
Author: Alex Brainman <alex.brainman@gmail.com>
Date:   Tue Dec 13 10:47:51 2011 +1100

    env.bash: export CGO_ENABLED so cgo tests run
    
    R=golang-dev, rsc
    CC=golang-dev
    https://golang.org/cl/5394042

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

https://github.com/golang/go/commit/53c4d81b63984fb4fa1ec91024bc2477ef4e5d6e

元コミット内容

env.bash: export CGO_ENABLED so cgo tests run

このコミットは、env.bash スクリプトが CGO_ENABLED 環境変数をエクスポートするように変更し、それによってCGOを利用するテストが正しく実行されるようにすることを目的としています。

変更の背景

Go言語は、C言語のコードをGoプログラムから呼び出すためのメカニズムとしてCGOを提供しています。CGOを利用するプログラムやテストは、特定の環境変数(特にCGO_ENABLED)が適切に設定されている必要があります。

このコミットが行われた2011年12月時点では、Goのビルドシステムやテスト実行環境はまだ発展途上にありました。src/env.bash は、Goのビルドプロセスや開発環境をセットアップするための重要なスクリプトであり、GOARCH (ターゲットアーキテクチャ)、GOOS (ターゲットOS) などの重要な環境変数を設定していました。しかし、CGO関連のテストを実行する際に、CGO_ENABLED がこのスクリプトによって適切にエクスポートされていなかったため、CGOを利用するテストが期待通りに動作しない、あるいはスキップされてしまう問題が発生していたと考えられます。

この変更は、開発者がCGOを利用するコードやテストを確実に実行できるようにするための、環境設定の修正として行われました。これにより、CGO関連の機能のテストカバレッジが向上し、Go言語のクロスコンパイルや外部Cライブラリ連携の安定性が確保されることに貢献しました。

前提知識の解説

Go言語のCGO

CGOは、GoプログラムからC言語の関数を呼び出したり、C言語のコードをGoプログラムに組み込んだりするためのGoの機能です。これにより、既存のCライブラリをGoから利用したり、パフォーマンスが重要な部分をCで記述したりすることが可能になります。

CGOを有効にするには、通常、CGO_ENABLED 環境変数を 1 に設定します。この変数が 0 に設定されている場合、CGOは無効化され、GoコンパイラはCGOコードを無視します。これは、純粋なGoバイナリを生成したい場合や、クロスコンパイル環境でCコンパイラが利用できない場合に便利です。

env.bash と Go のビルド環境

src/env.bash は、Go言語のソースコードリポジトリに含まれるシェルスクリプトで、Goの開発環境をセットアップするために使用されます。このスクリプトは、GOROOT (Goのインストールディレクトリ)、GOPATH (Goのワークスペースディレクトリ)、GOARCHGOOS などの重要な環境変数を設定します。これらの変数は、Goコンパイラやツールがソースコードをビルドし、テストを実行し、パッケージを管理するために不可欠です。

このスクリプトは、Make.inc というMakefileの一部を実行し、その出力から必要な環境変数の値を抽出し、現在のシェルセッションにエクスポートする役割を担っています。

evalegrep コマンド

  • eval: シェルコマンドの文字列を評価し、実行するコマンドです。このコンテキストでは、$($MAKE ...) の出力(環境変数の設定コマンド)を現在のシェルで実行するために使用されます。
  • egrep: 拡張正規表現をサポートする grep コマンドのバージョンです。ここでは、Make.incgo-env ターゲットが出力する複数の環境変数の中から、特定の変数名(GOARCH, GOOS など)を含む行をフィルタリングするために使用されています。

技術的詳細

このコミットの技術的な核心は、src/env.bash スクリプト内で、Make.inc から取得する環境変数リストに CGO_ENABLED を追加することです。

元のコードでは、eval $($MAKE --no-print-directory -f Make.inc go-env | egrep 'GOARCH|GOOS|GOHOSTARCH|GOHOSTOS|GO_ENV') という行がありました。これは、Make.incgo-env ターゲットを実行し、その出力から GOARCH, GOOS, GOHOSTARCH, GOHOSTOS, GO_ENV のいずれかを含む行を egrep で抽出し、その結果を eval で現在のシェルに適用していました。

この修正により、egrep のパターンに |CGO_ENABLED が追加されました。 eval $($MAKE --no-print-directory -f Make.inc go-env | egrep 'GOARCH|GOOS|GOHOSTARCH|GOHOSTOS|GO_ENV|CGO_ENABLED')

これにより、Make.incCGO_ENABLED の設定を出力する場合、その値も egrep によって捕捉され、eval コマンドを通じて現在のシェル環境にエクスポートされるようになります。結果として、CGO_ENABLED の値がGoのビルドおよびテストプロセス全体で利用可能になり、CGOを利用するテストが正しくその値に基づいて動作するようになります。

この変更は、Goのビルドシステムが環境変数を管理する方法の進化を示しています。初期の段階では、すべての関連変数が明示的にリストアップされていなかった可能性がありますが、CGOの重要性が増すにつれて、その設定もビルド環境の一部として管理されるようになったと考えられます。

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

変更は src/env.bash ファイルの1箇所のみです。

--- a/src/env.bash
+++ b/src/env.bash
@@ -96,7 +96,7 @@ set +o noclobber
 
  # Tried to use . <($MAKE ...) here, but it cannot set environment
  # variables in the version of bash that ships with OS X.  Amazing.
-eval $($MAKE --no-print-directory -f Make.inc go-env | egrep 'GOARCH|GOOS|GOHOSTARCH|GOHOSTOS|GO_ENV')
+eval $($MAKE --no-print-directory -f Make.inc go-env | egrep 'GOARCH|GOOS|GOHOSTARCH|GOHOSTOS|GO_ENV|CGO_ENABLED')
 
  # Shell doesn't tell us whether make succeeded,
  # so Make.inc generates a fake variable name.

コアとなるコードの解説

変更された行は、Make.inc から生成される環境変数を現在のシェルに適用するためのものです。

  • $MAKE --no-print-directory -f Make.inc go-env: これは Make.inc ファイル内の go-env ターゲットを実行します。このターゲットは、Goのビルドに必要な環境変数(例: GOARCH=amd64, GOOS=linux など)を設定するシェルコマンドの形式で標準出力に出力します。
  • | egrep 'GOARCH|GOOS|GOHOSTARCH|GOHOSTOS|GO_ENV|CGO_ENABLED': Make.inc の出力から、指定された環境変数名(GOARCH, GOOS, GOHOSTARCH, GOHOSTOS, GO_ENV、そして今回追加された CGO_ENABLED)のいずれかを含む行のみをフィルタリングします。
  • eval $(...): egrep によってフィルタリングされた結果(例: export CGO_ENABLED=1 のような文字列)を、現在のシェルでコマンドとして実行します。これにより、これらの環境変数が現在のシェルセッションに設定され、以降のGoのビルドやテストコマンドで利用可能になります。

この修正により、CGO_ENABLED の値が src/env.bash を介して正しく伝播されるようになり、CGOに依存するテストが期待通りに実行される環境が整いました。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • Go言語のソースコードリポジトリ (特に src/env.bash および Make.inc ファイル)
  • Go言語のコミット履歴と関連するコードレビュー (CL 5394042)
  • 一般的なシェルスクリプト (eval, egrep) の動作に関する知識