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

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

このコミットは、Go 1.1のリリースドキュメント(doc/go1.1.html)に、Cgoとクロスコンパイルに関する重要な情報追記するものです。具体的には、クロスコンパイル時にgoツールがデフォルトでCgoサポートを無効にすること、そして明示的にCgoを有効にするにはCGO_ENABLED=1を設定する必要があることを説明しています。

コミット

  • コミットハッシュ: 19cc9f91fa233e6846cbb582e26c31fa9748730d
  • Author: Dave Cheney dave@cheney.net
  • Date: Thu Apr 4 16:13:29 2013 +1100

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

https://github.com/golang/go/commit/19cc9f91fa233e6846cbb582e26c31fa9748730d

元コミット内容

doc/go1.1.html: mention cgo and cross compilation

R=r, minux.ma, bradfitz
CC=golang-dev
https://golang.org/cl/8304043

変更の背景

Go 1.1のリリース当時、Go言語は急速に進化しており、特に異なるアーキテクチャやオペレーティングシステム向けにバイナリをビルドする「クロスコンパイル」の機能は、開発者にとって非常に重要でした。しかし、C言語のコードをGoプログラムに組み込むための機能である「Cgo」は、クロスコンパイルの際に特別な考慮が必要でした。

このコミットは、Go 1.1のドキュメントにCgoとクロスコンパイルに関する明確なガイダンスを追加することで、開発者が直面する可能性のある混乱や問題を解消することを目的としています。特に、クロスコンパイル時にCgoがデフォルトで無効になるという挙動は、Cgoを使用するプロジェクトにとっては予期せぬビルドエラーにつながる可能性があったため、その旨を明記し、明示的に有効にする方法を示すことが求められました。

前提知識の解説

Cgo (C-Go interoperability)

Cgoは、GoプログラムからC言語のコードを呼び出したり、C言語のコードからGoの関数を呼び出したりするためのGoの機能です。これにより、既存のCライブラリをGoプロジェクトで再利用したり、パフォーマンスが重要な部分をCで記述したりすることが可能になります。Cgoを使用すると、Goのビルドプロセス中にCコンパイラ(通常はGCCやClang)が呼び出され、CコードがコンパイルされてGoのバイナリにリンクされます。

クロスコンパイル (Cross-compilation)

クロスコンパイルとは、あるプラットフォーム(例: macOS上のx86-64アーキテクチャ)で、別のプラットフォーム(例: Linux上のARMアーキテクチャ)向けの実行可能ファイルをビルドすることです。Go言語は、GOOS(ターゲットOS)とGOARCH(ターゲットアーキテクチャ)という環境変数を設定することで、強力なクロスコンパイル機能をネイティブにサポートしています。これにより、開発者は単一の開発環境から複数の異なる環境向けのバイナリを簡単に生成できます。

技術的詳細

Goのクロスコンパイルは、GOOSGOARCH環境変数を設定するだけで非常に簡単に行えます。しかし、Cgoが絡むと話は複雑になります。CgoはCコンパイラに依存するため、ターゲットプラットフォーム用のCコンパイラ(クロスコンパイラ)が必要になります。

Go 1.1の時点では、Cgoとクロスコンパイルの連携はまだ発展途上でした。goツールは、クロスコンパイルの際に、デフォルトでCgoを無効にするという安全策を講じていました。これは、ターゲットプラットフォーム用の適切なCクロスコンパイラがシステムにインストールされていない場合や、Cgoのビルド設定が複雑になることを避けるためです。

このコミットで追加されたドキュメントは、このデフォルトの挙動を明確にし、開発者がCgoを明示的に有効にするための方法を提示しています。CGO_ENABLED=1という環境変数を設定することで、goツールはCgoを有効にし、Cコードのコンパイルとリンクを試みます。この際、開発者はターゲットプラットフォーム用のCクロスコンパイラが利用可能であることを確認し、必要に応じてCCCXXといった環境変数でそのパスを指定する必要があります。

現代のGoバージョン(Go 1.5以降)では、クロスコンパイルのサポートが大幅に改善され、Cgoを含むプロジェクトのクロスコンパイルもよりシームレスになっていますが、Go 1.1の時点では、このような明示的な設定が必要でした。

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

変更はdoc/go1.1.htmlファイルに対して行われました。具体的には、以下のHTMLスニペットが追加されています。

<h3 id="crosscompile">Cross compilation</h3>

<p>
When cross-compiling, the <code>go</code> tool will disable <code>cgo</code>
support by default.
</p>

<p>
To explicitly enable <code>cgo</code>, set <code>CGO_ENABLED=1</code>.
</p>

この変更は、既存の「ARMv6 or later processor is required for freebsd/arm or Go 1.1 adds experimental support for cgo on linux/arm.」という段落の後に、新しいセクションとして追加されています。

コアとなるコードの解説

追加されたHTMLコードは、Go 1.1のリリースノートまたはドキュメントの一部として、クロスコンパイルに関する新しいセクションを導入しています。

  • <h3 id="crosscompile">Cross compilation</h3>: 「クロスコンパイル」という見出しを作成し、crosscompileというIDを付与しています。これにより、ドキュメント内でこのセクションへの直接リンクが可能になります。
  • <p>When cross-compiling, the <code>go</code> tool will disable <code>cgo</code> support by default.</p>: この段落は、クロスコンパイルを行う際に、goコマンドがデフォルトでCgoのサポートを無効にすることを明確に述べています。これは、Cgoを使用するプロジェクトをクロスコンパイルしようとする開発者にとって非常に重要な情報です。
  • <p>To explicitly enable <code>cgo</code>, set <code>CGO_ENABLED=1</code>.</p>: この段落は、Cgoを明示的に有効にするための具体的な方法を示しています。CGO_ENABLED=1という環境変数を設定することで、開発者はCgoを有効にしてクロスコンパイルを行うことができます。

これらの変更により、Go 1.1のユーザーは、Cgoとクロスコンパイルに関するGoツールの挙動を正確に理解し、必要に応じてCgoを有効にするための適切な手順を踏むことができるようになりました。

関連リンク

参考にした情報源リンク