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

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

このコミットは、Go言語のコマンドラインツール (cmd/go) において、Plan 9オペレーティングシステム上でGCC関連の環境変数 (CC および GOGCCFLAGS) を出力しないようにする変更を導入しています。これにより、Plan 9環境でのGoのビルドプロセスにおける潜在的な問題を解決し、より適切な環境変数の設定を保証します。

コミット

commit c14d255ac5ff06cb9258beebd5bdc6197a28fbd1
Author: Anthony Martin <ality@pbrane.org>
Date:   Tue Feb 26 08:34:47 2013 -0800

    cmd/go: do not print GCC environment variables on Plan 9
    
    R=seed, rminnich, r, minux.ma
    CC=golang-dev
    https://golang.org/cl/7397059

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

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

元コミット内容

元のコミットメッセージは「cmd/go: do not print GCC environment variables on Plan 9」です。これは、GoのビルドツールがGCCに関連する環境変数(CCGOGCCFLAGS)を、Plan 9オペレーティングシステム上では設定しないようにする変更を示しています。

変更の背景

Go言語は、その設計思想の一つとして、クロスプラットフォーム対応を重視しています。様々なオペレーティングシステムやアーキテクチャで動作するように設計されており、Plan 9もその対象の一つです。

Goのビルドプロセスでは、C言語で書かれたコード(Cgoを使用する場合など)をコンパイルするために、GCC(GNU Compiler Collection)のようなCコンパイラを利用することがあります。この際、Goのビルドツールは、Cコンパイラが適切に動作するために必要な環境変数(CC:Cコンパイラのパス、GOGCCFLAGS:GCCに渡すフラグ)を設定することが一般的です。

しかし、Plan 9はUNIX系OSとは異なる設計思想を持つオペレーティングシステムであり、その環境やツールチェインの構成が他のOSとは大きく異なります。特に、GCCの利用方法や、環境変数の解釈・利用方法が他のシステムと異なる場合があります。

このコミットの背景には、Plan 9環境でGoをビルドする際に、Goツールが設定するGCC関連の環境変数が、Plan 9の環境に合致せず、ビルドエラーや予期せぬ動作を引き起こす可能性があったことが考えられます。Plan 9では、Goのツールチェインが直接Cgoを処理する際に、GCCの環境変数を明示的に設定する必要がない、あるいは設定すると問題が生じる、といった状況があったと推測されます。この変更は、Plan 9の特性に合わせて、Goのビルドプロセスをより堅牢にするためのものです。

前提知識の解説

Plan 9 from Bell Labs

Plan 9 from Bell Labsは、ベル研究所で開発された分散オペレーティングシステムです。UNIXの後継として設計され、UNIXの概念をさらに推し進めたものとして知られています。主な特徴は以下の通りです。

  • 全てがファイル: Plan 9では、デバイス、ネットワーク接続、プロセスなど、システム内のあらゆるリソースがファイルとして表現されます。これにより、シンプルなファイルシステムインターフェースを通じて、複雑なシステムリソースにアクセスできます。
  • 名前空間: 各プロセスは独自の「名前空間」を持ち、ファイルシステムツリーを自由に構成できます。これにより、リソースの共有や分離が柔軟に行えます。
  • プロトコル: Plan 9は、ファイルシステムプロトコルである9P(またはPlan 9 File Protocol)を核としています。これにより、ネットワーク上のリソースもローカルファイルのように透過的に扱えます。
  • 異なる哲学: UNIXが「全てがファイル」という哲学を持つ一方で、Plan 9は「全てがファイルであり、それらはネットワークを通じてアクセス可能である」という、より分散システムに特化した哲学を持っています。

Plan 9は、その革新的な設計思想から、オペレーティングシステム研究に大きな影響を与えましたが、UNIXやLinuxほど広く普及することはありませんでした。しかし、その概念は、Go言語の設計思想(特に並行処理やネットワーク透過性)にも影響を与えたと言われています。

GCC (GNU Compiler Collection)

