[インデックス 16357] ファイルの概要
このコミットは、Go言語のAPIチェッカー (cmd/api
) において、より多くのプラットフォーム(特にOpenBSD、FreeBSD、NetBSDのARMアーキテクチャを含む)をサポートするために、API定義ファイル (api/go1.txt
) とAPIチェッカーのビルドコンテキスト (src/cmd/api/goapi.go
) を更新するものです。
コミット
commit f5d06da07229ace92d34585ff56f89b11fc95f70
Author: Shenghou Ma <minux.ma@gmail.com>
Date: Tue May 21 21:47:32 2013 +0800
cmd/api: add more platforms
as OpenBSD lacks 4 errno constants, api/go1.txt is updated so that
api check won't fail.
R=golang-dev, iant, bradfitz, r
CC=golang-dev
https://golang.org/cl/9149045
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/f5d06da07229ace92d34585ff56f89b11fc95f70
元コミット内容
cmd/api: add more platforms
as OpenBSD lacks 4 errno constants, api/go1.txt is updated so that
api check won't fail.
変更の背景
Go言語はクロスプラットフォーム対応を重視しており、様々なオペレーティングシステムとアーキテクチャで動作するように設計されています。cmd/api
ツールは、Goの標準ライブラリのAPIがGo 1互換性ガイドラインに準拠しているかを確認するために使用されます。このツールは、特定のプラットフォーム(OS/アーキテクチャの組み合わせ)で利用可能なAPIをチェックします。
このコミットが行われた当時、GoのAPIチェッカーはOpenBSDを含む一部のプラットフォームの特定のシステムコール定数(errno
定数)の差異を適切に扱えていませんでした。特にOpenBSDでは、他のUnix系システムに存在するいくつかの errno
定数が存在しないため、APIチェッカーがこれらの定数を見つけられずにエラーとなる問題がありました。
この問題を解決し、Goがより多くのプラットフォームで正しくビルドおよびテストされるようにするために、APIチェッカーが認識するプラットフォームのリストを拡張し、同時にプラットフォーム固有のAPIの差異を api/go1.txt
で適切に扱う必要がありました。
前提知識の解説
- Go 1 互換性ガイドライン: Go言語は、Go 1リリース以降、標準ライブラリのAPIの互換性を厳密に維持することを約束しています。これは、既存のGoプログラムが新しいバージョンのGoでも動作し続けることを保証するためです。
cmd/api
ツールはこの互換性をチェックするために使われます。 cmd/api
: Goの標準ライブラリのAPIがGo 1互換性ガイドラインに違反していないかをチェックするツールです。このツールは、Goのソースコードを解析し、公開されているAPI(関数、型、定数など)のリストを生成し、それをapi/go1.txt
に記述された「許可されたAPI」のリストと比較します。api/go1.txt
: Go 1互換性ガイドラインに基づいて、Goの標準ライブラリで公開されているAPIのリストを定義するファイルです。このファイルには、パッケージ名、型、関数、定数などがプラットフォームごとに記述されています。APIチェッカーは、このファイルに記載されていないAPIの変更を検出するとエラーを報告します。errno
定数: Unix系オペレーティングシステムにおいて、システムコールがエラーを返した場合に、そのエラーの種類を示すために設定されるグローバル変数errno
の値として定義される定数群です。例えば、ENOENT
(No such file or directory)、EACCES
(Permission denied) などがあります。これらの定数はOSによって定義が異なる場合があります。build.Context
: Goのビルドシステムにおいて、特定のOS、アーキテクチャ、Cgoの有効/無効などのビルド環境を定義する構造体です。cmd/api
ツールは、このbuild.Context
のリストを使用して、様々なプラットフォームでのAPIをチェックします。- OpenBSD: セキュリティを重視したUnix系オペレーティングシステムです。他のUnix系OSとは異なるシステムコールや
errno
定数のセットを持つことがあります。 - FreeBSD: 高性能で堅牢なUnix系オペレーティングシステムです。
- NetBSD: 非常に移植性の高いUnix系オペレーティングシステムで、多くの異なるハードウェアアーキテクチャで動作します。
技術的詳細
このコミットは主に2つのファイルに影響を与えています。
-
api/go1.txt
の更新:- OpenBSDで存在しない
errno
定数 (EBADMSG
,EMULTIHOP
,ENOLINK
,EPROTO
) が、pkg syscall
のグローバルな定義から削除されました。これは、これらの定数がGoの標準APIの一部としてすべてのプラットフォームで利用可能であると誤って認識されるのを防ぐためです。 - 同時に、これらの定数がDarwin (macOS)、FreeBSD、Linux、Windowsといった特定のプラットフォームの
syscall
パッケージには存在するため、それぞれのプラットフォーム固有のセクションに追記されました。これにより、APIチェッカーは各プラットフォームの実際のerrno
定数の有無を正確にチェックできるようになります。 - 具体的には、
darwin-386
,darwin-386-cgo
,darwin-amd64
,darwin-amd64-cgo
,freebsd-386
,freebsd-amd64
,linux-386
,linux-386-cgo
,linux-amd64
,linux-amd64-cgo
,linux-arm
,windows-386
,windows-amd64
の各エントリに、EBADMSG
,EMULTIHOP
,ENOLINK
,EPROTO
のErrno
定数が追加されています。
- OpenBSDで存在しない
-
src/cmd/api/goapi.go
の更新:contexts
変数(build.Context
のスライス)に、新しいプラットフォームの組み合わせが追加されました。これにより、cmd/api
ツールがこれらの新しい環境でAPIの互換性チェックを実行できるようになります。- 追加されたプラットフォームは以下の通りです。
linux/arm
(Cgo有効/無効)freebsd/386
(Cgo有効/無効)freebsd/amd64
(Cgo有効/無効)freebsd/arm
(Cgo有効/無効)netbsd/386
(Cgo有効/無効)netbsd/amd64
(Cgo有効/無効)netbsd/arm
(Cgo有効/無効)openbsd/386
(Cgo有効/無効)openbsd/amd64
(Cgo有効/無効)
- これらの追加により、Goのビルドシステムがサポートするプラットフォームの範囲が広がり、より多くの環境でGoのAPI互換性が保証されるようになりました。
この変更は、Goのクロスプラットフォーム対応を強化し、特定のOSにおけるシステムコール定数の差異を適切に扱うことで、APIチェッカーの正確性を向上させるものです。
コアとなるコードの変更箇所
api/go1.txt
--- a/api/go1.txt
+++ b/api/go1.txt
@@ -6035,6 +6035,7 @@ pkg syscall (darwin-386), const EAUTH Errno
pkg syscall (darwin-386), const EBADARCH Errno
pkg syscall (darwin-386), const EBADEXEC Errno
pkg syscall (darwin-386), const EBADMACHO Errno
+pkg syscall (darwin-386), const EBADMSG Errno
pkg syscall (darwin-386), const EBADRPC Errno
pkg syscall (darwin-386), const ECHO ideal-int
pkg syscall (darwin-386), const ECHOCTL ideal-int
@@ -6046,9 +6047,11 @@ pkg syscall (darwin-386), const ECHOPRT ideal-int
pkg syscall (darwin-386), const EDEVERR Errno
pkg syscall (darwin-386), const EFTYPE Errno
pkg syscall (darwin-386), const ELAST Errno
+pkg syscall (darwin-386), const EMULTIHOP Errno
pkg syscall (darwin-386), const ENEEDAUTH Errno
pkg syscall (darwin-386), const ENOATTR Errno
pkg syscall (darwin-386), const ENODATA Errno
+pkg syscall (darwin-386), const ENOLINK Errno
pkg syscall (darwin-386), const ENOPOLICY Errno
pkg syscall (darwin-386), const ENOSR Errno
pkg syscall (darwin-386), const ENOSTR Errno
@@ -6058,6 +6061,7 @@ pkg syscall (darwin-386), const EPROCLIM Errno
pkg syscall (darwin-386), const EPROCUNAVAIL Errno
pkg syscall (darwin-386), const EPROGMISMATCH Errno
pkg syscall (darwin-386), const EPROGUNAVAIL Errno
+pkg syscall (darwin-386), const EPROTO Errno
pkg syscall (darwin-386), const EPWROFF Errno
pkg syscall (darwin-386), const ERPCMISMATCH Errno
pkg syscall (darwin-386), const ESHLIBVERS Errno
... (中略:他のプラットフォームでの同様の追加) ...
@@ -29884,7 +29936,6 @@ pkg syscall, const EAFNOSUPPORT Errno
pkg syscall, const EAGAIN Errno
pkg syscall, const EALREADY Errno
pkg syscall, const EBADF Errno
-pkg syscall, const EBADMSG Errno
pkg syscall, const EBUSY Errno
pkg syscall, const ECANCELED Errno
pkg syscall, const ECHILD Errno
@@ -29912,7 +29963,6 @@ pkg syscall, const ELOOP Errno
pkg syscall, const EMFILE Errno
pkg syscall, const EMLINK Errno
pkg syscall, const EMSGSIZE Errno
-pkg syscall, const EMULTIHOP Errno
pkg syscall, const ENAMETOOLONG Errno
pkg syscall, const ENETDOWN Errno
pkg syscall, const ENETRESET Errno
@@ -29923,7 +29973,6 @@ pkg syscall, const ENODEV Errno
pkg syscall, const ENOENT Errno
pkg syscall, const ENOEXEC Errno
pkg syscall, const ENOLCK Errno
-pkg syscall, const ENOLINK Errno
pkg syscall, const ENOMEM Errno
pkg syscall, const ENOMSG Errno
pkg syscall, const ENOPROTOOPT Errno
@@ -29942,7 +29991,6 @@ pkg syscall, const EOVERFLOW Errno
pkg syscall, const EPERM Errno
pkg syscall, const EPFNOSUPPORT Errno
pkg syscall, const EPIPE Errno
-pkg syscall, const EPROTO Errno
pkg syscall, const EPROTONOSUPPORT Errno
pkg syscall, const EPROTOTYPE Errno
pkg syscall, const ERANGE Errno
src/cmd/api/goapi.go
--- a/src/cmd/api/goapi.go
+++ b/src/cmd/api/goapi.go
@@ -53,6 +53,7 @@ var contexts = []*build.Context{
{GOOS: "linux", GOARCH: "386"},
{GOOS: "linux", GOARCH: "amd64", CgoEnabled: true},
{GOOS: "linux", GOARCH: "amd64"},
+ {GOOS: "linux", GOARCH: "arm", CgoEnabled: true},
{GOOS: "linux", GOARCH: "arm"},
{GOOS: "darwin", GOARCH: "386", CgoEnabled: true},
{GOOS: "darwin", GOARCH: "386"},
@@ -60,8 +61,22 @@ var contexts = []*build.Context{
{GOOS: "darwin", GOARCH: "amd64"},
{GOOS: "windows", GOARCH: "amd64"},
{GOOS: "windows", GOARCH: "386"},
-\t{GOOS: "freebsd", GOARCH: "amd64"},
+\t{GOOS: "freebsd", GOARCH: "386", CgoEnabled: true},
{GOOS: "freebsd", GOARCH: "386"},
+\t{GOOS: "freebsd", GOARCH: "amd64", CgoEnabled: true},
+\t{GOOS: "freebsd", GOARCH: "amd64"},
+\t{GOOS: "freebsd", GOARCH: "arm", CgoEnabled: true},
+\t{GOOS: "freebsd", GOARCH: "arm"},
+\t{GOOS: "netbsd", GOARCH: "386", CgoEnabled: true},
+\t{GOOS: "netbsd", GOARCH: "386"},
+\t{GOOS: "netbsd", GOARCH: "amd64", CgoEnabled: true},
+\t{GOOS: "netbsd", GOARCH: "amd64"},
+\t{GOOS: "netbsd", GOARCH: "arm", CgoEnabled: true},
+\t{GOOS: "netbsd", GOARCH: "arm"},
+\t{GOOS: "openbsd", GOARCH: "386", CgoEnabled: true},
+\t{GOOS: "openbsd", GOARCH: "386"},
+\t{GOOS: "openbsd", GOARCH: "amd64", CgoEnabled: true},
+\t{GOOS: "openbsd", GOARCH: "amd64"},
}\n \n func contextName(c *build.Context) string {
コアとなるコードの解説
api/go1.txt
の変更
api/go1.txt
は、GoのAPI互換性を保証するための重要なファイルです。このファイルは、Goの標準ライブラリが提供するすべての公開APIを列挙しています。APIチェッカーは、このファイルに記載されているAPIと、現在のGoソースコードから抽出されたAPIを比較し、互換性のない変更がないかを確認します。
このコミットでは、pkg syscall
のグローバルなセクションから EBADMSG
, EMULTIHOP
, ENOLINK
, EPROTO
の4つの Errno
定数が削除されました。これは、これらの定数がすべてのGoがサポートするプラットフォームで普遍的に利用可能ではないことを反映しています。特にOpenBSDではこれらの定数が存在しないため、グローバルな定義から削除することで、OpenBSDでのAPIチェックが失敗するのを防ぎます。
その代わりに、これらの定数は、それらが実際に存在する特定のプラットフォーム(Darwin, FreeBSD, Linux, Windows)の syscall
パッケージのセクションに個別に追加されました。これにより、APIチェッカーは各プラットフォームの特性を考慮し、そのプラットフォームで実際に利用可能なAPIのみをチェックするようになります。この変更は、GoのAPI互換性チェックの精度を向上させ、プラットフォーム間の差異をより正確に反映するためのものです。
src/cmd/api/goapi.go
の変更
src/cmd/api/goapi.go
ファイルは、cmd/api
ツールがAPIチェックを実行する際に使用するビルドコンテキストを定義しています。contexts
変数は、Goのビルドシステムがサポートする様々なOSとアーキテクチャの組み合わせのリストです。
このコミットでは、contexts
リストに多数の新しい build.Context
エントリが追加されました。これには、linux/arm
、freebsd
の 386
, amd64
, arm
アーキテクチャ、netbsd
の 386
, amd64
, arm
アーキテクチャ、そして openbsd
の 386
, amd64
アーキテクチャが含まれます。それぞれの組み合わせについて、Cgoが有効なバージョンと無効なバージョンの両方が追加されています。
これらの新しいコンテキストの追加は、cmd/api
ツールがより広範なプラットフォームでAPIの互換性チェックを実行できるようにすることを意味します。これにより、Goの標準ライブラリがこれらの新しいプラットフォームでも期待通りに動作し、APIの互換性が維持されることが保証されます。特に、OpenBSDのサポートが強化されたことで、OpenBSDユーザーはGoのAPIの安定性についてより高い信頼を得られるようになります。
関連リンク
- Go 1 Compatibility Guarantee: https://go.dev/doc/go1compat
- Go
syscall
package documentation: https://pkg.go.dev/syscall - Go
build
package documentation: https://pkg.go.dev/go/build
参考にした情報源リンク
- Goの公式ドキュメント
- Goのソースコードリポジトリ
- Unix系OSの
errno
定数に関する一般的な情報 - OpenBSDのシステムコールに関する情報
- FreeBSDのシステムコールに関する情報
- NetBSDのシステムコールに関する情報
- https://golang.org/cl/9149045 (コミットメッセージに記載されているChangeListのURL)
- https://github.com/golang/go/commit/f5d06da07229ace92d34585ff56f89b11fc95f70 (GitHubのコミットページ)
- https://go.dev/doc/go1compat (Go 1 互換性保証)
- https://pkg.go.dev/syscall (Go syscall パッケージ)
- https://pkg.go.dev/go/build (Go build パッケージ)
- https://en.wikipedia.org/wiki/Errno (Errnoに関するWikipedia記事)
- https://www.openbsd.org/ (OpenBSD公式サイト)
- https://www.freebsd.org/ (FreeBSD公式サイト)
- https://www.netbsd.org/ (NetBSD公式サイト)