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

[インデックス 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つのファイルに影響を与えています。

  1. 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, EPROTOErrno 定数が追加されています。
  2. 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/armfreebsd386, amd64, arm アーキテクチャ、netbsd386, amd64, arm アーキテクチャ、そして openbsd386, amd64 アーキテクチャが含まれます。それぞれの組み合わせについて、Cgoが有効なバージョンと無効なバージョンの両方が追加されています。

これらの新しいコンテキストの追加は、cmd/api ツールがより広範なプラットフォームでAPIの互換性チェックを実行できるようにすることを意味します。これにより、Goの標準ライブラリがこれらの新しいプラットフォームでも期待通りに動作し、APIの互換性が維持されることが保証されます。特に、OpenBSDのサポートが強化されたことで、OpenBSDユーザーはGoのAPIの安定性についてより高い信頼を得られるようになります。

関連リンク

参考にした情報源リンク

  • 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公式サイト)