GCCは、GNUプロジェクトによって開発された、様々なプログラミング言語に対応するコンパイラ群です。C、C++、Objective-C、Fortran、Ada、Goなどの言語をサポートしています。Go言語自体は独自のコンパイラ(gc)を持っていますが、Cgo(GoとCの相互運用機能)を使用する際には、CコードをコンパイルするためにGCCのようなCコンパイラが必要となります。

環境変数 CCGOGCCFLAGS

  • CC: この環境変数は、Cコンパイラのパスを指定するために使用されます。例えば、CC=/usr/bin/gcc と設定すると、システムはCコードをコンパイルする際に/usr/bin/gccを使用します。Goのビルドツールは、Cgoが有効な場合、この変数を通じて使用するCコンパイラを決定します。
  • GOGCCFLAGS: この環境変数は、GoのビルドツールがCコンパイラ(GCC)を呼び出す際に渡す追加のフラグ(オプション)を指定するために使用されます。例えば、最適化レベルの指定や、特定のライブラリのリンク指示などが含まれることがあります。

これらの環境変数は、GoのビルドシステムがCgoを介してCコードをコンパイルする際の挙動を制御するために重要です。

技術的詳細

このコミットの技術的詳細は、Goのビルドツール (cmd/go) が環境変数を生成するロジックに条件分岐を追加することにあります。

Goのビルドツールは、go env コマンドで表示されるような、Goのビルド環境に関する様々な情報を環境変数として提供します。これには、GOARCH (ターゲットアーキテクチャ)、GOOS (ターゲットOS)、GOBIN (Goバイナリのインストール先) などが含まれます。Cgoが有効な場合、CCGOGCCFLAGS といったGCC関連の環境変数もこのリストに追加されます。

変更前のコードでは、これらのGCC関連の環境変数は、goos (ターゲットOS) の値に関わらず常にリストに追加されていました。しかし、Plan 9 (goos == "plan9") の環境では、これらの変数を設定することが適切ではない、あるいは問題を引き起こす可能性があるため、このコミットでは、goos が "plan9" でない場合にのみ CCGOGCCFLAGS を環境変数リストに追加するように修正されました。

具体的には、src/cmd/go/env.go ファイル内の mkEnv() 関数が変更されています。この関数は、Goのビルド環境変数のリストを構築する役割を担っています。変更により、CCGOGCCFLAGS の追加が if goos != "plan9" という条件ブロック内に移動されました。

これにより、Plan 9上でGoをビルドする際には、Goツールが自動的にGCC関連の環境変数を設定しなくなり、Plan 9のネイティブなツールチェインや環境設定に依存する形となります。これは、Plan 9の設計思想とより合致し、ビルドの安定性を向上させるための重要な調整です。

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

変更は src/cmd/go/env.go ファイルにあります。

