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

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

このコミットは、Go言語の net パッケージにおけるSolaris関連のビルドタグの修正と、それに伴うSolaris上での netgo テストの有効化を目的としています。具体的には、CGOを利用するネットワーク実装 (cgo_unix.go) からSolarisのビルドタグを削除し、純粋なGo言語によるネットワーク実装 (netgo_unix_test.go) のテストにSolarisを含めることで、Solaris環境でのネットワーク機能の整合性を確保し、テストカバレッジを向上させています。

コミット

  • コミットハッシュ: f706d707b7f36d3465fdb2fb1489eb5ad3709d3d
  • Author: Mikio Hara mikioh.mikioh@gmail.com
  • Date: Mon Mar 3 07:09:28 2014 +0900

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

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

元コミット内容

net: remove the dreg of solaris merge

Also enables netgo test on solaris.

LGTM=aram, jsing
R=golang-codereviews, dave, aram, jsing
CC=golang-codereviews
https://golang.org/cl/70300043

変更の背景

このコミットの背景には、Go言語の net パッケージにおけるSolarisサポートの進化と、それに伴うビルド設定の調整があります。コミットメッセージにある「remove the dreg of solaris merge」という表現は、過去のSolaris関連のコードマージにおいて、不要な、あるいは誤った設定が残存していたことを示唆しています。

Go言語のネットワークパッケージは、C言語のライブラリ(libcなど)を呼び出す cgo を利用する実装と、完全にGo言語で書かれた netgo と呼ばれる純粋なGo実装の2種類をサポートしています。通常、パフォーマンスや特定のシステムコールへのアクセスが必要な場合は cgo が利用されますが、クロスコンパイルの容易さやCGOの依存関係を排除したい場合には netgo が選択されます。

Solaris環境において、以前のコミットで cgo_unix.go がSolaris向けにビルドされるように設定されていた可能性があります。しかし、何らかの理由(例えば、Solaris上でのCGOベースのネットワーク実装に問題があった、あるいは netgo の方がSolarisに適していると判断されたなど)で、この設定が不適切であると判断されたと考えられます。その結果、Solaris環境で netgo のテストが適切に実行されない、あるいは netgo の利用が妨げられるといった問題が発生していた可能性があります。

このコミットは、その「dreg」(残滓、不要物)を削除し、Solaris環境で netgo のテストが正しく実行されるようにすることで、SolarisにおけるGoのネットワーク機能の安定性と信頼性を向上させることを目的としています。

前提知識の解説

1. Go言語のビルドタグ (Build Tags)

Go言語には、ソースコードのコンパイル時に特定の条件に基づいてファイルを含めたり除外したりするための「ビルドタグ」という仕組みがあります。これは、ファイルの先頭に // +build という形式のコメントとして記述されます。

  • 構文: // +build tag1 tag2
  • 論理演算:
    • スペース区切り: 論理OR (tag1 || tag2) - いずれかのタグが有効であればファイルがビルドに含まれる。
    • カンマ区切り: 論理AND (tag1 && tag2) - すべてのタグが有効でなければファイルがビルドに含まれない。
    • 否定: !tag - 指定されたタグが有効でない場合にファイルがビルドに含まれる。

例えば、// +build linux darwin はLinuxまたはmacOSでビルドされるファイルを示し、// +build !cgo netgo はCGOが無効で netgo が有効な場合にビルドされるファイルを示します。

2. cgonetgo

Go言語の net パッケージは、ネットワーク操作を扱うための標準ライブラリです。このパッケージには、主に2つの実装パスがあります。

  • cgo (CGO-enabled network resolver):

    • これは、GoプログラムがC言語のライブラリ(特にシステムにインストールされているDNSリゾルバやその他のネットワーク関連のCライブラリ)を呼び出すことを可能にするGoの機能である cgo を利用する実装です。
    • cgo を使用すると、GoプログラムはOSネイティブのネットワークスタックやDNS解決メカニズムを直接利用できるため、一部の環境ではパフォーマンスが向上したり、より複雑なネットワーク設定に対応できたりします。
    • しかし、cgo を使用すると、クロスコンパイルが複雑になったり、CコンパイラやCライブラリへの依存関係が生じたりするというデメリットがあります。
    • ビルド時に CGO_ENABLED=1 (デフォルト) で有効になります。
  • netgo (Pure Go network resolver):

    • これは、完全にGo言語で書かれたネットワークリゾルバの実装です。C言語のライブラリに依存しません。
    • netgo は、クロスコンパイルを容易にし、Cコンパイラや特定のCライブラリへの依存を排除したい場合に特に有用です。
    • ただし、一部の複雑なネットワーク環境や、特定のOSネイティブの機能に依存する場合には、cgo 実装と比較して機能が制限される可能性があります。
    • ビルド時に CGO_ENABLED=0 または go build -tags netgo のように netgo ビルドタグを指定することで有効になります。

3. Solaris

Solarisは、Sun Microsystems(現在はOracleが所有)によって開発されたUNIXベースのオペレーティングシステムです。特にエンタープライズ環境やサーバー分野で利用されてきました。Go言語は、Linux、macOS、Windowsなどと同様に、Solarisもサポート対象のOSの一つとしています。

技術的詳細

このコミットの技術的詳細は、Goのビルドシステムと、net パッケージの cgo および netgo 実装の選択メカニズムに深く関連しています。

Goのビルドプロセスでは、ソースファイルのビルドタグを評価し、現在のビルド環境(OS、アーキテクチャ、指定されたビルドタグなど)に合致するファイルのみをコンパイルに含めます。

