[インデックス 11582] ファイルの概要
このコミットは、Go言語のsyscall
パッケージにおけるブートストラップスクリプトの更新に関するものです。具体的には、cgo
コマンドの呼び出し方法を、新しいgo
コマンドツールチェーンに同期させる変更が行われています。
コミット
commit 44122ed06997f1355c6660efb302d867f13877c4
Author: Mikio Hara <mikioh.mikioh@gmail.com>
Date: Fri Feb 3 12:22:40 2012 +0900
syscall: update bootstrap scripts to sync with new go command
R=rsc
CC=golang-dev
https://golang.org/cl/5615054
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/44122ed06997f1355c6660efb302d867f13877c4
元コミット内容
syscall: update bootstrap scripts to sync with new go command
このコミットは、syscall
パッケージのブートストラップスクリプトを、新しいgo
コマンドと同期させるためのものです。
変更の背景
Go言語の初期開発段階において、ビルドシステムやツールチェーンは進化を続けていました。このコミットが行われた2012年2月頃は、Go 1のリリース(2012年3月)が間近に迫っており、ツールチェーンの統合と安定化が進められていた時期にあたります。
以前は、cgo
のような特定のツールは独立した実行ファイルとして直接呼び出されるか、あるいは異なるパスで管理されていた可能性があります。しかし、Go 1のリリースに向けて、すべての公式ツールをgo
コマンドのサブコマンドとして統合し、go tool <toolname>
という形式で呼び出す統一的なインターフェースが導入されました。これにより、ツールの発見性、パスの管理、およびGo環境との連携が改善されました。
このコミットは、syscall
パッケージのビルドプロセスで使用されるスクリプトが、この新しいgo tool
の慣習に準拠するように更新されたことを示しています。syscall
パッケージはOSのシステムコールをGoから呼び出すための重要なパッケージであり、そのビルドプロセスはGoのツールチェーンと密接に連携している必要があります。
前提知識の解説
-
Go言語の
syscall
パッケージ:syscall
パッケージは、Goプログラムからオペレーティングシステム(OS)の低レベルなシステムコールにアクセスするための機能を提供します。ファイル操作、ネットワーク通信、プロセス管理など、OSカーネルが提供する基本的なサービスを利用する際に用いられます。このパッケージはOSに依存する部分が多く、各OS(Linux, macOS, Windows, FreeBSDなど)およびアーキテクチャ(amd64, arm, 386など)ごとに異なる実装や定数、構造体が必要です。 -
cgo
:cgo
は、GoプログラムからC言語のコードを呼び出したり、C言語のコードからGoの関数を呼び出したりするためのツールです。Goのソースコード内にCのコードを直接記述し、cgo
がGoとCの間のバインディングコードを生成します。syscall
パッケージのように、OS固有のAPIや既存のCライブラリを利用する必要がある場合に不可欠なツールです。 -
Goツールチェーンと
go tool
コマンド: Go言語には、コードのビルド、テスト、フォーマット、ドキュメント生成など、開発を支援するための様々なコマンドラインツールが提供されています。これらは総称して「Goツールチェーン」と呼ばれます。go
コマンドは、これらのツールのフロントエンドとして機能します。例えば、go build
はGoプログラムをビルドし、go test
はテストを実行します。go tool
コマンドは、Goツールチェーンに含まれる「内部ツール」を実行するためのものです。これらのツールは通常、開発者が直接呼び出すことを意図していないか、特定の高度な用途のために提供されています。cgo
もGo 1以降はこのgo tool
の傘下に統合され、go tool cgo
として呼び出されるようになりました。これにより、cgo
の実行パスがGoのインストール環境に依存せず、go
コマンドが管理するようになります。 -
ブートストラップスクリプト: ブートストラップスクリプトとは、ソフトウェアシステム、特にコンパイラやツールチェーンのような複雑なシステムを、そのシステム自身を使って構築するための初期段階のスクリプトを指します。Go言語の場合、Goコンパイラや標準ライブラリを初めてビルドする際、あるいは異なるプラットフォーム向けにクロスコンパイル環境をセットアップする際に、これらのスクリプトが重要な役割を果たします。これらは通常、シェルスクリプト(
.sh
)で記述され、ビルドに必要な様々なツール(cgo
など)を適切な引数で呼び出します。
技術的詳細
このコミットの技術的な核心は、Goツールチェーンにおけるcgo
コマンドの呼び出し規約の変更にあります。
変更前は、mkall.sh
やmkerrors.sh
といったブートストラップスクリプト内で、cgo
コマンドが直接呼び出されていました(例: cgo -godefs
)。これは、cgo
がシステムパス上にあるか、スクリプトがcgo
の正確なパスを知っていることを前提としていました。
変更後は、cgo
の呼び出しがgo tool cgo
に統一されました。この変更にはいくつかの重要な意味があります。
- ツールの統合と統一性: Go 1のリリースに向けて、Goの公式ツールは
go
コマンドの下に統合される方針が採られました。これにより、開発者はgo
コマンド一つでGo開発に必要なほとんどの操作を行えるようになり、ツールの発見性と使いやすさが向上しました。 - パス解決の簡素化:
go tool cgo
とすることで、スクリプトはcgo
の具体的な実行パスを意識する必要がなくなります。go
コマンドがGoのインストール環境に基づいてcgo
の正しいパスを解決するため、スクリプトの移植性や堅牢性が向上します。 - 環境変数との連携:
go tool
経由でツールを呼び出すことで、GOARCH
やGOOS
といったGoの環境変数がより適切にツールに伝達されるようになります。これは、特にsyscall
パッケージのようにクロスコンパイルや異なるOS/アーキテクチャ向けのコード生成を行う際に重要です。cgo -godefs
はGoの型定義をCのヘッダファイルから生成する際に使用されるオプションであり、このプロセスはターゲットのOSやアーキテクチャに強く依存します。go tool cgo
とすることで、これらの環境情報がより確実にcgo
に渡されるようになります。 - 将来的な互換性:
go tool
の形式は、Goツールチェーンの標準的な呼び出し方法として確立されました。この変更により、スクリプトは将来のGoバージョンアップグレードに対してもより互換性が高くなります。
この変更は、Go言語のビルドシステムが成熟し、より堅牢で統一されたツールチェーンへと移行する過程の一部を示しています。
コアとなるコードの変更箇所
このコミットでは、以下の2つのファイルが変更されています。
src/pkg/syscall/mkall.sh
src/pkg/syscall/mkerrors.sh
両方のファイルで、cgo -godefs
という文字列がgo tool cgo -godefs
に置換されています。
src/pkg/syscall/mkall.sh
の変更例:
--- a/src/pkg/syscall/mkall.sh
+++ b/src/pkg/syscall/mkall.sh
@@ -113,52 +113,52 @@ darwin_386)
mkerrors="$mkerrors -m32"
mksyscall="./mksyscall.pl -l32"
mksysnum="./mksysnum_darwin.pl /usr/include/sys/syscall.h"
- mktypes="GOARCH=$GOARCH cgo -godefs"
+ mktypes="GOARCH=$GOARCH go tool cgo -godefs"
;;
darwin_amd64)
mkerrors="$mkerrors -m64"
mksysnum="./mksysnum_darwin.pl /usr/include/sys/syscall.h"
- mktypes="GOARCH=$GOARCH cgo -godefs"
+ mktypes="GOARCH=$GOARCH go tool cgo -godefs"
;;
freebsd_386)
mkerrors="$mkerrors -m32"
mksyscall="./mksyscall.pl -l32"
mksysnum="curl -s 'http://svn.freebsd.org/base/head/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl"
- mktypes="GOARCH=$GOARCH cgo -godefs"
+ mktypes="GOARCH=$GOARCH go tool cgo -godefs"
;;
freebsd_amd64)
mkerrors="$mkerrors -m64"
mksysnum="curl -s 'http://svn.freebsd.org/base/head/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl"
- mktypes="GOARCH=$GOARCH cgo -godefs"
+ mktypes="GOARCH=$GOARCH go tool cgo -godefs"
;;
linux_386)
mkerrors="$mkerrors -m32"
mksyscall="./mksyscall.pl -l32"
mksysnum="./mksysnum_linux.pl /usr/include/asm/unistd_32.h"
- mktypes="GOARCH=$GOARCH cgo -godefs"
+ mktypes="GOARCH=$GOARCH go tool cgo -godefs"
;;
linux_amd64)
mkerrors="$mkerrors -m64"
mksysnum="./mksysnum_linux.pl /usr/include/asm/unistd_64.h"
- mktypes="GOARCH=$GOARCH cgo -godefs"
+ mktypes="GOARCH=$GOARCH go tool cgo -godefs"
;;
linux_arm)
mkerrors="$mkerrors"
mksyscall="./mksyscall.pl -b32"
mksysnum="./mksysnum_linux.pl /usr/include/asm/unistd.h"
- mktypes="GOARCH=$GOARCH cgo -godefs"
+ mktypes="GOARCH=$GOARCH go tool cgo -godefs"
;;
netbsd_386)
mkerrors="$mkerrors -m32"
mksyscall="./mksyscall.pl -l32 -netbsd"
mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl"
- mktypes="GOARCH=$GOARCH cgo -godefs"
+ mktypes="GOARCH=$GOARCH go tool cgo -godefs"
;;
netbsd_amd64)
mkerrors="$mkerrors -m64"
mksyscall="./mksyscall.pl -netbsd"
mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl"
- mktypes="GOARCH=$GOARCH cgo -godefs"
+ mktypes="GOARCH=$GOARCH go tool cgo -godefs"
;;
openbsd_386)
mkerrors="$mkerrors -m32"
@@ -166,11 +166,11 @@ openbsd_386)
mksysctl="./mksysctl_openbsd.pl"
zsysctl="zsysctl_openbsd.go"
mksysnum="curl -s 'http://www.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl"
- mktypes="GOARCH=$GOARCH cgo -godefs"
+ mktypes="GOARCH=$GOARCH go tool cgo -godefs"
;;
openbsd_amd64)
mkerrors="$mkerrors -m64"
mksyscall="./mksyscall.pl"
mksysctl="./mksysctl_openbsd.pl"
zsysctl="zsysctl_openbsd.go"
mksysnum="curl -s 'http://www.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl"
- mktypes="GOARCH=$GOARCH cgo -godefs"
+ mktypes="GOARCH=$GOARCH go tool cgo -godefs"
;;
plan9_386)
mkerrors=
src/pkg/syscall/mkerrors.sh
の変更例:
--- a/src/pkg/syscall/mkerrors.sh
+++ b/src/pkg/syscall/mkerrors.sh
@@ -146,7 +146,7 @@ includes='
ccflags="$@"
-# Write cgo -godefs input.
+# Write go tool cgo -godefs input.
(
echo package syscall
echo
@@ -224,7 +224,7 @@ echo '#include <errno.h>' | $GCC -x c - -E -dM $ccflags |
echo '// mkerrors.sh' "$@"
echo '// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT'
echo
-cgo -godefs -- "$@" _const.go >_error.out
+go tool cgo -godefs -- "$@" _const.out
cat _error.out | grep -vf _error.grep
echo
echo '// Errors'
コアとなるコードの解説
-
src/pkg/syscall/mkall.sh
: このスクリプトは、syscall
パッケージのビルドプロセス全体を管理する主要なブートストラップスクリプトです。様々なOSとアーキテクチャの組み合わせ(例:darwin_386
,linux_amd64
など)に対して、それぞれ適切なツール(mkerrors
,mksyscall
,mksysnum
,mktypes
)を設定し、実行します。 変更されたmktypes
変数は、Goの型定義を生成するためにcgo -godefs
コマンドを呼び出す部分です。GOARCH=$GOARCH
は、ターゲットアーキテクチャを指定する環境変数を設定しています。この行がgo tool cgo -godefs
に変更されたことで、cgo
の呼び出しがGoツールチェーンの標準的な方法に準拠するようになりました。 -
src/pkg/syscall/mkerrors.sh
: このスクリプトは、OSのエラーコード(errno
)や関連する定数をGoのコードとして生成するために使用されます。Cのヘッダファイルから情報を抽出し、Goのsyscall
パッケージ内で利用可能な定数として定義します。 スクリプト内のcgo -godefs -- "$@" _const.go >_error.out
という行は、Cの定数定義を含む_const.go
ファイルをcgo -godefs
で処理し、Goの型定義を生成して_error.out
に出力する部分です。ここでもcgo
の直接呼び出しがgo tool cgo
に置き換えられ、Goツールチェーンの統一されたインターフェースが使用されるようになりました。
これらの変更は、Goのビルドシステムが進化し、go
コマンドがGo開発における中心的なハブとなる過程で、内部ツール(cgo
など)の呼び出し方法が標準化されたことを明確に示しています。これにより、Goのビルドプロセスはより堅牢で、管理しやすくなりました。
関連リンク
- Go Gerrit Change-ID: https://golang.org/cl/5615054
- Go 1 Release Notes (Go 1のリリースに関する情報): https://go.dev/doc/go1
cgo
に関する公式ドキュメント: https://go.dev/cmd/cgo/go tool
コマンドに関する公式ドキュメント (Go 1.4以降のドキュメントに記載): https://go.dev/cmd/go/#hdr-Description_of_go_tool_commands
参考にした情報源リンク
- Go言語の公式ドキュメント
- Go言語のソースコードリポジトリ (特に
cmd/go
ディレクトリやsrc/pkg/syscall
ディレクトリの歴史) - Go言語のGerritコードレビューシステム (変更履歴と議論)
- Go 1のリリースノートや関連するブログ記事 (Goツールチェーンの進化に関する情報)
cgo
の機能と使用方法に関する一般的な情報