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

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

このコミットは、Go言語の標準ライブラリである net パッケージの Makefile における変更です。具体的には、src/pkg/net/Makefile ファイル内のオペレーティングシステム(OS)固有のソースファイルリストの順序を整理し、freebsddarwin (macOS) 向けの定義が正しく配置されるように修正しています。

コミット

commit ecc317647b831c44af46af5ecee29f62ff815e7c
Author: Mikio Hara <mikioh.mikioh@gmail.com>
Date:   Fri Dec 16 19:50:55 2011 +0900

    net: sort Makefile entries
    
    R=golang-dev, jsing
    CC=golang-dev
    https://golang.org/cl/5493058

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

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

元コミット内容

net: sort Makefile entries

変更の背景

このコミットは、Go言語の net パッケージのビルドプロセスで使用される Makefile の可読性と保守性を向上させることを目的としています。当時のGo言語のビルドシステムでは、OS固有のファイル(例: freebsddarwin 向けのネットワーク関連実装)を Makefile 内で管理していました。

変更前は、GOFILES_freebsdGOFILES_darwin の定義ブロックの順序が論理的でなかったか、あるいは単にアルファベット順などの一貫したソート規則に従っていなかった可能性があります。このような不整合は、将来のメンテナンスや新しいOSサポートの追加時に混乱を招く可能性があります。このコミットは、これらのエントリを「ソート」することで、Makefile の構造をより明確にし、エラーの可能性を減らすことを意図しています。

前提知識の解説

  • Go言語のビルドシステムと GOOS: Go言語は、GOOS (Go Operating System) 環境変数を使用して、ターゲットとするOSを指定してクロスコンパイルを行うことができます。例えば、GOOS=linuxGOOS=darwin などと設定します。Goのソースコード内では、ファイル名に _$(GOOS).go の形式でOS固有のコードを記述することができ、ビルド時に適切なファイルが選択されます。
  • Makefile: Makefile は、ソフトウェアのビルドプロセスを自動化するためのツールである make コマンドが使用する設定ファイルです。Go言語の初期のバージョンでは、標準ライブラリのビルドやテストに Makefile が広く利用されていました。Makefile 内では、変数定義(例: GOFILES_freebsd)や条件分岐(例: ifeq ($(CGO_ENABLED),1))を用いて、ビルドの挙動を制御します。
  • net パッケージ: net パッケージは、Go言語におけるネットワークI/Oの基本的な機能を提供する標準ライブラリです。TCP/IP、UDP、Unixドメインソケット、DNSルックアップなど、様々なネットワークプロトコルとインターフェースを扱います。OSによってネットワーク関連のシステムコールやAPIが異なるため、net パッケージには多くのOS固有の実装が含まれています。
  • CGO: CGOは、GoプログラムからC言語のコードを呼び出すためのGoの機能です。CGO_ENABLED 環境変数が 1 に設定されている場合、CGOが有効になり、C言語のコードを含むファイル(通常は .c.h ファイル、またはGoのソースコード内で import "C" を使用している部分)がビルドプロセスに含まれます。cgo_stub.go は、CGOが無効な場合にCGOに依存する機能のスタブ(空の実装)を提供するファイルとして使用されることがあります。
  • fd.gofd_$(GOOS).go: fd はファイルディスクリプタ(File Descriptor)の略です。fd.go は一般的なファイルディスクリプタ関連のコードを含み、fd_$(GOOS).go は特定のOS($(GOOS) で指定されるOS)に特化したファイルディスクリプタの操作を実装しています。
  • interface_bsd.gointerface_darwin.go / interface_freebsd.go: interface はネットワークインターフェースを指します。interface_bsd.go はBSD系のOSに共通のインターフェース関連のコードを含み、interface_darwin.gointerface_freebsd.go はそれぞれmacOS (Darwin) やFreeBSDに特化した実装を提供します。
  • iprawsock_posix.go / ipsock_posix.go: これらはPOSIX互換システム(Unix系OS)におけるIP生ソケット(Raw IP Socket)やIPソケットの実装に関連するファイルです。
  • lookup_unix.go / dnsclient_unix.go / dnsconfig.go: これらはUnix系OSにおけるDNSルックアップやDNSクライアント、DNS設定の読み込みに関連するファイルです。

技術的詳細

このコミットの技術的な核心は、Makefile 内でのOS固有のソースファイルリストの管理方法にあります。

Makefile では、以下のような変数が定義されています。

  • GOFILES_freebsd: FreeBSD向けのGoソースファイルのリスト。
  • GOFILES_darwin: Darwin (macOS) 向けのGoソースファイルのリスト。
  • CGOFILES_freebsd: FreeBSD向けのCGOソースファイルのリスト。
  • CGOFILES_darwin: Darwin (macOS) 向けのCGOソースファイルのリスト。

