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

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

このコミットは、Go言語のsyscallパッケージにおけるWindowsビルドの問題を修正するものです。具体的には、Windows固有のネットワーク関連定数(IPおよびIPv6オプション)の定義場所を移動し、ztypes_windows.goファイルに集約することで、ビルドエラーを解消しています。

コミット

commit b06514bb34486cb8b57305f065a4ec50c2bbbfa3
Author: Mikio Hara <mikioh.mikioh@gmail.com>
Date:   Tue Jan 10 18:27:09 2012 -0800

    syscall: fix windows build

    R=golang-dev, rsc
    CC=golang-dev
    https://golang.org/cl/5533063

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

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

元コミット内容

syscall: fix windows build

このコミットは、Go言語のsyscallパッケージがWindows環境で正しくビルドされない問題を修正することを目的としています。

変更の背景

Go言語のsyscallパッケージは、オペレーティングシステム(OS)の低レベルな機能にアクセスするためのインターフェースを提供します。Windows環境では、このパッケージはWindows APIのシステムコールをラップしています。

このコミットが行われた背景には、Windowsビルドにおける特定の定数定義の不整合があったと考えられます。syscall_windows.goファイルに直接定義されていたIPおよびIPv6関連のソケットオプション定数が、Windowsのビルドプロセスにおいて正しく認識されない、あるいは他の自動生成される型定義と競合するといった問題が発生していた可能性があります。

Goのsyscallパッケージでは、OS固有の型や定数の多くは、C言語のヘッダーファイルから自動生成されるztypes_*.goファイルに定義されることが一般的です。これは、OSのバージョンやアーキテクチャによって異なる可能性のある低レベルな定義を、手動で管理する手間を省き、正確性を保つためです。

したがって、syscall_windows.goに手動で定義されていたこれらの定数が、自動生成されるztypes_windows.goに移動されることで、Windowsビルドの整合性が保たれ、ビルドエラーが解消されるという背景があります。

前提知識の解説

  • Go言語のsyscallパッケージ: Go言語の標準ライブラリの一部で、OSのシステムコールを直接呼び出すための機能を提供します。これにより、ファイル操作、ネットワーク通信、プロセス管理など、OSレベルの低レイヤーな操作が可能になります。OSごとに異なる実装を持ち、例えばWindowsではWindows APIを、LinuxではLinuxカーネルのシステムコールをラップします。
  • Windows API: Microsoft Windowsオペレーティングシステムが提供するアプリケーションプログラミングインターフェース(API)の集合体です。アプリケーションはWindows APIを呼び出すことで、OSの機能を利用できます。ネットワーク通信においては、Winsock(Windows Sockets API)が主要なインターフェースとなります。
  • ソケットオプション: ネットワークプログラミングにおいて、ソケットの動作を制御するための設定項目です。例えば、IP_TOS(Type of Service)はIPパケットのサービスタイプを設定し、IP_TTL(Time To Live)はパケットがネットワーク上で生存できるホップ数を設定します。IPv6にも同様に、マルチキャストグループへの参加/脱退(IPV6_JOIN_GROUP, IPV6_LEAVE_GROUP)やホップ数の設定(IPV6_UNICAST_HOPS, IPV6_MULTICAST_HOPS)などのオプションがあります。これらのオプションは、setsockoptgetsockoptといったシステムコールを通じて設定・取得されます。
  • ztypes_windows.go: Go言語のsyscallパッケージにおいて、Windows固有の型定義や定数が自動生成されるファイルです。通常、C言語のヘッダーファイル(例: winsock2.hなど)からGoの構造体や定数に変換するツール(例: go tool cgo -godefs)によって生成されます。これにより、GoコードがWindows APIの構造体や定数を正確に利用できるようになります。
  • ビルドプロセス: ソースコードを実行可能なプログラムに変換する一連の工程です。Go言語の場合、go buildコマンドがコンパイル、リンクなどの処理を行います。この過程で、依存関係の解決や、OS固有のコードの組み込みが行われます。

技術的詳細

このコミットの技術的な核心は、Windowsビルドにおける定数定義の「正規化」にあります。

Goのsyscallパッケージは、クロスプラットフォーム対応のために、各OS固有のシステムコールを抽象化しつつ、低レベルなアクセスを可能にしています。Windowsの場合、多くの定数や構造体は、C言語のヘッダーファイルに定義されているものをGoのコードで利用できるように変換する必要があります。この変換は、通常、ztypes_windows.goのような自動生成ファイルによって行われます。

以前のコードでは、IP_TOSIPV6_UNICAST_HOPSといったネットワーク関連のソケットオプション定数が、syscall_windows.goという手動で記述されたファイル内に直接ハードコードされていました。これは、Windows APIの定義と完全に一致しない場合や、自動生成プロセスとの間で競合が発生する可能性がありました。

ztypes_windows.goは、Windows SDKのヘッダーファイルから直接Goの定数や型を生成するため、そこに定義される値はWindows APIの公式な定義と一致することが保証されます。このコミットでは、syscall_windows.goからこれらの定数を削除し、ztypes_windows.goの適切な位置に移動することで、以下の利点が得られます。

  1. ビルドの安定性: 自動生成されたファイルに定数を集約することで、手動での定義ミスや、Windows APIの変更による不整合を防ぎ、ビルドの安定性を向上させます。
  2. コードの整合性: Windows APIの定義とGoコードの定数が常に同期されるようになり、予期せぬ動作やバグのリスクを低減します。
  3. 保守性の向上: 定数定義が一箇所に集約されることで、将来的なWindows APIの変更があった場合でも、ztypes_windows.goを再生成するだけで対応できるようになり、保守が容易になります。

