[インデックス 19404] ファイルの概要
このコミットは、Go 1.3におけるcgo
を用いたクロスコンパイルに関する重要な環境変数であるCC_FOR_TARGET
とCXX_FOR_TARGET
のドキュメントを更新・追加するものです。これにより、Goツールチェインのビルド時およびgo
コマンド実行時におけるこれらの環境変数の役割が明確化され、開発者が異なるターゲットプラットフォーム向けにC/C++コードを含むGoプログラムをクロスコンパイルする際の理解が深まります。
コミット
commit 88d07b2cbcf0ad5e2e9936bcaec4fd25e38bec10
Author: Elias Naur <elias.naur@gmail.com>
Date: Tue May 20 01:32:31 2014 -0400
cmd/cgo: document CC_FOR_TARGET and CXX_FOR_TARGET
Update #4714
LGTM=iant, minux.ma, rsc
R=rsc, iant, r, minux.ma
CC=golang-codereviews
https://golang.org/cl/100390043
---
doc/go1.3.html | 7 +++++++
src/cmd/cgo/doc.go | 12 ++++++++++++\n 2 files changed, 19 insertions(+)
diff --git a/doc/go1.3.html b/doc/go1.3.html
index 5404f4ec66..900f6c77fc 100644
--- a/doc/go1.3.html
+++ b/doc/go1.3.html
@@ -226,6 +226,13 @@ supports a new <code>-i</code> option to install dependencies
of the specified target, but not the target itself.\n </p>\n \n+<p>\n+Cross compiling with <a href=\"/cmd/cgo/\"><code>cgo</code></a> enabled\n+is now supported. The CC_FOR_TARGET and CXX_FOR_TARGET environment\n+variables are used when running all.bash to specify the cross compilers\n+for C and C++ code, respectively.\n+</p>\n+\n <p>\n Finally, the go command now supports packages that import Objective-C\n files (suffixed <code>.m</code>) through cgo.\ndiff --git a/src/cmd/cgo/doc.go b/src/cmd/cgo/doc.go
index 057d25f5b4..e95915e55e 100644
--- a/src/cmd/cgo/doc.go
+++ b/src/cmd/cgo/doc.go
@@ -63,6 +63,18 @@ compilers may be changed by the CC and CXX environment variables,\n respectively; those environment variables may include command line\n options.\n \n+To enable cgo during cross compiling builds, set the CGO_ENABLED\n+environment variable to 1 when building the Go tools with make.bash.\n+Also, set CC_FOR_TARGET to the C cross compiler for the target. CC will\n+be used for compiling for the host.\n+\n+After the Go tools are built, when running the go command, CC_FOR_TARGET is\n+ignored. The value of CC_FOR_TARGET when running make.bash is the default\n+compiler. However, you can set the environment variable CC, not CC_FOR_TARGET,\n+to control the compiler when running the go tool.\n+\n+CXX_FOR_TARGET works in a similar way for C++ code.\n+\n Go references to C\n \n Within the Go file, C\'s struct field names that are keywords in Go\n```
## GitHub上でのコミットページへのリンク
[https://github.com/golang/go/commit/88d07b2cbcf0ad5e2e9936bcaec4fd25e38bec10](https://github.com/golang/go/commit/88d07b2cbcf0ad5e2e9936bcaec4fd25e38bec10)
## 元コミット内容
このコミットの目的は、「cmd/cgo: CC_FOR_TARGETとCXX_FOR_TARGETをドキュメント化する」ことです。これは、Go 1.3における`cgo`のクロスコンパイルサポートに関連する環境変数の説明を更新し、不足していた情報を提供することを意図しています。
## 変更の背景
Go 1.3では、`cgo`を有効にした状態でのクロスコンパイルがサポートされるようになりました。これは、GoプログラムがCまたはC++のコードとリンクしている場合に、異なるオペレーティングシステムやアーキテクチャ向けにビルドできることを意味します。しかし、この機能を利用する際には、どのC/C++コンパイラをターゲットプラットフォーム向けに使用するかを指定する必要がありました。
`CC_FOR_TARGET`と`CXX_FOR_TARGET`は、Goツールチェイン自体をビルドする際(特に`all.bash`や`make.bash`スクリプトを実行する際)に、ターゲットプラットフォーム用のCおよびC++クロスコンパイラを指定するために使用されます。このコミット以前は、これらの環境変数の役割や使用方法に関する公式ドキュメントが不足しており、開発者が`cgo`を用いたクロスコンパイルを行う際に混乱が生じる可能性がありました。
このコミットは、Go 1.3のリリースノート(`doc/go1.3.html`)と`cgo`のドキュメント(`src/cmd/cgo/doc.go`)にこれらの環境変数に関する明確な説明を追加することで、この情報ギャップを埋め、開発者の利便性を向上させることを目的としています。
## 前提知識の解説
### Goにおけるクロスコンパイル
Go言語は、その設計思想としてクロスコンパイルを強力にサポートしています。これは、あるオペレーティングシステム(OS)とアーキテクチャの組み合わせ(例: Linux x86-64)でGoプログラムをビルドし、別のOSとアーキテクチャの組み合わせ(例: Windows ARM)で実行可能なバイナリを生成できる能力を指します。Goの標準ライブラリは純粋なGoで書かれている部分が多く、通常は`GOOS`と`GOARCH`環境変数を設定するだけで簡単にクロスコンパイルが可能です。
### cgo
`cgo`は、GoプログラムからCコードを呼び出したり、CコードからGoコードを呼び出したりするためのGoのメカニズムです。これにより、既存のCライブラリを利用したり、パフォーマンスが重要な部分をCで記述したりすることが可能になります。`cgo`を使用すると、GoのビルドプロセスはCコンパイラ(通常はGCCやClang)を呼び出してCコードをコンパイルし、Goのオブジェクトファイルとリンクします。
### クロスコンパイルとcgoの組み合わせ
`cgo`を使用するGoプログラムをクロスコンパイルする場合、単に`GOOS`と`GOARCH`を設定するだけでは不十分です。なぜなら、GoプログラムがリンクするCコードは、ターゲットプラットフォーム向けのCコンパイラでコンパイルされる必要があるからです。例えば、Linux x86-64上でWindows ARM向けのGoプログラムをビルドし、そのプログラムがCコードを含んでいる場合、Windows ARM向けのCクロスコンパイラが必要になります。
### `CC_FOR_TARGET`と`CXX_FOR_TARGET`
これらの環境変数は、Goツールチェイン自体をビルドする際に使用されます。具体的には、Goのソースコードから`all.bash`(または`make.bash`)スクリプトを実行してGoツールチェインを構築する際に、ターゲットプラットフォーム向けのCコンパイラ(`CC_FOR_TARGET`)およびC++コンパイラ(`CXX_FOR_TARGET`)を指定するために使われます。
* **`CC_FOR_TARGET`**: Goツールチェインがターゲットプラットフォーム向けのCコードをコンパイルするために使用するCクロスコンパイラを指定します。
* **`CXX_FOR_TARGET`**: Goツールチェインがターゲットプラットフォーム向けのC++コードをコンパイルするために使用するC++クロスコンパイラを指定します。
これらの変数は、Goツールチェインがビルドされる際に、そのツールチェインが将来的に`cgo`を用いたクロスコンパイルを行うための「デフォルトの」クロスコンパイラを内部的に設定するために重要です。
### `CC`と`CXX`
これらは一般的な環境変数で、CおよびC++コンパイラを指定するために使用されます。Goの文脈では、Goツールチェインがビルドされた後、`go build`コマンドを実行する際に、`cgo`が使用するC/C++コンパイラを制御するために使用されます。`CC_FOR_TARGET`がGoツールチェインのビルド時に設定されるのに対し、`CC`はGoアプリケーションのビルド時に設定されます。
## 技術的詳細
このコミットは、Go 1.3で導入された`cgo`のクロスコンパイル機能のドキュメントを強化するものです。その核心は、Goツールチェインのビルドプロセスと、その後のGoアプリケーションのビルドプロセスにおけるC/C++クロスコンパイラの指定方法を明確にすることにあります。
1. **Goツールチェインのビルド時**:
* Goのソースコードから`all.bash`(または`make.bash`)スクリプトを実行してGoツールチェインをビルドする際、`CGO_ENABLED`環境変数を`1`に設定することで、`cgo`を有効にしたビルドが可能になります。
* この段階で、`CC_FOR_TARGET`と`CXX_FOR_TARGET`を設定します。これらの変数は、Goツールチェインがターゲットプラットフォーム向けのC/C++コードをコンパイルするために使用するクロスコンパイラを指示します。例えば、`CC_FOR_TARGET=arm-linux-gnueabihf-gcc`のように設定します。
* ここで設定された`CC_FOR_TARGET`の値は、Goツールチェインがビルドされた後の`go`コマンドのデフォルトのコンパイラとして機能します。
2. **Goアプリケーションのビルド時**:
* Goツールチェインがビルドされた後、`go build`コマンドを実行してGoアプリケーションをビルドする際には、`CC_FOR_TARGET`は無視されます。
* 代わりに、`CC`環境変数を設定することで、`go`コマンドが`cgo`を通じてCコードをコンパイルする際に使用するコンパイラを制御できます。これは、Goツールチェインのビルド時に設定されたデフォルトのコンパイラをオーバーライドしたい場合に特に有用です。`CXX`も同様にC++コードに対して機能します。
* `CGO_ENABLED=1`を明示的に設定しない限り、`cgo`はデフォルトで無効になるため、クロスコンパイルで`cgo`を使用する場合はこの設定が必須です。
この二段階のコンパイラ指定メカニズムは、Goツールチェイン自体のビルドと、そのツールチェインを使用したアプリケーションのビルドという異なるフェーズで、それぞれ適切なC/C++コンパイラを柔軟に指定できるように設計されています。これにより、複雑なクロスコンパイル環境においても、開発者が正確なコンパイラパスを制御できるようになります。
## コアとなるコードの変更箇所
このコミットでは、以下の2つのファイルにドキュメントが追加されています。
1. **`doc/go1.3.html`**: Go 1.3のリリースノートに、`cgo`を用いたクロスコンパイルがサポートされたこと、および`CC_FOR_TARGET`と`CXX_FOR_TARGET`が`all.bash`実行時にクロスコンパイラを指定するために使用されることが追記されました。
```html
<p>
Cross compiling with <a href="/cmd/cgo/"><code>cgo</code></a> enabled
is now supported. The CC_FOR_TARGET and CXX_FOR_TARGET environment
variables are used when running all.bash to specify the cross compilers
for C and C++ code, respectively.
</p>
```
2. **`src/cmd/cgo/doc.go`**: `cgo`の内部ドキュメントに、`CGO_ENABLED`、`CC_FOR_TARGET`、`CXX_FOR_TARGET`、および`CC`環境変数の詳細な使用方法が追加されました。特に、`make.bash`(`all.bash`)実行時と`go`コマンド実行時での`CC_FOR_TARGET`と`CC`の役割の違いが明確に説明されています。
```go
To enable cgo during cross compiling builds, set the CGO_ENABLED
environment variable to 1 when building the Go tools with make.bash.
Also, set CC_FOR_TARGET to the C cross compiler for the target. CC will
be used for compiling for the host.
After the Go tools are built, when running the go command, CC_FOR_TARGET is
ignored. The value of CC_FOR_TARGET when running make.bash is the default
compiler. However, you can set the environment variable CC, not CC_FOR_TARGET,
to control the compiler when running the go tool.
CXX_FOR_TARGET works in a similar way for C++ code.
```
## コアとなるコードの解説
### `doc/go1.3.html`への追加
この変更は、Go 1.3の公式リリースノートに、`cgo`のクロスコンパイルサポートが追加されたことを明記するものです。特に、`CC_FOR_TARGET`と`CXX_FOR_TARGET`が`all.bash`スクリプト実行時にクロスコンパイラを指定するために使用されるという、この新機能の重要な側面を強調しています。これにより、Go 1.3の新機能として、`cgo`を用いたクロスコンパイルが可能になったことが広く知らされることになります。
### `src/cmd/cgo/doc.go`への追加
この追加は、`cgo`のクロスコンパイルに関するより詳細な技術的ガイダンスを提供します。
* **`CGO_ENABLED=1`**: クロスコンパイルビルド中に`cgo`を有効にするために、Goツールを`make.bash`でビルドする際にこの環境変数を`1`に設定する必要があることを明確にしています。
* **`CC_FOR_TARGET`の役割**: ターゲット向けのCクロスコンパイラとして`CC_FOR_TARGET`を設定する必要があることを説明しています。また、`CC`がホスト向けのコンパイルに使用されることも補足しています。これは、Goツールチェイン自体のビルドにおけるコンパイラの役割分担を示しています。
* **`go`コマンド実行時の挙動**: Goツールがビルドされた後、`go`コマンドを実行する際には`CC_FOR_TARGET`が無視されるという重要な情報を提供しています。これは、`CC_FOR_TARGET`がGoツールチェインのビルド時にのみ意味を持つことを意味します。
* **`CC`によるオーバーライド**: `make.bash`実行時に設定された`CC_FOR_TARGET`の値がデフォルトのコンパイラとなるものの、`go`ツールを実行する際には`CC_FOR_TARGET`ではなく`CC`環境変数を設定することでコンパイラを制御できることを明記しています。これにより、開発者はGoツールチェインのビルド後に、特定のGoアプリケーションのビルドに対して異なるCコンパイラを指定する柔軟性が得られます。
* **`CXX_FOR_TARGET`**: `CXX_FOR_TARGET`もC++コードに対して同様に機能することが簡潔に述べられています。
これらのドキュメントの追加により、開発者は`cgo`を用いたクロスコンパイルのプロセスをより正確に理解し、適切な環境変数を設定してビルドエラーを回避できるようになります。
## 関連リンク
* GitHubコミットページ: [https://github.com/golang/go/commit/88d07b2cbcf0ad5e2e9936bcaec4fd25e38bec10](https://github.com/golang/go/commit/88d07b2cbcf0ad5e2e9936bcaec4fd25e38bec10)
* Go 1.3 Release Notes (doc/go1.3.html): [https://go.dev/doc/go1.3](https://go.dev/doc/go1.3) (このコミットで追加された内容を含む)
* Go cgo documentation (src/cmd/cgo/doc.go): [https://go.dev/cmd/cgo/](https://go.dev/cmd/cgo/) (このコミットで追加された内容を含む)
## 参考にした情報源リンク
* Go 1.3 Release Notes: [https://go.dev/doc/go1.3](https://go.dev/doc/go1.3)
* Go cgo documentation: [https://go.dev/cmd/cgo/](https://go.dev/cmd/cgo/)
* Stack Overflow: How to cross compile Go with CGO_ENABLED=1: [https://stackoverflow.com/questions/24870090/how-to-cross-compile-go-with-cgo-enabled-1](https://stackoverflow.com/questions/24870090/how-to-cross-compile-go-with-cgo-enabled-1)
* Go cross compilation with cgo: [https://dh1tw.de/2016/03/go-cross-compilation-with-cgo/](https://dh1tw.de/2016/03/go-cross-compilation-with-cgo/)
* Go issue #4714: cmd/cgo: document CC_FOR_TARGET and CXX_FOR_TARGET: [https://github.com/golang/go/issues/4714](https://github.com/golang/go/issues/4714)
* Go commit 88d07b2cbcf0ad5e2e9936bcaec4fd25e38bec10: [https://github.com/golang/go/commit/88d07b2cbcf0ad5e2e9936bcaec4fd25e38bec10](https://github.com/golang/go/commit/88d07b2cbcf0ad5e2e9936bcaec4fd25e38bec10)