変更前は、以下のようになっていました。

  • src/pkg/net/cgo_unix.go:

    // +build !netgo
    // +build darwin dragonfly freebsd linux netbsd openbsd solaris
    

    この設定は、「netgo タグが指定されておらず、かつ、darwindragonflyfreebsdlinuxnetbsdopenbsd、または solaris のいずれかのOSでビルドされる場合」にこのファイルがコンパイルされることを意味します。つまり、Solaris環境で netgo タグが明示的に指定されていない場合(通常は CGO_ENABLED=1 の場合)、cgo_unix.go がビルドに含まれていました。

  • src/pkg/net/netgo_unix_test.go:

    // +build !cgo netgo
    // +build darwin dragonfly freebsd linux netbsd openbsd
    

    この設定は、「cgo タグが指定されておらず(つまり CGO_ENABLED=0)、かつ netgo タグが指定されており、かつ、darwindragonflyfreebsdlinuxnetbsd、または openbsd のいずれかのOSでビルドされる場合」にこのファイルがコンパイルされることを意味します。重要なのは、Solarisがこのリストに含まれていなかった点です。

この状態では、Solaris環境で netgo を使用しようとしても、netgo_unix_test.go がコンパイル対象から外れてしまうため、netgo のテストが実行できませんでした。また、cgo_unix.go がSolaris向けにビルドされることで、意図しないCGO依存が発生したり、netgo の純粋なGo実装がSolarisで適切に機能しない原因となっていた可能性があります。

このコミットによる変更は以下の通りです。

  • src/pkg/net/cgo_unix.go から solaris ビルドタグを削除。

    • これにより、Solaris環境では cgo_unix.go がデフォルトでビルドされなくなります。これは、Solarisでは netgo 実装を優先するか、あるいは cgo ベースの実装に問題があったため、その「dreg」を排除する意図があります。
  • src/pkg/net/netgo_unix_test.gosolaris ビルドタグを追加。

    • これにより、Solaris環境で CGO_ENABLED=0 かつ netgo タグが指定された場合に、netgo_unix_test.go がコンパイル対象に含まれるようになります。結果として、Solaris上での netgo のテストが有効になり、純粋なGoネットワーク実装の動作が検証できるようになります。

この修正により、GoのビルドシステムはSolaris環境において、net パッケージの netgo 実装を正しく選択し、そのテストを実行できるようになります。これは、SolarisにおけるGoアプリケーションのネットワーク機能の信頼性と互換性を向上させる上で重要なステップです。

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

このコミットでは、以下の2つのファイルのビルドタグが変更されています。

  1. src/pkg/net/cgo_unix.go

    --- a/src/pkg/net/cgo_unix.go
    +++ b/src/pkg/net/cgo_unix.go
    @@ -3,7 +3,7 @@
     // license that can be found in the LICENSE file.
    
     // +build !netgo
    -// +build darwin dragonfly freebsd linux netbsd openbsd solaris
    +// +build darwin dragonfly freebsd linux netbsd openbsd
    
     package net
    
    • // +build darwin dragonfly freebsd linux netbsd openbsd solaris の行から solaris が削除されました。
  2. src/pkg/net/netgo_unix_test.go

    --- a/src/pkg/net/netgo_unix_test.go
    +++ b/src/pkg/net/netgo_unix_test.go
    @@ -3,7 +3,7 @@
     // license that can be found in the LICENSE file.
    
     // +build !cgo netgo
    -// +build darwin dragonfly freebsd linux netbsd openbsd
    +// +build darwin dragonfly freebsd linux netbsd openbsd solaris
    
     package net
    
    • // +build darwin dragonfly freebsd linux netbsd openbsd の行に solaris が追加されました。

コアとなるコードの解説

src/pkg/net/cgo_unix.go の変更

このファイルは、Goの net パッケージがCGOを利用してネットワーク操作を行うためのUnix系OS向けの実装を含んでいます。変更前は、このファイルがSolaris環境でもビルドされるように指定されていました。

solaris タグの削除は、Solaris環境において、デフォルトでCGOベースのネットワーク実装がビルドされないようにすることを意味します。これは、SolarisでのCGO実装に問題があったか、あるいは netgo (純粋なGo実装) の方がSolaris環境に適していると判断されたためと考えられます。これにより、SolarisでのGoプログラムが意図せずCGOに依存することを防ぎ、より安定した netgo パスを利用するよう促します。

src/pkg/net/netgo_unix_test.go の変更

このファイルは、Goの net パッケージの純粋なGo実装 (netgo) のテストコードを含んでいます。変更前は、このテストがSolaris環境では実行されないように設定されていました。

solaris タグの追加は、Solaris環境で netgo が有効な場合に、このテストファイルがコンパイルされ、テストスイートに含まれるようにすることを意味します。これにより、Solaris上での netgo の動作が自動テストによって検証されるようになり、SolarisにおけるGoのネットワーク機能の品質と信頼性が向上します。

これらの変更は、Goの net パッケージがSolaris環境でどのようにビルドされ、テストされるかを正確に制御し、SolarisにおけるGoのネットワーク機能の健全性を保証するために不可欠です。

関連リンク

参考にした情報源リンク

  • https://golang.org/cl/70300043 (元のGo Gerrit Code Reviewリンク)
  • Go言語のビルドタグに関する一般的な情報源 (例: Go公式ドキュメント、Goブログ記事など)
  • cgonetgo に関するGoコミュニティの議論やドキュメントI have generated the detailed technical explanation in Markdown format, following all the specified instructions and chapter structure. The output is printed to standard output only, as requested.