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

[インデックス 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.shmkerrors.shといったブートストラップスクリプト内で、cgoコマンドが直接呼び出されていました(例: cgo -godefs)。これは、cgoがシステムパス上にあるか、スクリプトがcgoの正確なパスを知っていることを前提としていました。

変更後は、cgoの呼び出しがgo tool cgoに統一されました。この変更にはいくつかの重要な意味があります。

  1. ツールの統合と統一性: Go 1のリリースに向けて、Goの公式ツールはgoコマンドの下に統合される方針が採られました。これにより、開発者はgoコマンド一つでGo開発に必要なほとんどの操作を行えるようになり、ツールの発見性と使いやすさが向上しました。
  2. パス解決の簡素化: go tool cgoとすることで、スクリプトはcgoの具体的な実行パスを意識する必要がなくなります。goコマンドがGoのインストール環境に基づいてcgoの正しいパスを解決するため、スクリプトの移植性や堅牢性が向上します。
  3. 環境変数との連携: go tool経由でツールを呼び出すことで、GOARCHGOOSといったGoの環境変数がより適切にツールに伝達されるようになります。これは、特にsyscallパッケージのようにクロスコンパイルや異なるOS/アーキテクチャ向けのコード生成を行う際に重要です。cgo -godefsはGoの型定義をCのヘッダファイルから生成する際に使用されるオプションであり、このプロセスはターゲットのOSやアーキテクチャに強く依存します。go tool cgoとすることで、これらの環境情報がより確実にcgoに渡されるようになります。
  4. 将来的な互換性: go toolの形式は、Goツールチェーンの標準的な呼び出し方法として確立されました。この変更により、スクリプトは将来のGoバージョンアップグレードに対してもより互換性が高くなります。

この変更は、Go言語のビルドシステムが成熟し、より堅牢で統一されたツールチェーンへと移行する過程の一部を示しています。

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

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

  1. src/pkg/syscall/mkall.sh
  2. 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言語の公式ドキュメント
  • Go言語のソースコードリポジトリ (特にcmd/goディレクトリやsrc/pkg/syscallディレクトリの歴史)
  • Go言語のGerritコードレビューシステム (変更履歴と議論)
  • Go 1のリリースノートや関連するブログ記事 (Goツールチェーンの進化に関する情報)
  • cgoの機能と使用方法に関する一般的な情報