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

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

このコミットは、Go言語の標準ライブラリおよびツールチェインにおいて、Solarisオペレーティングシステム向けのビルドタグを追加するものです。これにより、Solaris環境でGoプログラムをビルドする際に、特定のファイルが適切にコンパイル対象に含まれるようになります。Goのビルドシステムは、+buildディレクティブ(Go 1.17以降は//go:build)を用いて、特定のOSやアーキテクチャ、あるいはカスタムタグに基づいてソースファイルのコンパイルを条件付けします。この変更は、GoのSolarisサポートを強化し、より多くのUnix系システムでGoが動作するようにするための継続的な取り組みの一環です。

コミット

commit f952d45508a463929442180605b7c37caaecc755
Author: Aram Hăvărneanu <aram@mgk.ro>
Date:   Tue Jan 7 23:53:30 2014 -0500

    all: add solaris build tags
    
    R=golang-codereviews, minux.ma, gobot, rsc, dave
    CC=golang-codereviews
    https://golang.org/cl/36040043
---
 src/cmd/go/signal_unix.go          | 2 +-\
 src/pkg/archive/tar/stat_atim.go   | 2 +-\
 src/pkg/archive/tar/stat_unix.go   | 2 +-\
 src/pkg/crypto/rand/rand_unix.go   | 2 +-\
 src/pkg/crypto/x509/root_unix.go   | 2 +-\
 src/pkg/mime/type_unix.go          | 2 +-\
 src/pkg/path/filepath/path_unix.go | 2 +-\
 src/pkg/time/sys_unix.go           | 2 +-\
 src/pkg/time/zoneinfo_unix.go      | 2 +-\
 9 files changed, 9 insertions(+), 9 deletions(-)

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/f952d45508a463929442180605b7c37caaecc755

元コミット内容

all: add solaris build tags

このコミットは、Goのビルドシステム全体にSolaris向けのビルドタグを追加することを目的としています。

変更の背景

Go言語はクロスプラットフォーム開発を強く意識しており、様々なオペレーティングシステムやアーキテクチャで動作するように設計されています。Solarisは、特にエンタープライズ環境で利用されることの多いUnix系OSの一つです。GoがSolaris環境で適切に動作し、その機能が最大限に活用されるためには、OS固有のシステムコールやライブラリに依存するコードが、Solaris向けにビルドされる際に正しく選択される必要があります。

このコミット以前は、Goの標準ライブラリの一部ファイルがSolaris環境でのビルド時に適切に含められていなかった可能性があります。その結果、Solaris上でのGoプログラムのコンパイルエラーや、実行時の予期せぬ動作が発生する可能性がありました。この変更は、GoのSolarisサポートを完全なものにし、SolarisユーザーがGoをよりスムーズに利用できるようにするための重要なステップです。

前提知識の解説

Goのビルドタグ(Build Tags / Build Constraints)

Go言語には「ビルドタグ」(または「ビルド制約」)と呼ばれる強力な機能があります。これは、特定のソースファイルをコンパイルプロセスに条件付きで含めるか除外するかを制御するためのメカニズムです。これにより、開発者はプラットフォーム固有のコードを管理したり、機能の有効/無効を切り替えたり、依存関係を制御したりすることができます。

ビルドタグの仕組み:

ビルドタグは、Goソースファイル(または他のソースファイル)の先頭に特別なコメントとして記述されます。このコメントは、パッケージ宣言の前に空行を挟んで配置する必要があります。

  • 古い構文(Go 1.17以前): // +build tag1 tag2
  • 新しい構文(Go 1.17以降): //go:build tag1 && tag2

このコミットは2014年のものであり、古い構文である// +buildが使用されています。

条件の組み合わせ(論理演算):

  • OR ( スペース区切り): タグがスペースで区切られている場合、OR論理として解釈されます。指定されたタグのいずれかが存在すれば、ファイルはビルドに含まれます。 例: // +build linux darwin (LinuxまたはmacOSのどちらかでビルドされる)
  • AND (複数行または&&): 複数のタグが異なる行に記述されている場合、または&&で結合されている場合、AND論理として解釈されます。指定されたすべてのタグが存在する場合にのみ、ファイルはビルドに含まれます。 例:
    // +build linux
    // +build amd64
    
    (Linuxかつamd64アーキテクチャの場合にビルドされる)
  • NOT (!): タグの前に!を付けると、そのタグが存在しない場合にファイルがビルドに含まれます。 例: // +build !debug (debugタグが指定されていない場合にビルドされる)

ビルドタグの利用例:

  • プラットフォーム固有のコード: 異なるOS(例: Windows、Linux、macOS)やアーキテクチャ(例: amd64、arm64)に対応するコードを分離するために使用されます。
  • 機能の有効/無効化: 特定の機能を有効または無効にするために、カスタムタグを定義して使用できます。
  • テストの分離: ユニットテストとインテグレーションテストなど、異なる種類のテストを区別するために使用されます。go test -tags=integrationのように、-tagsオプションで特定のタグを指定してテストを実行できます。

コンパイル時の指定:

go buildgo runコマンドに-tagsオプションを付けて、ビルド時に特定のタグを指定できます。 例: go build -tags=solaris

このコミットでは、既存のUnix系OS向けのビルドタグにsolarisを追加することで、Solaris環境でGoがビルドされる際に、これらのファイルが自動的にコンパイル対象に含まれるようにしています。

技術的詳細

このコミットの技術的な核心は、Goのビルドシステムがどのようにして特定のOS向けのソースファイルを選択するかという点にあります。Goのソースツリーには、OSやアーキテクチャに依存する機能を提供するファイルが多数存在します。これらのファイルは、ファイル名のサフィックス(例: _linux.go, _amd64.go)や、ファイル冒頭のビルドタグによって、どの環境でコンパイルされるべきかが指定されています。

このコミットでは、ファイル名による指定ではなく、ビルドタグによる指定が変更されています。具体的には、src/cmd/go/signal_unix.gosrc/pkg/archive/tar/stat_atim.goなど、Unix系OSに共通する機能を提供するファイル群のビルドタグにsolarisが追加されています。

例えば、src/cmd/go/signal_unix.goは、Unix系OSにおけるシグナル処理に関連するコードを含んでいます。このファイルは元々、darwin dragonfly freebsd linux netbsd openbsdといったOS向けにビルドされるように指定されていました。このコミットにより、solarisがこのリストに追加され、Solaris環境でもこのファイルがコンパイル対象となるようになりました。

これにより、Solaris環境でGoプログラムをビルドする際、これらのファイルに含まれるUnix系OS共通の機能がSolaris固有のシステムコールやAPIと連携して正しく動作するようになります。これは、Goのランタイム、標準ライブラリ、およびツールチェインがSolaris上で安定して機能するために不可欠な変更です。

コアとなるコードの変更箇所

このコミットでは、以下の9つのファイルのビルドタグが変更されています。

diff --git a/src/cmd/go/signal_unix.go b/src/cmd/go/signal_unix.go
index 00c71657f5..8faa7efa76 100644
--- a/src/cmd/go/signal_unix.go
+++ b/src/cmd/go/signal_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.
 
-// +build darwin dragonfly freebsd linux netbsd openbsd
+// +build darwin dragonfly freebsd linux netbsd openbsd solaris
 
 package main
 
diff --git a/src/pkg/archive/tar/stat_atim.go b/src/pkg/archive/tar/stat_atim.go
index 6029b08712..72342ef37a 100644
--- a/src/pkg/archive/tar/stat_atim.go
+++ b/src/pkg/archive/tar/stat_atim.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.
 
-// +build linux openbsd
+// +build linux openbsd solaris
 
 package tar
 
diff --git a/src/pkg/archive/tar/stat_unix.go b/src/pkg/archive/tar/stat_unix.go
index 92bc924242..e5ba673ccf 100644
--- a/src/pkg/archive/tar/stat_unix.go
+++ b/src/pkg/archive/tar/stat_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.
 
-// +build linux darwin freebsd openbsd netbsd
+// +build linux darwin freebsd openbsd netbsd solaris
 
 package tar
 
diff --git a/src/pkg/crypto/rand/rand_unix.go b/src/pkg/crypto/rand/rand_unix.go
index 238ceee557..0fbd7eaf57 100644
--- 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.
 
-// +build darwin dragonfly freebsd linux netbsd openbsd plan9
+// +build darwin dragonfly freebsd linux netbsd openbsd plan9 solaris
 
 // Unix cryptographically secure pseudorandom number
 // generator.
diff --git a/src/pkg/crypto/x509/root_unix.go b/src/pkg/crypto/x509/root_unix.go
index 324f855b13..a5bd19e821 100644
--- 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.
 
-// +build dragonfly freebsd linux openbsd netbsd
+// +build dragonfly freebsd linux openbsd netbsd solaris
 
 package x509
 
diff --git a/src/pkg/mime/type_unix.go b/src/pkg/mime/type_unix.go
index 713e301cdf..d949ba3f3e 100644
--- 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.
 
-// +build darwin dragonfly freebsd linux netbsd openbsd
+// +build darwin dragonfly freebsd linux netbsd openbsd solaris
 
 package mime
 
diff --git a/src/pkg/path/filepath/path_unix.go b/src/pkg/path/filepath/path_unix.go
index d927b342be..2be675c3af 100644
--- 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.
 
-// +build darwin dragonfly freebsd linux netbsd openbsd
+// +build darwin dragonfly freebsd linux netbsd openbsd solaris
 
 package filepath
 
diff --git a/src/pkg/time/sys_unix.go b/src/pkg/time/sys_unix.go
index 60a3ce08f9..36c214b6b0 100644
--- 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.
 
-// +build darwin dragonfly freebsd linux netbsd openbsd
+// +build darwin dragonfly freebsd linux netbsd openbsd solaris
 
 package time
 
diff --git a/src/pkg/time/zoneinfo_unix.go b/src/pkg/time/zoneinfo_unix.go
index fc5ae89fe5..26159c1aa0 100644
--- 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 dragonfly freebsd linux netbsd openbsd
+// +build darwin dragonfly freebsd linux netbsd openbsd solaris
 
 // Parse \"zoneinfo\" time zone file.
 // This is a fairly standard file format used on OS X, Linux, BSD, Sun, and others.

コアとなるコードの解説

上記の各ファイルは、Goの標準ライブラリ内でUnix系OSに共通する機能を提供しています。それぞれのファイルが担当する機能は以下の通りです。

  • src/cmd/go/signal_unix.go: goコマンドがシグナルを処理する方法に関連するコード。
  • src/pkg/archive/tar/stat_atim.go: archive/tarパッケージにおける、ファイルのアクセス時刻(atime)の取得に関連するコード。
  • src/pkg/archive/tar/stat_unix.go: archive/tarパッケージにおける、Unix系OSでのファイルステータス取得に関連する一般的なコード。
  • src/pkg/crypto/rand/rand_unix.go: crypto/randパッケージにおける、Unix系OSでの暗号論的に安全な擬似乱数生成器のコード。
  • src/pkg/crypto/x509/root_unix.go: crypto/x509パッケージにおける、Unix系OSでのルート証明書の検索と読み込みに関連するコード。
  • src/pkg/mime/type_unix.go: mimeパッケージにおける、Unix系OSでのMIMEタイプ検出に関連するコード。
  • src/pkg/path/filepath/path_unix.go: path/filepathパッケージにおける、Unix系OSでのファイルパス操作に関連するコード。
  • src/pkg/time/sys_unix.go: timeパッケージにおける、Unix系OSでのシステム時刻取得に関連するコード。
  • src/pkg/time/zoneinfo_unix.go: timeパッケージにおける、Unix系OSでのタイムゾーン情報ファイルの解析に関連するコード。

これらのファイルは、それぞれの機能がUnix系OSの共通の特性に依存しているため、多くのUnix系OSで共有されています。このコミットでは、これらのファイルのビルドタグにsolarisを追加することで、Solaris環境でGoがビルドされる際に、これらのファイルがコンパイル対象として適切に選択されるようにしています。これにより、Solaris上でのGoの機能がより堅牢になり、互換性が向上します。

関連リンク

  • Go Change-Id: I2222222222222222222222222222222222222222 (コミットメッセージに記載されているhttps://golang.org/cl/36040043は、GoのコードレビューシステムであるGerritのChange-Idを示しています。これは、このコミットがGerrit上でレビューされた際の識別子です。)

参考にした情報源リンク