[インデックス 17377] ファイルの概要
このコミットは、Go言語の標準ライブラリがDragonFly BSDオペレーティングシステム上で完全にビルドおよび動作するようにするための変更を導入しています。具体的には、crypto
、mime
、path
、time
といったパッケージがDragonFly BSDをサポートするように、ビルドタグの追加と、一部のOS固有のパス設定の更新が行われています。これにより、Go言語のクロスプラットフォーム対応がさらに強化されました。
コミット
commit 4186e9d31321128322e3eaaa27c66fb8e8b7df63
Author: Joel Sing <jsing@google.com>
Date: Sat Aug 24 02:22:52 2013 +1000
all: dragonfly support
Enable remaining packages (crypto, mime, path, time) to build on dragonfly.
R=bradfitz
CC=golang-dev
https://golang.org/cl/13190043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/4186e9d31321128322e3eaaa27c66fb8e8b7df63
元コミット内容
Go言語の全てのパッケージがDragonFly BSD上でビルドできるように、残りのパッケージ(crypto
、mime
、path
、time
)にDragonFly BSDのサポートを追加する。
変更の背景
Go言語は設計当初からクロスプラットフォーム対応を重視しており、様々なオペレーティングシステム(OS)やアーキテクチャで動作することを目指しています。このコミットが行われた2013年当時、Goは既にLinux、macOS (Darwin)、FreeBSD、OpenBSD、NetBSD、Plan 9といった主要なUnix系OSをサポートしていましたが、DragonFly BSDはまだ完全なサポート対象ではありませんでした。
Goの標準ライブラリには、OS固有の機能(例: 乱数生成、証明書ストアのパス、MIMEタイプの検出、ファイルパスの処理、システム時刻の取得など)に依存する部分が多く存在します。これらの機能はOSごとに実装が異なるため、Goのコードベースではビルドタグ(build tags)を用いてOS固有のファイルを条件付きでコンパイルする仕組みが採用されています。
このコミットの背景には、Go言語のコミュニティがDragonFly BSD上でのGoの利用を可能にし、より広範なユーザーベースと開発環境をサポートしようとする意図がありました。既存のパッケージでは、DragonFly BSD固有のビルドタグが不足していたり、必要なOS固有のパスが定義されていなかったりしたため、これらのパッケージがDragonFly BSD上で正しくビルド・動作しない問題がありました。本コミットは、これらの残された課題を解決し、GoのDragonFly BSDサポートを完成させることを目的としています。
前提知識の解説
DragonFly BSD
DragonFly BSDは、FreeBSD 4.8からフォーク(分岐)して開発されたオープンソースのUnix系オペレーティングシステムです。2003年にMatthew Dillonによって開始され、特にSMP(Symmetric Multi-Processing)環境でのパフォーマンスとスケーラビリティの向上、新しいファイルシステム(HAMMERファイルシステム)の導入、軽量カーネルスレッド(LWKT)の採用などを特徴としています。FreeBSDとは異なる設計思想や技術的アプローチを持つため、Goのようなクロスプラットフォーム言語が完全にサポートするためには、個別の対応が必要となる場合があります。
Go言語のビルドタグ(Build Tags)
Go言語には、特定の環境(OS、アーキテクチャ、Goのバージョンなど)でのみコンパイルされるコードを記述するための「ビルドタグ」という仕組みがあります。これは、ソースファイルの先頭に// +build tag1 tag2
のような形式でコメントとして記述されます。Goコンパイラは、ビルド時に指定された環境に対応するタグを持つファイルのみをコンパイル対象とします。
例えば、// +build linux
と書かれたファイルはLinux環境でのみコンパイルされ、// +build darwin freebsd
と書かれたファイルはmacOSとFreeBSD環境でのみコンパイルされます。これにより、OSごとに異なるシステムコールやライブラリを使用するコードを、単一のGoプロジェクト内で管理することが可能になります。
影響を受けるGo標準パッケージの概要
crypto/rand
: 暗号学的に安全な乱数を生成するためのパッケージです。Unix系システムでは通常、/dev/urandom
や/dev/random
といったデバイスから乱数バイトを読み取ります。OSごとにこれらのデバイスへのアクセス方法や、乱数生成器の初期化方法が異なる場合があります。crypto/x509
: X.509証明書とPKIX(Public Key Infrastructure X.509)を扱うパッケージです。SSL/TLS通信などで使用される証明書の検証には、システムにインストールされている信頼されたルート証明書(CA証明書)のパスを知る必要があります。これらの証明書はOSによって異なるディレクトリに配置されています。mime
: MIME(Multipurpose Internet Mail Extensions)タイプを検出するためのパッケージです。ファイルの内容や拡張子に基づいてMIMEタイプを推測する機能を提供します。OSによっては、MIMEタイプとファイル拡張子のマッピング情報が異なる場所に格納されていることがあります。path/filepath
: ファイルパスを操作するためのパッケージです。パスの結合、クリーンアップ、絶対パスへの変換、ファイル名やディレクトリ名の抽出など、OSに依存しないパス操作機能を提供します。しかし、パスの区切り文字(/
や\
)や、ルートディレクトリの概念など、一部OS固有の考慮が必要な場合があります。time
: 時刻を扱うパッケージです。システム時刻の取得、タイムゾーン情報の処理、時刻のフォーマットなどを行います。特にタイムゾーン情報は、OSによってその情報が格納されているファイルのパスが異なります。
技術的詳細
このコミットの技術的な核心は、Go言語のビルドタグメカニズムを効果的に利用して、DragonFly BSD固有のビルド要件を満たしている点にあります。
Goの標準ライブラリでは、多くのOS固有の機能が_unix.go
というサフィックスを持つファイルに集約されています。これらのファイルは、複数のUnix系OSで共通のロジックを共有しつつ、必要に応じてビルドタグで特定のOSに限定されるように設計されています。
本コミットでは、以下のファイルに対して変更が加えられています。
src/pkg/crypto/rand/rand_unix.go
src/pkg/crypto/x509/root_unix.go
src/pkg/mime/type_unix.go
src/pkg/path/filepath/path_unix.go
src/pkg/time/sys_unix.go
src/pkg/time/zoneinfo_unix.go
これらのファイルは、Goのビルドシステムが特定のOS向けにコンパイルする際に選択されるべきファイルです。変更内容は主に2つのパターンに分けられます。
- ビルドタグへの
dragonfly
の追加: ほとんどのファイルで、既存の// +build
行にdragonfly
タグが追加されています。これは、これらのファイルが既に他のUnix系OS(darwin, freebsd, linux, netbsd, openbsd, plan9など)向けに共通のロジックを提供しており、DragonFly BSDもそのロジックを共有できることを意味します。dragonfly
タグを追加することで、GoコンパイラはDragonFly BSD環境でビルドする際にこれらのファイルを適切に含めるようになります。 crypto/x509/root_unix.go
における証明書パスの追加/修正:crypto/x509
パッケージは、システムにインストールされている信頼されたルート証明書を読み込む必要があります。root_unix.go
ファイル内のcertFiles
変数には、一般的なUnix系OSにおけるCA証明書ファイルのパスがリストされています。このコミットでは、FreeBSDで使用されるパス/usr/local/share/certs/ca-root-nss.crt
がDragonFly BSDでも有効であることが確認されたため、コメントに// FreeBSD/DragonFly
と追記されています。これは、DragonFly BSDがFreeBSDからフォークした経緯から、ファイルシステムのレイアウトや標準的なパスがFreeBSDと類似していることを示唆しています。
これらの変更により、GoのビルドシステムはDragonFly BSD環境でこれらのパッケージを正しくコンパイルし、必要なOS固有の機能にアクセスできるようになります。
コアとなるコードの変更箇所
src/pkg/crypto/rand/rand_unix.go
--- a/src/pkg/crypto/rand/rand_unix.go
+++ b/src/pkg/crypto/rand/rand_unix.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.\n
-// +build darwin freebsd linux netbsd openbsd plan9
+// +build darwin dragonfly freebsd linux netbsd openbsd plan9
// Unix cryptographically secure pseudorandom number
// generator.
src/pkg/crypto/x509/root_unix.go
--- a/src/pkg/crypto/x509/root_unix.go
+++ b/src/pkg/crypto/x509/root_unix.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.\n
-// +build freebsd linux openbsd netbsd
+// +build dragonfly freebsd linux openbsd netbsd
package x509
@@ -14,7 +14,7 @@ var certFiles = []string{\n \t\"/etc/pki/tls/certs/ca-bundle.crt\", // Fedora/RHEL\n \t\"/etc/ssl/ca-bundle.pem\", // OpenSUSE\n \t\"/etc/ssl/cert.pem\", // OpenBSD\n-\t\"/usr/local/share/certs/ca-root-nss.crt\", // FreeBSD\n+\t\"/usr/local/share/certs/ca-root-nss.crt\", // FreeBSD/DragonFly\n }\n
func (c *Certificate) systemVerify(opts *VerifyOptions) (chains [][]*Certificate, err error) {\n```
### `src/pkg/mime/type_unix.go`
```diff
--- a/src/pkg/mime/type_unix.go
+++ b/src/pkg/mime/type_unix.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.\n
-// +build darwin freebsd linux netbsd openbsd
+// +build darwin dragonfly freebsd linux netbsd openbsd
package mime
src/pkg/path/filepath/path_unix.go
--- a/src/pkg/path/filepath/path_unix.go
+++ b/src/pkg/path/filepath/path_unix.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.\n
-// +build darwin freebsd linux netbsd openbsd
+// +build darwin dragonfly freebsd linux netbsd openbsd
package filepath
src/pkg/time/sys_unix.go
--- a/src/pkg/time/sys_unix.go
+++ b/src/pkg/time/sys_unix.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.\n
-// +build darwin freebsd linux netbsd openbsd
+// +build darwin dragonfly freebsd linux netbsd openbsd
package time
src/pkg/time/zoneinfo_unix.go
--- a/src/pkg/time/zoneinfo_unix.go
+++ b/src/pkg/time/zoneinfo_unix.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.\n
-// +build darwin freebsd linux netbsd openbsd
+// +build darwin dragonfly freebsd linux netbsd openbsd
// Parse "zoneinfo" time zone file.
// This is a fairly standard file format used on OS X, Linux, BSD, Sun, and others.
コアとなるコードの解説
このコミットの主要な変更は、Goのビルドタグにdragonfly
を追加することです。
-
// +build
行へのdragonfly
の追加:src/pkg/crypto/rand/rand_unix.go
、src/pkg/mime/type_unix.go
、src/pkg/path/filepath/path_unix.go
、src/pkg/time/sys_unix.go
、src/pkg/time/zoneinfo_unix.go
の各ファイルでは、既存のビルドタグのリスト(例:darwin freebsd linux netbsd openbsd plan9
)にdragonfly
が追加されています。 これは、これらのファイルに含まれるUnix系OS共通のコードが、DragonFly BSD環境でも適切に機能することをGoコンパイラに指示します。これにより、GoのビルドプロセスはDragonFly BSD向けにコンパイルする際に、これらのOS固有の共通実装を自動的に選択するようになります。結果として、これらのパッケージがDragonFly BSD上で正しくビルドされ、期待通りに動作するようになります。 -
src/pkg/crypto/x509/root_unix.go
におけるcertFiles
のコメント更新:src/pkg/crypto/x509/root_unix.go
では、信頼されたルート証明書が格納されている可能性のあるパスのリストcertFiles
が定義されています。 変更前:"/usr/local/share/certs/ca-root-nss.crt", // FreeBSD
変更後:"/usr/local/share/certs/ca-root-nss.crt", // FreeBSD/DragonFly
この変更は、/usr/local/share/certs/ca-root-nss.crt
というパスがFreeBSDだけでなく、DragonFly BSDでもCA証明書ストアとして使用されることを明示しています。これは、Goのcrypto/x509
パッケージがDragonFly BSD上で証明書を検証する際に、このパスを探索対象に含めることを保証します。これにより、DragonFly BSD環境でGoアプリケーションがSSL/TLS通信を行う際に、システムにインストールされた証明書を正しく利用できるようになります。
これらの変更は、Go言語のクロスプラットフォーム戦略における重要なステップであり、特定のOS(この場合はDragonFly BSD)に対するサポートを、既存の共通コードベースを最大限に活用しつつ、最小限の変更で実現するGoの設計思想を反映しています。
関連リンク
- Go CL 13190043: https://golang.org/cl/13190043
参考にした情報源リンク
- DragonFly BSD 公式サイト: https://www.dragonflybsd.org/
- Go言語のビルドタグに関する公式ドキュメント (Go 1.18以降の
go:build
ディレクティブについて): https://go.dev/cmd/go/#hdr-Build_constraints (注: コミット当時のGoバージョンでは// +build
形式が使用されていました) - Go言語のクロスコンパイルに関する情報: https://go.dev/doc/install/source#environment
- X.509証明書とPKIの基本概念: https://ja.wikipedia.org/wiki/X.509
- MIMEタイプに関する情報: https://ja.wikipedia.org/wiki/Multipurpose_Internet_Mail_Extensions
- Unix系OSにおける乱数デバイス: https://ja.wikipedia.org/wiki//dev/random