--- a/src/cmd/go/env.go
+++ b/src/cmd/go/env.go
@@ -34,12 +34,10 @@ func mkEnv() []envVar {
  	b.init()
 
  	env := []envVar{
- 		{"CC", b.gccCmd(".")[0]},\n
  		{"GOARCH", goarch},\n
  		{"GOBIN", gobin},\n
  		{"GOCHAR", archChar},\n
  		{"GOEXE", exeSuffix},\n
- 		{"GOGCCFLAGS", strings.Join(b.gccCmd(\".\")[3:], \" \")},\n
  		{"GOHOSTARCH", runtime.GOARCH},\n
  		{"GOHOSTOS", runtime.GOOS},\n
  		{"GOOS", goos},\n
@@ -48,6 +46,12 @@ func mkEnv() []envVar {
  		{"GOTOOLDIR", toolDir},\n
  	}\n
 \n
+\tif goos != "plan9" {\n
+\t\tcmd := b.gccCmd(\".\")\n
+\t\tenv = append(env, envVar{\"CC\", cmd[0]})\n
+\t\tenv = append(env, envVar{\"GOGCCFLAGS\", strings.Join(cmd[3:], \" \")})\n
+\t}\n
+\n
  	if buildContext.CgoEnabled {\n
  		env = append(env, envVar{\"CGO_ENABLED\", \"1\"})\n
  	} else {\n

コアとなるコードの解説

src/cmd/go/env.gomkEnv() 関数は、Goのビルドプロセスで使用される環境変数のリスト ([]envVar) を構築します。

変更前は、以下の2行が env スライスに直接追加されていました。

  • {"CC", b.gccCmd(".")[0]}: Cコンパイラのパスを設定します。b.gccCmd(".") はGCCコマンドとその引数を生成するヘルパー関数です。
  • {"GOGCCFLAGS", strings.Join(b.gccCmd(".")[3:], " ")}: GCCに渡すフラグを設定します。

このコミットでは、これらの行が削除され、代わりに新しい条件ブロックが追加されました。

if goos != "plan9" {
	cmd := b.gccCmd(".")
	env = append(env, envVar{"CC", cmd[0]})
	env = append(env, envVar{"GOGCCFLAGS", strings.Join(cmd[3:], " ")})
}

この if 文は、現在のターゲットオペレーティングシステム (goos) が "plan9" でない場合にのみ、GCC関連の環境変数 (CCGOGCCFLAGS) を env リストに追加するようにします。

  • goos: Goのビルドシステムが認識するターゲットOSの文字列です。例えば、Linuxでは "linux"、macOSでは "darwin"、Windowsでは "windows"、そしてPlan 9では "plan9" となります。
  • b.gccCmd("."): この関数は、Goのビルドコンテキストに基づいて、GCCを呼び出すためのコマンドライン引数のスライスを返します。例えば、["gcc", "-I/path/to/include", "-L/path/to/lib", ...] のような形式です。cmd[0] はコンパイラ名(通常は "gcc")、cmd[3:] はGCCに渡すフラグの残りの部分を指します。

この変更により、Plan 9環境では、GoツールがGCC関連の環境変数を明示的に設定しなくなり、Plan 9の環境に合わせたCコンパイラの呼び出しが行われるようになります。これは、Plan 9の特殊な環境設定に対応するための重要な修正です。

関連リンク

参考にした情報源リンク

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

このコミットは、Go言語のコマンドラインツール (cmd/go) において、Plan 9オペレーティングシステム上でGCC関連の環境変数 (CC および GOGCCFLAGS) を出力しないようにする変更を導入しています。これにより、Plan 9環境でのGoのビルドプロセスにおける潜在的な問題を解決し、より適切な環境変数の設定を保証します。

コミット

commit c14d255ac5ff06cb9258beebd5bdc6197a28fbd1
Author: Anthony Martin <ality@pbrane.org>
Date:   Tue Feb 26 08:34:47 2013 -0800

    cmd/go: do not print GCC environment variables on Plan 9
    
    R=seed, rminnich, r, minux.ma
    CC=golang-dev
    https://golang.org/cl/7397059

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

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

元コミット内容

元のコミットメッセージは「cmd/go: do not print GCC environment variables on Plan 9」です。これは、GoのビルドツールがGCCに関連する環境変数(CCGOGCCFLAGS)を、Plan 9オペレーティングシステム上では設定しないようにする変更を示しています。

変更の背景

Go言語は、その設計思想の一つとして、クロスプラットフォーム対応を重視しています。様々なオペレーティングシステムやアーキテクチャで動作するように設計されており、Plan 9もその対象の一つです。

Goのビルドプロセスでは、C言語で書かれたコード(Cgoを使用する場合など)をコンパイルするために、GCC(GNU Compiler Collection)のようなCコンパイラを利用することがあります。この際、Goのビルドツールは、Cコンパイラが適切に動作するために必要な環境変数(CC:Cコンパイラのパス、GOGCCFLAGS:GCCに渡すフラグ)を設定することが一般的です。

しかし、Plan 9はUNIX系OSとは異なる設計思想を持つオペレーティングシステムであり、その環境やツールチェインの構成が他のOSとは大きく異なります。特に、GCCの利用方法や、環境変数の解釈・利用方法が他のシステムと異なる場合があります。

このコミットの背景には、Plan 9環境でGoをビルドする際に、Goツールが設定するGCC関連の環境変数が、Plan 9の環境に合致せず、ビルドエラーや予期せぬ動作を引き起こす可能性があったことが考えられます。Plan 9では、Goのツールチェインが直接Cgoを処理する際に、GCCの環境変数を明示的に設定する必要がない、あるいは設定すると問題が生じる、といった状況があったと推測されます。この変更は、Plan 9の特性に合わせて、Goのビルドプロセスをより堅牢にするためのものです。

前提知識の解説

Plan 9 from Bell Labs

Plan 9 from Bell Labsは、ベル研究所で開発された分散オペレーティングシステムです。UNIXの後継として設計され、UNIXの概念をさらに推し進めたものとして知られています。主な特徴は以下の通りです。

  • 全てがファイル: Plan 9では、デバイス、ネットワーク接続、プロセスなど、システム内のあらゆるリソースがファイルとして表現されます。これにより、シンプルなファイルシステムインターフェースを通じて、複雑なシステムリソースにアクセスできます。
  • 名前空間: 各プロセスは独自の「名前空間」を持ち、ファイルシステムツリーを自由に構成できます。これにより、リソースの共有や分離が柔軟に行えます。
  • プロトコル: Plan 9は、ファイルシステムプロトコルである9P(またはPlan 9 File Protocol)を核としています。これにより、ネットワーク上のリソースもローカルファイルのように透過的に扱えます。
  • 異なる哲学: UNIXが「全てがファイル」という哲学を持つ一方で、Plan 9は「全てがファイルであり、それらはネットワークを通じてアクセス可能である」という、より分散システムに特化した哲学を持つ。

Plan 9は、その革新的な設計思想から、オペレーティングシステム研究に大きな影響を与えましたが、UNIXやLinuxほど広く普及することはありませんでした。しかし、その概念は、Go言語の設計思想(特に並行処理やネットワーク透過性)にも影響を与えたと言われています。

GCC (GNU Compiler Collection)

GCCは、GNUプロジェクトによって開発された、様々なプログラミング言語に対応するコンパイラ群です。C、C++、Objective-C、Fortran、Ada、Goなどの言語をサポートしています。Go言語自体は独自のコンパイラ(gc)を持っていますが、Cgo(GoとCの相互運用機能)を使用する際には、CコードをコンパイルするためにGCCのようなCコンパイラが必要となります。

環境変数 CCGOGCCFLAGS

  • CC: この環境変数は、Cコンパイラのパスを指定するために使用されます。例えば、CC=/usr/bin/gcc と設定すると、システムはCコードをコンパイルする際に/usr/bin/gccを使用します。Goのビルドツールは、Cgoが有効な場合、この変数を通じて使用するCコンパイラを決定します。
  • GOGCCFLAGS: この環境変数は、GoのビルドツールがCコンパイラ(GCC)を呼び出す際に渡す追加のフラグ(オプション)を指定するために使用されます。例えば、最適化レベルの指定や、特定のライブラリのリンク指示などが含まれることがあります。

これらの環境変数は、GoのビルドシステムがCgoを介してCコードをコンパイルする際の挙動を制御するために重要です。

技術的詳細

このコミットの技術的詳細は、Goのビルドツール (cmd/go) が環境変数を生成するロジックに条件分岐を追加することにあります。

Goのビルドツールは、go env コマンドで表示されるような、Goのビルド環境に関する様々な情報を環境変数として提供します。これには、GOARCH (ターゲットアーキテクチャ)、GOOS (ターゲットOS)、GOBIN (Goバイナリのインストール先) などが含まれます。Cgoが有効な場合、CCGOGCCFLAGS といったGCC関連の環境変数もこのリストに追加されます。

変更前のコードでは、これらのGCC関連の環境変数は、goos (ターゲットOS) の値に関わらず常にリストに追加されていました。しかし、Plan 9 (goos == "plan9") の環境では、これらの変数を設定することが適切ではない、あるいは問題を引き起こす可能性があるため、このコミットでは、goos が "plan9" でない場合にのみ CCGOGCCFLAGS を環境変数リストに追加するように修正されました。

具体的には、src/cmd/go/env.go ファイル内の mkEnv() 関数が変更されています。この関数は、Goのビルド環境変数のリストを構築する役割を担っています。変更により、CCGOGCCFLAGS の追加が if goos != "plan9" という条件ブロック内に移動されました。

これにより、Plan 9上でGoをビルドする際には、Goツールが自動的にGCC関連の環境変数を設定しなくなり、Plan 9のネイティブなツールチェインや環境設定に依存する形となります。これは、Plan 9の設計思想とより合致し、ビルドの安定性を向上させるための重要な調整です。

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

変更は src/cmd/go/env.go ファイルにあります。

--- a/src/cmd/go/env.go
+++ b/src/cmd/go/env.go
@@ -34,12 +34,10 @@ func mkEnv() []envVar {
  	b.init()
 
  	env := []envVar{
- 		{"CC", b.gccCmd(".")[0]},\n
  		{"GOARCH", goarch},\n
  		{"GOBIN", gobin},\n
  		{"GOCHAR", archChar},\n
  		{"GOEXE", exeSuffix},\n
- 		{"GOGCCFLAGS", strings.Join(b.gccCmd(\".\")[3:], \" \")},\n
  		{"GOHOSTARCH", runtime.GOARCH},\n
  		{"GOHOSTOS", runtime.GOOS},\n
  		{"GOOS", goos},\n
@@ -48,6 +46,12 @@ func mkEnv() []envVar {
  		{"GOTOOLDIR", toolDir},\n
  	}\n
 \n
+\tif goos != "plan9" {\n
+\t\tcmd := b.gccCmd(".")\n
+\t\tenv = append(env, envVar{"CC", cmd[0]})\n
+\t\tenv = append(env, envVar{"GOGCCFLAGS", strings.Join(cmd[3:], " ")})\n
+\t}\n
+\n
  	if buildContext.CgoEnabled {\n
  		env = append(env, envVar{"CGO_ENABLED", "1"})\n
  	} else {\n

コアとなるコードの解説

src/cmd/go/env.gomkEnv() 関数は、Goのビルドプロセスで使用される環境変数のリスト ([]envVar) を構築します。

変更前は、以下の2行が env スライスに直接追加されていました。

  • {"CC", b.gccCmd(".")[0]}: Cコンパイラのパスを設定します。b.gccCmd(".") はGCCコマンドとその引数を生成するヘルパー関数です。
  • {"GOGCCFLAGS", strings.Join(b.gccCmd(".")[3:], " ")}: GCCに渡すフラグを設定します。

このコミットでは、これらの行が削除され、代わりに新しい条件ブロックが追加されました。

if goos != "plan9" {
	cmd := b.gccCmd(".")
	env = append(env, envVar{"CC", cmd[0]})
	env = append(env, envVar{"GOGCCFLAGS", strings.Join(cmd[3:], " ")})
}

この if 文は、現在のターゲットオペレーティングシステム (goos) が "plan9" でない場合にのみ、GCC関連の環境変数 (CCGOGCCFLAGS) を env リストに追加するようにします。

  • goos: Goのビルドシステムが認識するターゲットOSの文字列です。例えば、Linuxでは "linux"、macOSでは "darwin"、Windowsでは "windows"、そしてPlan 9では "plan9" となります。
  • b.gccCmd("."): この関数は、Goのビルドコンテキストに基づいて、GCCを呼び出すためのコマンドライン引数のスライスを返します。例えば、["gcc", "-I/path/to/include", "-L/path/to/lib", ...] のような形式です。cmd[0] はコンパイラ名(通常は "gcc")、cmd[3:] はGCCに渡すフラグの残りの部分を指します。

この変更により、Plan 9環境では、GoツールがGCC関連の環境変数を明示的に設定しなくなり、Plan 9の環境に合わせたCコンパイラの呼び出しが行われるようになります。これは、Plan 9の特殊な環境設定に対応するための重要な修正です。

関連リンク

参考にした情報源リンク