[インデックス 10713] ファイルの概要
このコミットは、Go言語のビルドインフラストラクチャにNetBSDオペレーティングシステム向けの変更を加えるものです。具体的には、GoのビルドシステムがNetBSDを認識し、NetBSD固有のファイルや設定を適切に処理できるように、各種MakefileにNetBSD関連のエントリを追加しています。これにより、NetBSD上でのGoのコンパイルと実行がサポートされるようになります。
コミット
commit 728c16cf13ade25787c5c8f6bf89a2839411ec42
Author: Christopher Nielsen <m4dh4tt3r@gmail.com>
Date: Mon Dec 12 15:42:06 2011 -0500
build: Changes to the build infrastructure for NetBSD.
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5476048
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/728c16cf13ade25787c5c8f6bf89a2839411ec42
元コミット内容
build: Changes to the build infrastructure for NetBSD.
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5476048
変更の背景
この変更の背景には、Go言語がより多くのプラットフォームで動作できるようにするための継続的な取り組みがあります。NetBSDは、オープンソースのUnix系オペレーティングシステムであり、多様なハードウェアアーキテクチャをサポートすることで知られています。Go言語がNetBSDを公式にサポートすることで、NetBSDユーザーはGoアプリケーションを開発・実行できるようになり、Goのエコシステムがさらに拡大します。
このコミットは、NetBSDをGoのビルドシステムに統合するための初期ステップであり、NetBSD固有のシステムコール、ファイルパス処理、ネットワーク機能などをGoの標準ライブラリが適切に利用できるようにするための基盤を構築しています。特に、CGO_ENABLED
をNetBSDで無効にしている点は、初期段階でのCgo(C言語との連携)サポートの複雑さを回避し、純粋なGoコードのビルドを優先していることを示唆しています。
前提知識の解説
GoのビルドシステムとGOOS
Go言語のビルドシステムは、クロスコンパイルを強力にサポートしています。これは、あるオペレーティングシステム(OS)上で、別のOS向けの実行ファイルを生成できる機能です。この機能は、環境変数GOOS
(Go Operating System)とGOARCH
(Go Architecture)によって制御されます。
GOOS
: ビルド対象のオペレーティングシステムを指定します。例えば、linux
、darwin
(macOS)、windows
、freebsd
などがあります。このコミットでは、新たにnetbsd
が追加されています。GOARCH
: ビルド対象のCPUアーキテクチャを指定します。例えば、amd64
、arm
、386
などがあります。
Goのソースコード内では、ファイル名に_GOOS.go
や_GOOS_GOARCH.go
といったサフィックスを付けることで、特定のOSやアーキテクチャに特化したコードを記述できます。ビルド時には、GOOS
とGOARCH
の値に基づいて適切なファイルが選択され、コンパイルされます。
CGO_ENABLED
CGO_ENABLED
は、Goのビルド時にCgo(C言語との連携機能)を有効にするかどうかを制御する環境変数です。
CGO_ENABLED=1
: Cgoが有効になり、GoコードからC言語の関数を呼び出したり、C言語のライブラリをリンクしたりできます。これは、OSのシステムコールを直接呼び出す場合や、既存のCライブラリを利用する場合に必要となります。CGO_ENABLED=0
: Cgoが無効になります。この場合、Goは純粋なGoコードのみでビルドされ、C言語のコードやライブラリへの依存がなくなります。これは、クロスコンパイルを簡素化したり、特定の環境でのビルド問題を回避したりする際に有用です。
このコミットでは、NetBSD向けにCGO_ENABLED:=0
が設定されており、初期段階ではCgoを使用しないビルドがデフォルトとなっています。これは、NetBSDのCライブラリとの連携に関する複雑さを後回しにし、まずは純粋なGoコードがNetBSD上で動作することを目指したアプローチと考えられます。
Makefile
Goの初期のビルドシステムでは、Makefile
が広く利用されていました。Makefile
は、プログラムのコンパイルやインストールなどのビルドプロセスを自動化するためのツールです。Goのソースツリーには、各パッケージやコマンドのビルド方法を定義する多数のMakefile
が存在します。
このコミットでは、これらのMakefile
にNetBSD固有のビルドルールやファイルリストを追加することで、NetBSD上でのGoのビルドを可能にしています。例えば、GOFILES_netbsd
といった変数に、NetBSDでのみコンパイルされるべきGoソースファイルがリストアップされています。
NetBSD
NetBSDは、オープンソースのUnix系オペレーティングシステムであり、その設計のクリーンさと移植性の高さで知られています。非常に多くのハードウェアプラットフォーム(デスクトップ、サーバー、組み込みシステムなど)で動作することを目標としており、その移植性は「Any platform, any application, any time.」というスローガンで表現されています。
Go言語がNetBSDをサポートすることは、Goの適用範囲を広げ、NetBSDユーザーがGoの強力な並行処理機能や豊富な標準ライブラリを活用できるようになることを意味します。
技術的詳細
このコミットは、GoのビルドシステムにNetBSDのサポートを追加するために、複数のMakefile
ファイルを変更しています。主な変更点は以下の通りです。
-
src/Make.inc
の変更:GOOS_LIST
変数にnetbsd
を追加し、GoがサポートするOSのリストにNetBSDを含めるようにしました。- NetBSDの場合に
CGO_ENABLED
を0
に設定する条件を追加しました。これは、NetBSD上でのGoのビルドにおいて、Cgo(C言語との連携)を無効にすることを意味します。これにより、初期段階でのCgo関連の複雑さを回避し、純粋なGoコードのビルドを優先します。
-
src/cmd/cov/Makefile
およびsrc/cmd/prof/Makefile
の変更:install-netbsd: install-default
という行を追加し、cov
(カバレッジツール)とprof
(プロファイリングツール)のインストールプロセスがNetBSDでもデフォルトのインストール手順に従うようにしました。
-
src/pkg/crypto/tls/Makefile
の変更:GOFILES_netbsd+=root_unix.go
を追加しました。これは、crypto/tls
パッケージがNetBSD上でroot_unix.go
というファイルをコンパイルに含めることを意味します。このファイルは通常、Unix系システムでのルート証明書の処理に関連します。
-
src/pkg/mime/Makefile
の変更:GOFILES_netbsd+=type_unix.go
を追加しました。mime
パッケージがNetBSD上でtype_unix.go
をコンパイルに含めるようにします。これは、Unix系システムでのMIMEタイプ検出に関連するファイルです。
-
src/pkg/net/Makefile
の変更:GOFILES_netbsd
変数に、NetBSD上でnet
パッケージがコンパイルに含めるべき多数のGoソースファイル(dnsclient_unix.go
,fd.go
,interface_bsd.go
,lookup_unix.go
,tcpsock_posix.go
など)をリストアップしました。これは、NetBSDのネットワーク機能(DNS解決、ソケット操作、インターフェース情報取得など)をGoのnet
パッケージが適切に利用できるようにするために不可欠です。特に、fd_$(GOOS).go
やinterface_openbsd.go
(NetBSDもOpenBSDと一部共通のBSD系インターフェースを持つため)といったOS固有のファイルが含まれています。
-
src/pkg/os/Makefile
の変更:GOFILES_netbsd
変数に、NetBSD上でos
パッケージがコンパイルに含めるべきGoソースファイル(dir_unix.go
,error_posix.go
,file_posix.go
,sys_bsd.go
,exec_posix.go
など)をリストアップしました。これは、NetBSDのファイルシステム操作、エラー処理、プロセス実行、シグナル処理などをGoのos
パッケージが適切に利用できるようにするために必要です。
-
src/pkg/os/exec/Makefile
の変更:GOFILES_netbsd+=lp_unix.go
を追加しました。os/exec
パッケージがNetBSD上でlp_unix.go
をコンパイルに含めるようにします。これは、Unix系システムでの実行可能ファイルのパス解決(lookPath
)に関連します。
-
src/pkg/path/filepath/Makefile
の変更:GOFILES_netbsd+=path_unix.go
を追加しました。path/filepath
パッケージがNetBSD上でpath_unix.go
をコンパイルに含めるようにします。これは、Unix系システムでのファイルパス操作に関連します。
-
src/pkg/runtime/Makefile
の変更:OFILES_netbsd+=lock_sema.$O
を追加しました。これは、GoのランタイムがNetBSD上でセマフォベースのロックメカニズムを使用することを示しています。$O
はオブジェクトファイルを示すプレースホルダです。
-
src/pkg/syscall/Makefile
の変更:GOFILES_netbsd
変数に、NetBSD上でsyscall
パッケージがコンパイルに含めるべきGoソースファイル(bpf_bsd.go
,env_unix.go
,route_bsd.go
,route_netbsd.go
,syscall_bsd.go
,zsysctl_netbsd.go
など)をリストアップしました。これは、NetBSDのシステムコール、環境変数、ルーティングテーブル、ソケットメッセージ、sysctl
インターフェースなどをGoのsyscall
パッケージが直接利用できるようにするために最も重要な変更の一つです。
-
src/pkg/time/Makefile
の変更:GOFILES_netbsd+=sys_unix.go
とzoneinfo_unix.go
を追加しました。time
パッケージがNetBSD上でこれらのファイルをコンパイルに含めるようにします。これらは、Unix系システムでの時刻取得やタイムゾーン情報の処理に関連します。
これらの変更は、NetBSDのシステム特性に合わせてGoの標準ライブラリが適切に動作するように、OS固有のコードパスを有効にするためのものです。特に、net
、os
、syscall
パッケージにおける変更は、GoアプリケーションがNetBSDの基本的なシステム機能と効果的に連携するために不可欠です。
コアとなるコードの変更箇所
--- a/src/Make.inc
+++ b/src/Make.inc
@@ -33,6 +33,7 @@ GOOS_LIST=\
darwin\
freebsd\
linux\
+\tnetbsd\
openbsd\
plan9\
windows\
@@ -138,6 +139,9 @@ endif
ifeq ($(GOOS),openbsd) # ... and not on OpenBSD
CGO_ENABLED:=0
endif
+ifeq ($(GOOS),netbsd) # ... and not on NetBSD
+CGO_ENABLED:=0
+endif
endif
# Make environment more standard.
--- a/src/pkg/net/Makefile
+++ b/src/pkg/net/Makefile
@@ -104,6 +104,27 @@ else
GOFILES_linux+=cgo_stub.go
endif
+GOFILES_netbsd=\
+\tdnsclient_unix.go\\\
+\tdnsconfig.go\\\
+\tfd.go\\\
+\tfd_$(GOOS).go\\\
+\tfile.go\\\
+\tinterface_bsd.go\\\
+\tinterface_openbsd.go\\\
+\tiprawsock_posix.go\\\
+\tipsock_posix.go\\\
+\tlookup_unix.go\\\
+\tnewpollserver.go\\\
+\tport.go\\\
+\tsendfile_stub.go\\\
+\tsock.go\\\
+\tsock_bsd.go\\\
+\ttcpsock_posix.go\\\
+\tudpsock_posix.go\\\
+\tunixsock_posix.go\\\
+\tcgo_stub.go\\\
+\
GOFILES_openbsd=\
\tdnsclient_unix.go\\\
\tdnsconfig.go\\\
--- a/src/pkg/syscall/Makefile
+++ b/src/pkg/syscall/Makefile
@@ -45,6 +45,17 @@ GOFILES_linux=\
\tsockcmsg_unix.go\\\
\tsyscall_unix.go\\\
\
+GOFILES_netbsd=\
+\tbpf_bsd.go\\\
+\tenv_unix.go\\\
+\texec_unix.go\\\
+\troute_bsd.go\\\
+\troute_netbsd.go\\\
+\tsockcmsg_unix.go\\\
+\tsyscall_bsd.go\\\
+\tsyscall_unix.go\\\
+\tzsysctl_netbsd.go\\\
+\
GOFILES_openbsd=\
\tbpf_bsd.go\\\
\tenv_unix.go\\\
コアとなるコードの解説
src/Make.inc
の変更
GOOS_LIST
へのnetbsd
の追加: これは、GoのビルドシステムがNetBSDを公式にサポート対象のオペレーティングシステムとして認識するための最も基本的な変更です。これにより、GOOS=netbsd
としてGoをビルドできるようになります。CGO_ENABLED:=0
for NetBSD: NetBSD環境でのGoのビルドにおいて、Cgo(C言語との連携機能)を無効に設定しています。これは、NetBSDのCライブラリとのリンケージやシステムコールインターフェースの複雑さを初期段階で回避し、純粋なGoコードのビルドを優先するための戦略です。これにより、GoのランタイムがNetBSDのシステムコールを直接呼び出すのではなく、Go自身が提供する抽象化レイヤーを通じてOS機能にアクセスすることになります。
src/pkg/net/Makefile
の変更
GOFILES_netbsd
変数の追加とファイルリスト:net
パッケージは、ネットワーク通信(TCP/IP、UDP、DNSなど)を扱うGoの標準ライブラリの中核です。この変更では、NetBSD固有のネットワーク機能に対応するための多数のGoソースファイルがGOFILES_netbsd
にリストアップされています。dnsclient_unix.go
,dnsconfig.go
,lookup_unix.go
: DNS解決に関連するファイルで、Unix系システムでの名前解決メカニズムに対応します。fd.go
,fd_$(GOOS).go
,file.go
: ファイルディスクリプタの管理やファイル操作に関連します。fd_$(GOOS).go
はOS固有のファイルディスクリプタ処理を提供します。interface_bsd.go
,interface_openbsd.go
: ネットワークインターフェース情報の取得に関連します。NetBSDはBSD系OSであるため、BSD共通のインターフェースやOpenBSDと共通のインターフェースを利用する可能性があります。iprawsock_posix.go
,ipsock_posix.go
,tcpsock_posix.go
,udpsock_posix.go
,unixsock_posix.go
: 各種ソケットタイプ(IPRAW、IP、TCP、UDP、Unixドメインソケット)のPOSIX準拠の実装です。newpollserver.go
: ネットワークI/Oの多重化(poll
システムコールなど)に関連するサーバーサイドの処理です。port.go
: ポート番号の管理に関連します。sendfile_stub.go
:sendfile
システムコール(ファイルを直接ソケットに送信する効率的な方法)のスタブ実装です。NetBSDでsendfile
がサポートされていないか、Cgoなしでは利用できない場合に備えたものです。sock.go
,sock_bsd.go
: 一般的なソケット操作やBSD系OS固有のソケット処理に関連します。cgo_stub.go
: Cgoが有効でない場合に、Cgo関連の関数呼び出しを代替するためのスタブです。CGO_ENABLED:=0
と連携して機能します。
これらのファイルは、NetBSDのネットワークスタックとGoのnet
パッケージがシームレスに連携するために不可欠な、OS固有のインターフェースやシステムコールラッパーを提供します。
src/pkg/syscall/Makefile
の変更
GOFILES_netbsd
変数の追加とファイルリスト:syscall
パッケージは、Goから直接OSのシステムコールを呼び出すための低レベルなインターフェースを提供します。この変更は、NetBSDのシステムコールインターフェースに特化した多数のGoソースファイルを追加しています。bpf_bsd.go
: Berkeley Packet Filter (BPF) に関連するBSD系OS固有のコードです。ネットワークパケットのキャプチャなどに使用されます。env_unix.go
: 環境変数の操作に関連するUnix系コードです。exec_unix.go
: プロセスの実行(exec
システムコール)に関連するUnix系コードです。route_bsd.go
,route_netbsd.go
: ルーティングテーブルの操作に関連するBSD系およびNetBSD固有のコードです。sockcmsg_unix.go
: ソケットの制御メッセージ(cmsg
)に関連するUnix系コードです。syscall_bsd.go
,syscall_unix.go
: BSD系およびUnix系システムコール全般のラッパーや定義です。zsysctl_netbsd.go
: NetBSD固有のsysctl
インターフェース(カーネルパラメータの動的な読み書き)に関連するコードです。
これらのファイルは、GoがNetBSDの低レベルなOS機能にアクセスし、ファイルシステム、プロセス管理、ネットワーク、デバイス操作などを行うための基盤を提供します。特にzsysctl_netbsd.go
は、NetBSDのカーネルとの直接的な対話に特化した重要なファイルです。
関連リンク
- https://golang.org/cl/5476048 (Go Code Review)
参考にした情報源リンク
- Go言語の公式ドキュメント (Goのビルドシステム、
GOOS
,GOARCH
, Cgoに関する情報) - NetBSDプロジェクトの公式ウェブサイト (NetBSDの特性と移植性に関する情報)
- Unix系OSのシステムプログラミングに関する一般的な知識 (ファイルディスクリプタ、ソケット、システムコールなど)
- BSD系OSのネットワークスタックに関する情報 (特に
net
パッケージとsyscall
パッケージの理解のため) - Gitのコミットログと差分表示の読み方
- Makefileの構文とGoのビルドにおける役割