[インデックス 10784] ファイルの概要
このコミットは、Go言語の標準ライブラリ crypto/tls
パッケージ内の2つのファイル、root_stub.go
と root_unix.go
に変更を加えています。具体的には、Goのビルドシステム (go/build
) との互換性を確保するために、ビルドタグ(build tags)が追加されています。
コミット
- Author: Russ Cox rsc@golang.org
- Date: Wed Dec 14 10:25:48 2011 -0500
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/d842acd57ed2633478cb46bbb4c18271ec62f36a
元コミット内容
crypto/tls: make compatible with go/build
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/5484073
変更の背景
このコミットの主な目的は、crypto/tls
パッケージがGoのビルドシステム (go/build
) と互換性を持つようにすることです。Go言語では、異なるオペレーティングシステムやアーキテクチャ向けにコードを条件付きでコンパイルするメカニズムとして「ビルドタグ(build tags)」が提供されています。
crypto/tls
パッケージは、TLS(Transport Layer Security)プロトコルを実装しており、特にルート証明書の管理はOSに依存する部分があります。例えば、Unix系システムではシステムが提供する証明書ストアを利用し、それ以外のシステム(例えばPlan 9)では異なるアプローチを取る必要があります。
このコミット以前は、これらのファイルが特定のOS向けに適切に選択されるための明示的な指示が不足していた可能性があります。その結果、go build
コマンドがどのファイルをコンパイルに含めるべきかを正確に判断できず、ビルドエラーや意図しない動作を引き起こす可能性がありました。
この変更により、root_stub.go
はPlan 9向け、root_unix.go
はFreeBSD、Linux、OpenBSD、NetBSDといったUnix系システム向けにそれぞれコンパイルされるように明示的に指定され、go/build
パッケージがこれらのファイルを正しく処理できるようになります。これにより、クロスプラットフォームでのビルドの堅牢性が向上します。
前提知識の解説
Goのビルドシステム (go/build
)
go/build
パッケージは、Go言語のソースコードを解析し、パッケージの依存関係を解決し、ビルドプロセスを管理するためのGoツールチェーンの中核をなす部分です。go build
コマンドや go install
コマンドなどが内部でこのパッケージを利用しています。go/build
は、ソースファイルのパス、パッケージ名、インポートパス、そしてビルドタグなどの情報を読み取り、どのファイルをコンパイルに含めるべきかを決定します。
Goのビルドタグ (Build Tags)
Go言語には、特定のビルド条件に基づいてソースファイルを条件付きでコンパイルに含めるための「ビルドタグ」という機能があります。これは、ファイルの先頭に // +build tagname
の形式でコメントとして記述されます。
- 構文:
// +build tag1 tag2
または// +build tag1,tag2
- スペースで区切られたタグは論理OR (
||
) として扱われます。つまり、tag1
またはtag2
のいずれかが有効な場合にファイルがコンパイルされます。 - カンマで区切られたタグは論理AND (
&&
) として扱われます。つまり、tag1
とtag2
の両方が有効な場合にファイルがコンパイルされます。
- スペースで区切られたタグは論理OR (
- 一般的なタグ:
- オペレーティングシステム名(例:
linux
,windows
,darwin
,freebsd
,plan9
など) - アーキテクチャ名(例:
amd64
,arm
,386
など) - Goのバージョン(例:
go1.18
) - カスタムタグ:
go build -tags "mytag"
のように-tags
フラグを使って独自のタグを指定することもできます。
- オペレーティングシステム名(例:
// +build ignore
: このタグが指定されたファイルは、go build
コマンドによって無視されます。これは、例えば実行可能な例やテストコードをメインのビルドから除外したい場合などに使用されます。
ビルドタグは、クロスプラットフォーム開発において、OS固有のAPI呼び出しやファイルパスの処理など、プラットフォームに依存するコードを適切に分離し、管理するために不可欠な機能です。
技術的詳細
このコミットでは、crypto/tls
パッケージ内の2つのファイルにビルドタグが追加されています。
-
src/pkg/crypto/tls/root_stub.go
:// +build plan9
この行は、このファイルがPlan 9オペレーティングシステム向けにのみコンパイルされるべきであることを示しています。Plan 9は、ベル研究所で開発された分散オペレーティングシステムであり、Go言語の初期開発に影響を与えました。Goの標準ライブラリには、Plan 9向けの特定のスタブ(最小限の実装)や代替実装が含まれることがあります。
root_stub.go
は、おそらくPlan 9環境でルート証明書を扱うための最小限の、あるいはプラットフォーム固有の機能を提供しないプレースホルダー的な実装であると推測されます。 -
src/pkg/crypto/tls/root_unix.go
:// +build freebsd linux openbsd netbsd
この行は、このファイルがFreeBSD、Linux、OpenBSD、NetBSDのいずれかのオペレーティングシステム向けにコンパイルされるべきであることを示しています。これらはすべてUnix系のOSであり、多くの場合、ルート証明書の管理方法(例:
/etc/ssl/certs
や/usr/share/ca-certificates
などのディレクトリに証明書が配置される)に共通点があります。root_unix.go
は、これらのUnix系システムで共通のルート証明書ストアを読み込むためのロジックを実装していると考えられます。
これらのビルドタグの追加により、go build
コマンドは、ターゲットとするOSに応じて適切な root_*.go
ファイルを選択し、コンパイルに含めることができるようになります。例えば、Linux上でビルドする場合、root_unix.go
がコンパイルされ、root_stub.go
は無視されます。これにより、不要なコードのコンパイルを防ぎ、プラットフォーム固有の依存関係を適切に管理できます。
コアとなるコードの変更箇所
--- a/src/pkg/crypto/tls/root_stub.go
+++ b/src/pkg/crypto/tls/root_stub.go
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+// +build plan9
+
package tls
func initDefaultRoots() {
--- a/src/pkg/crypto/tls/root_unix.go
+++ b/src/pkg/crypto/tls/root_unix.go
@@ -2,6 +2,8 @@
// 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
+
package tls
import (
コアとなるコードの解説
変更は非常にシンプルで、各ファイルの2行目と3行目の間に新しい行が挿入され、ビルドタグが追加されています。
-
src/pkg/crypto/tls/root_stub.go
:// +build plan9
が追加されました。これにより、このファイルはPlan 9環境でのみビルド対象となります。他のOSでビルドする際には、このファイルはコンパイルされません。これは、Plan 9が他のUnix系システムとは異なるファイルシステム構造や証明書管理メカニズムを持つため、専用のスタブ実装が必要であることを示唆しています。 -
src/pkg/crypto/tls/root_unix.go
:// +build freebsd linux openbsd netbsd
が追加されました。これにより、このファイルはFreeBSD、Linux、OpenBSD、NetBSDのいずれかの環境でビルド対象となります。これらのOSは、多くの場合、共通の証明書管理アプローチを採用しているため、単一のファイルで対応できます。
これらの変更は、Goのビルドシステムが、特定のOS向けに設計されたコードを正確に識別し、適切な環境でのみコンパイルするようにするための標準的なプラクティスです。これにより、crypto/tls
パッケージのクロスプラットフォーム互換性と堅牢性が向上します。
関連リンク
- Go言語公式ドキュメント: https://go.dev/
- Go Modules (ビルドタグに関する情報も含まれる): https://go.dev/blog/using-go-modules
- Go Command Documentation (
go build
): https://go.dev/cmd/go/
参考にした情報源リンク
- Go Build Constraints (ビルドタグの詳細): https://go.dev/cmd/go/#hdr-Build_constraints
- Go Source Code (GitHub): https://github.com/golang/go
- Go CL 5484073: https://golang.org/cl/5484073 (元のコミットメッセージに記載されている変更リストへのリンク)
- Plan 9 from Bell Labs: https://plan9.bell-labs.com/plan9/ (Plan 9に関する一般的な情報)