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

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

このコミットは、Go言語の標準ライブラリ crypto/tls パッケージ内の2つのファイル、root_stub.goroot_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 (&&) として扱われます。つまり、tag1tag2 の両方が有効な場合にファイルがコンパイルされます。
  • 一般的なタグ:
    • オペレーティングシステム名(例: 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つのファイルにビルドタグが追加されています。

  1. src/pkg/crypto/tls/root_stub.go:

    // +build plan9
    

    この行は、このファイルがPlan 9オペレーティングシステム向けにのみコンパイルされるべきであることを示しています。Plan 9は、ベル研究所で開発された分散オペレーティングシステムであり、Go言語の初期開発に影響を与えました。Goの標準ライブラリには、Plan 9向けの特定のスタブ(最小限の実装)や代替実装が含まれることがあります。root_stub.go は、おそらくPlan 9環境でルート証明書を扱うための最小限の、あるいはプラットフォーム固有の機能を提供しないプレースホルダー的な実装であると推測されます。

  2. 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 パッケージのクロスプラットフォーム互換性と堅牢性が向上します。

関連リンク

参考にした情報源リンク