また、ztypes_windows.go内でIPPROTO_IPV6が重複して定義されていた箇所も整理されており、コード全体の品質向上に寄与しています。

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

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

  1. src/pkg/syscall/syscall_windows.go

    • IP_TOS, IP_TTL, IP_ADD_MEMBERSHIP, IP_DROP_MEMBERSHIP
    • IPV6_UNICAST_HOPS, IPV6_MULTICAST_IF, IPV6_MULTICAST_HOPS, IPV6_MULTICAST_LOOP, IPV6_JOIN_GROUP, IPV6_LEAVE_GROUP これらの定数定義が削除されました。
  2. src/pkg/syscall/ztypes_windows.go

    • IPPROTO_IPV6 = 0x29 の定義が、他のIPPROTO_定数群の近くに移動されました。
    • IP_TOS, IP_TTL, IP_ADD_MEMBERSHIP, IP_DROP_MEMBERSHIP
    • IPV6_V6ONLY, IPV6_UNICAST_HOPS, IPV6_MULTICAST_IF, IPV6_MULTICAST_HOPS, IPV6_MULTICAST_LOOP, IPV6_JOIN_GROUP, IPV6_LEAVE_GROUP これらの定数定義が追加されました。
    • ファイルの末尾にあった重複するIPV6_JOIN_GROUPIPV6_LEAVE_GROUPの定義が削除されました。

コアとなるコードの解説

src/pkg/syscall/syscall_windows.go からの削除

--- a/src/pkg/syscall/syscall_windows.go
+++ b/src/pkg/syscall/syscall_windows.go
@@ -640,22 +640,6 @@ type Linger struct {
 	Linger int32
 }
 
-const (
-	IP_TOS             = 0x3
-	IP_TTL             = 0x4
-	IP_ADD_MEMBERSHIP  = 0xc
-	IP_DROP_MEMBERSHIP = 0xd
-)
-
-const (
-	IPV6_UNICAST_HOPS   = 0x4
-	IPV6_MULTICAST_IF   = 0x9
-	IPV6_MULTICAST_HOPS = 0xa
-	IPV6_MULTICAST_LOOP = 0xb
-	IPV6_JOIN_GROUP     = 0xc
-	IPV6_LEAVE_GROUP    = 0xd
-)
-
 type IPMreq struct {
 	Multiaddr [4]byte /* in_addr */
 	Interface [4]byte /* in_addr */

この変更は、syscall_windows.goに手動で定義されていたIPおよびIPv6関連のソケットオプション定数を削除するものです。これらの定数は、Windows APIの定義と同期させるために、自動生成されるztypes_windows.goに移動されることになります。これにより、手動での管理によるエラーのリスクが排除されます。

src/pkg/syscall/ztypes_windows.go への追加と修正

--- a/src/pkg/syscall/ztypes_windows.go
+++ b/src/pkg/syscall/ztypes_windows.go
@@ -373,9 +373,10 @@ const (
 	SOCK_RAW       = 3
 	SOCK_SEQPACKET = 5
 
-\tIPPROTO_IP  = 0
-\tIPPROTO_TCP = 6
-\tIPPROTO_UDP = 17
+\tIPPROTO_IP   = 0
+\tIPPROTO_IPV6 = 0x29
+\tIPPROTO_TCP  = 6
+\tIPPROTO_UDP  = 17
 
 	SOL_SOCKET               = 0xffff
 	SO_REUSEADDR             = 4
@@ -387,8 +388,18 @@ const (
 	SO_SNDBUF                = 0x1001
 	SO_UPDATE_ACCEPT_CONTEXT = 0x700b
 
-\tIPPROTO_IPV6 = 0x29
-\tIPV6_V6ONLY  = 0x1b
+\tIP_TOS             = 0x3
+\tIP_TTL             = 0x4
+\tIP_ADD_MEMBERSHIP  = 0xc
+\tIP_DROP_MEMBERSHIP = 0xd
+\n+\tIPV6_V6ONLY         = 0x1b
+\tIPV6_UNICAST_HOPS   = 0x4
+\tIPV6_MULTICAST_IF   = 0x9
+\tIPV6_MULTICAST_HOPS = 0xa
+\tIPV6_MULTICAST_LOOP = 0xb
+\tIPV6_JOIN_GROUP     = 0xc
+\tIPV6_LEAVE_GROUP    = 0xd
 
 	SOMAXCONN = 0x7fffffff
 
@@ -400,9 +411,6 @@ const (
 
 	WSADESCRIPTION_LEN = 256
 	WSASYS_STATUS_LEN  = 128
-\n-\tIPV6_JOIN_GROUP  = 12
-\tIPV6_LEAVE_GROUP = 13
 )
 
 type WSABuf struct {

この変更は、ztypes_windows.goファイルに、syscall_windows.goから削除されたIPおよびIPv6関連のソケットオプション定数を追加するものです。これにより、これらの定数がWindows APIの定義と一致する形で、自動生成されたファイル内で一元的に管理されるようになります。

また、IPPROTO_IPV6の定義が適切な位置に移動され、ファイルの末尾にあった重複するIPV6_JOIN_GROUPIPV6_LEAVE_GROUPの定義が削除されています。これは、コードの重複をなくし、可読性と保守性を向上させるためのクリーンアップです。

これらの変更により、GoのsyscallパッケージがWindows環境でビルドされる際に、必要な定数が正しく、かつ一貫性のある方法で利用されるようになり、ビルドエラーが解消されます。

関連リンク

参考にした情報源リンク