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

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

このコミットは、Go言語のビルドシステムにおいて、freebsd/armアーキテクチャ向けのcgoサポートを一時的に無効化するものです。具体的には、src/pkg/go/build/build.goファイル内のcgoEnabledマップから"freebsd/arm": trueのエントリを削除することで、この変更を実現しています。

コミット

commit a50c5fe6c368296d8d3857b32876017294f20162
Author: Dave Cheney <dave@cheney.net>
Date:   Sun Feb 16 20:46:03 2014 +1100

    go/build: temporarily disable cgo for freebsd/arm
    
    Update #7331
    
    cgo is currently broken on freebsd/arm.
    
    LGTM=iant
    R=golang-codereviews, iant
    CC=golang-codereviews
    https://golang.org/cl/63900043

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

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

元コミット内容

go/build: freebsd/arm向けのcgoを一時的に無効化する。

Issue #7331を更新。

現在、freebsd/arm上でcgoが壊れているため。

変更の背景

このコミットの背景には、当時のfreebsd/arm環境におけるcgoの機能不全がありました。コミットメッセージに明記されている通り、「cgo is currently broken on freebsd/arm.」という状況がこの変更の直接的な理由です。

Go言語は、異なるオペレーティングシステム(OS)とアーキテクチャの組み合わせ(GOOS/GOARCH)をサポートしており、それぞれの環境でGoプログラムが正しく動作するようにビルドシステムが構成されています。cgoはGoプログラムからC言語のコードを呼び出すためのメカニズムであり、多くのシステムプログラミングや既存のCライブラリとの連携において不可欠な機能です。

しかし、特定の環境(この場合はfreebsd/arm)でcgoが正常に動作しない場合、その環境でGoプログラムをビルドする際に問題が発生します。このコミットは、その問題を一時的に回避するための緊急措置として、freebsd/arm環境でのcgoサポートをビルドシステムレベルで無効化しました。これは、問題が解決されるまでの間、少なくともcgoを使用しないGoプログラムはfreebsd/arm上でビルドできるようにするための現実的な対応と言えます。

コミットメッセージにあるUpdate #7331は、この問題がGoのIssueトラッカーで追跡されていたことを示しています。Issue #7331は「freebsd/armでのcgoのビルドが失敗する」という内容であり、このコミットはその問題に対する一時的な解決策として提案・適用されました。

前提知識の解説

Go言語のビルドシステムとクロスコンパイル

Go言語は、その強力なクロスコンパイル機能で知られています。これは、あるOS/アーキテクチャの環境で、別のOS/アーキテクチャ向けのバイナリを生成できる能力です。例えば、Linux上でWindows向けの実行ファイルをビルドすることができます。この機能は、GOOS(ターゲットOS)とGOARCH(ターゲットアーキテクチャ)という環境変数を設定することで制御されます。

cgo

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

FreeBSD/ARM

  • FreeBSD: Unix系OSの一つで、堅牢性、高性能、セキュリティの高さで知られています。サーバー、組み込みシステム、デスクトップなど幅広い用途で利用されています。
  • ARM: Advanced RISC Machineの略で、モバイルデバイス、組み込みシステム、IoTデバイス、最近ではサーバーやデスクトップPCにも広く採用されているCPUアーキテクチャです。低消費電力と高い性能効率が特徴です。

freebsd/armは、FreeBSDオペレーティングシステムがARMアーキテクチャのプロセッサ上で動作する環境を指します。この組み合わせは、組み込みシステムや特定のサーバー環境で利用されることがあります。

go/buildパッケージ

go/buildパッケージは、Goのビルドシステムの中核をなすパッケージの一つです。Goのソースコードを解析し、パッケージの依存関係を解決し、ビルドに必要な情報を収集する役割を担っています。このパッケージは、Goのツールチェイン(go build, go installなど)によって内部的に利用されます。cgoEnabledのようなビルドに関する設定は、このパッケージ内で管理されています。

技術的詳細

このコミットは、Goのビルドシステムがcgoの利用を許可するかどうかを決定する内部マップcgoEnabledに手を加えています。