コミットの変更内容は、これらの変数定義ブロックの順序を入れ替えることです。具体的には、変更前は GOFILES_freebsd の定義が GOFILES_darwin の定義よりも前にありましたが、変更後は GOFILES_darwin の定義が先に、その後に GOFILES_freebsd の定義が来るように修正されています。

さらに、各ブロック内で参照されるOS固有のファイル名も、対応するOSのブロックに移動されています。例えば、interface_freebsd.goGOFILES_freebsd のリストに、interface_darwin.goGOFILES_darwin のリストに、それぞれ正しく配置されるように修正されています。

また、CGOが有効かどうかに応じて cgo_stub.go を追加する条件分岐も、対応するOSのブロック内で適切に移動されています。

ifeq ($(CGO_ENABLED),1)
CGOFILES_freebsd=\
	cgo_bsd.go\
	cgo_unix.go
else
GOFILES_freebsd+=cgo_stub.go
endif

この ifeq ブロックは、CGO_ENABLED1 の場合に CGOFILES_freebsd にCGO関連のファイルを追加し、そうでない場合は GOFILES_freebsdcgo_stub.go を追加するというロジックを示しています。このロジック自体は変更されておらず、単に freebsddarwin のブロックが入れ替えられただけです。

この変更は、ビルドの動作に直接的な影響を与えるものではなく、Makefile の論理的な構造を改善し、将来のメンテナンスを容易にすることを目的とした「ソート」または「整理」のコミットです。

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

変更は src/pkg/net/Makefile の1ファイルのみです。

--- a/src/pkg/net/Makefile
+++ b/src/pkg/net/Makefile
@@ -21,14 +21,14 @@ GOFILES=\
 	udpsock.go\
 	unixsock.go\
 
-GOFILES_freebsd=\
+GOFILES_darwin=\
 	dnsclient_unix.go\
 	dnsconfig.go\
 	fd.go\
 	fd_$(GOOS).go\
 	file.go\
 	interface_bsd.go\
-\tinterface_freebsd.go\\\
+\tinterface_darwin.go\\\
 	iprawsock_posix.go\
 	ipsock_posix.go\
 	lookup_unix.go\
@@ -42,21 +42,21 @@ GOFILES_freebsd=\
 	unixsock_posix.go\
 
 ifeq ($(CGO_ENABLED),1)\
-CGOFILES_freebsd=\
+CGOFILES_darwin=\
 	cgo_bsd.go\
 	cgo_unix.go
 else\
-GOFILES_freebsd+=cgo_stub.go
+GOFILES_darwin+=cgo_stub.go
 endif\
 \
-GOFILES_darwin=\
+GOFILES_freebsd=\
 	dnsclient_unix.go\
 	dnsconfig.go\
 	fd.go\
 	fd_$(GOOS).go\
 	file.go\
 	interface_bsd.go\
-\tinterface_darwin.go\\\
+\tinterface_freebsd.go\\\
 	iprawsock_posix.go\
 	ipsock_posix.go\
 	lookup_unix.go\
@@ -70,11 +70,11 @@ GOFILES_darwin=\
 	unixsock_posix.go\
 
 ifeq ($(CGO_ENABLED),1)\
-CGOFILES_darwin=\
+CGOFILES_freebsd=\
 	cgo_bsd.go\
 	cgo_unix.go
 else\
-GOFILES_darwin+=cgo_stub.go
+GOFILES_freebsd+=cgo_stub.go
 endif\
 
 GOFILES_linux=\

コアとなるコードの解説

この差分は、Makefile 内の GOFILES_freebsdGOFILES_darwin の定義ブロック全体が入れ替わっていることを示しています。

  • 変更前: GOFILES_freebsd の定義が先にあり、その後に GOFILES_darwin の定義が続いていました。
  • 変更後: GOFILES_darwin の定義が先に、その後に GOFILES_freebsd の定義が続くように順序が変更されました。

この入れ替えに伴い、各ブロック内のOS固有のファイル名も修正されています。例えば、変更前の GOFILES_freebsd のリストには誤って interface_freebsd.go が含まれていましたが、変更後の GOFILES_darwin のリストには interface_darwin.go が、そして変更後の GOFILES_freebsd のリストには interface_freebsd.go が正しく含まれるようになっています。

同様に、CGO_ENABLED の条件分岐内の CGOFILES_ 変数や GOFILES_ 変数への cgo_stub.go の追加も、対応するOSのブロック内で正しく入れ替えられています。

この変更は、Makefile のエントリを論理的にソートし、各OS向けのファイルリストがそのOSの定義ブロック内に正しく配置されるようにすることで、コードの整合性と保守性を高めるためのものです。機能的な変更は一切なく、純粋にコードの整理とクリーンアップを目的としています。

関連リンク

参考にした情報源リンク

  • 特になし(コミット内容とGo言語の一般的な知識に基づいています)