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

[インデックス 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: ビルド対象のオペレーティングシステムを指定します。例えば、linuxdarwin(macOS)、windowsfreebsdなどがあります。このコミットでは、新たにnetbsdが追加されています。
  • GOARCH: ビルド対象のCPUアーキテクチャを指定します。例えば、amd64arm386などがあります。

Goのソースコード内では、ファイル名に_GOOS.go_GOOS_GOARCH.goといったサフィックスを付けることで、特定のOSやアーキテクチャに特化したコードを記述できます。ビルド時には、GOOSGOARCHの値に基づいて適切なファイルが選択され、コンパイルされます。

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ファイルを変更しています。主な変更点は以下の通りです。

  1. src/Make.incの変更:

    • GOOS_LIST変数にnetbsdを追加し、GoがサポートするOSのリストにNetBSDを含めるようにしました。
    • NetBSDの場合にCGO_ENABLED0に設定する条件を追加しました。これは、NetBSD上でのGoのビルドにおいて、Cgo(C言語との連携)を無効にすることを意味します。これにより、初期段階でのCgo関連の複雑さを回避し、純粋なGoコードのビルドを優先します。
  2. src/cmd/cov/Makefileおよびsrc/cmd/prof/Makefileの変更:

    • install-netbsd: install-defaultという行を追加し、cov(カバレッジツール)とprof(プロファイリングツール)のインストールプロセスがNetBSDでもデフォルトのインストール手順に従うようにしました。
  3. src/pkg/crypto/tls/Makefileの変更:

    • GOFILES_netbsd+=root_unix.goを追加しました。これは、crypto/tlsパッケージがNetBSD上でroot_unix.goというファイルをコンパイルに含めることを意味します。このファイルは通常、Unix系システムでのルート証明書の処理に関連します。
  4. src/pkg/mime/Makefileの変更:

    • GOFILES_netbsd+=type_unix.goを追加しました。mimeパッケージがNetBSD上でtype_unix.goをコンパイルに含めるようにします。これは、Unix系システムでのMIMEタイプ検出に関連するファイルです。
  5. 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).gointerface_openbsd.go(NetBSDもOpenBSDと一部共通のBSD系インターフェースを持つため)といったOS固有のファイルが含まれています。
  6. 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パッケージが適切に利用できるようにするために必要です。
  7. src/pkg/os/exec/Makefileの変更:

    • GOFILES_netbsd+=lp_unix.goを追加しました。os/execパッケージがNetBSD上でlp_unix.goをコンパイルに含めるようにします。これは、Unix系システムでの実行可能ファイルのパス解決(lookPath)に関連します。
  8. src/pkg/path/filepath/Makefileの変更:

    • GOFILES_netbsd+=path_unix.goを追加しました。path/filepathパッケージがNetBSD上でpath_unix.goをコンパイルに含めるようにします。これは、Unix系システムでのファイルパス操作に関連します。
  9. src/pkg/runtime/Makefileの変更:

    • OFILES_netbsd+=lock_sema.$Oを追加しました。これは、GoのランタイムがNetBSD上でセマフォベースのロックメカニズムを使用することを示しています。$Oはオブジェクトファイルを示すプレースホルダです。
  10. 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パッケージが直接利用できるようにするために最も重要な変更の一つです。
  11. src/pkg/time/Makefileの変更:

    • GOFILES_netbsd+=sys_unix.gozoneinfo_unix.goを追加しました。timeパッケージがNetBSD上でこれらのファイルをコンパイルに含めるようにします。これらは、Unix系システムでの時刻取得やタイムゾーン情報の処理に関連します。

これらの変更は、NetBSDのシステム特性に合わせてGoの標準ライブラリが適切に動作するように、OS固有のコードパスを有効にするためのものです。特に、netossyscallパッケージにおける変更は、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のカーネルとの直接的な対話に特化した重要なファイルです。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント (Goのビルドシステム、GOOS, GOARCH, Cgoに関する情報)
  • NetBSDプロジェクトの公式ウェブサイト (NetBSDの特性と移植性に関する情報)
  • Unix系OSのシステムプログラミングに関する一般的な知識 (ファイルディスクリプタ、ソケット、システムコールなど)
  • BSD系OSのネットワークスタックに関する情報 (特にnetパッケージとsyscallパッケージの理解のため)
  • Gitのコミットログと差分表示の読み方
  • Makefileの構文とGoのビルドにおける役割