cgoEnabledマップは、GOOS/GOARCHの組み合わせをキーとし、その環境でcgoが有効であるか(true)無効であるか(false)を示すブール値を値として持つように設計されています。Goのビルドツールが特定のターゲット環境向けにcgoを必要とするパッケージをビルドしようとする際、このマップを参照してcgoがその環境でサポートされているかを確認します。

このコミットでは、src/pkg/go/build/build.goファイル内のcgoEnabledマップから、"freebsd/arm": true,というエントリが削除されました。これは、freebsd/arm環境ではcgoが利用できない、あるいは利用すべきではないという指示をビルドシステムに与えることを意味します。

この変更の技術的な影響は以下の通りです。

  1. cgoの無効化: freebsd/armをターゲットとするGoのビルドにおいて、cgoを使用するGoパッケージ(例: import "C"を含むファイル)はビルドエラーとなるか、cgo関連のコードが無視されるようになります。これにより、cgoの不具合が原因でビルドが失敗する問題を回避できます。
  2. ビルドの安定化: cgoの不具合が原因でビルドが不安定になっていたfreebsd/arm環境でのGoプログラムのビルドが、cgoを使用しない限りは安定して行えるようになります。
  3. 一時的な回避策: この変更は「temporarily disable」と明記されており、根本的な解決策ではなく、問題が修正されるまでの一時的な回避策であることを示唆しています。将来的にfreebsd/armでのcgoの問題が解決されれば、このエントリは再度追加される可能性があります。
  4. ビルドタグの挙動: Goのビルドシステムでは、// +build cgoのようなビルドタグを使用して、cgoが必要なファイルをマークすることができます。cgoEnabledマップがfalseを示す場合、これらのファイルはビルドプロセスから除外されるか、エラーを引き起こす可能性があります。

この変更は、Goのビルドシステムが特定のプラットフォームの特性や既知の不具合にどのように対応するかを示す良い例です。安定性を確保するために、一時的に特定の機能を無効化するという判断が下されました。

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

変更はsrc/pkg/go/build/build.goファイルの一箇所のみです。

--- a/src/pkg/go/build/build.go
+++ b/src/pkg/go/build/build.go
@@ -264,7 +264,6 @@ var cgoEnabled = map[string]bool{\n 	"dragonfly/amd64": true,\n 	"freebsd/386":     true,\n 	"freebsd/amd64":   true,\n-\t"freebsd/arm":     true,\n 	"linux/386":       true,\n 	"linux/amd64":     true,\n 	"linux/arm":       true,\

具体的には、cgoEnabledというmap[string]bool型の変数から、"freebsd/arm": true,という行が削除されています。

コアとなるコードの解説

cgoEnabled変数は、Goのビルドシステムがcgoを有効にするかどうかを決定するために使用するマップです。このマップのキーはGOOS/GOARCHの形式の文字列(例: "linux/amd64", "darwin/arm64")であり、値はそのプラットフォームでcgoが有効であるか(true)無効であるか(false)を示すブール値です。

元のコードでは、"freebsd/arm": true,というエントリが存在していました。これは、freebsd/arm環境ではcgoがデフォルトで有効であることを意味していました。しかし、このコミットによってこの行が削除されたため、freebsd/armに対する明示的なtrueのエントリがなくなりました。

Goのマップの挙動として、存在しないキーにアクセスした場合、その型のゼロ値が返されます。bool型のゼロ値はfalseです。したがって、cgoEnabledマップから"freebsd/arm"のエントリが削除された結果、ビルドシステムがfreebsd/arm向けにcgoの有効性をチェックする際に、暗黙的にfalseが返されるようになります。これにより、freebsd/arm環境でのcgoの利用が効果的に無効化されます。

この変更は、Goのビルドシステムが特定のプラットフォームのcgoサポートを動的に制御するためのシンプルなメカニズムを示しています。問題のあるプラットフォームでのビルドを一時的に安定させるために、コードベースの最小限の変更で対応できる点が特徴です。

関連リンク

参考にした情報源リンク