[インデックス 11507] ファイルの概要
このコミットは、Go言語のビルドシステムにおいて、goapi、quietgcc、cgo、gotype、ebnflint といった内部ツール群を $GOROOT/bin/go-tool ディレクトリ配下に移動させる変更です。これにより、Goのツール群の管理と利用方法が整理され、ビルドプロセスの整合性が向上します。
コミット
commit 9a15c2186c59544d4587487f075ccee385373823
Author: Russ Cox <rsc@golang.org>
Date: Tue Jan 31 10:38:07 2012 -0500
build: move goapi, quietgcc, cgo, gotype, ebnflint into go-tool
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/5552054
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/9a15c2186c59544d4587487f075ccee385373823
元コミット内容
build: move goapi, quietgcc, cgo, gotype, ebnflint into go-tool
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/5552054
変更の背景
Go言語のビルドシステムは、その開発初期から進化を続けています。このコミットが行われた2012年当時、Goのツールチェインはまだ成熟の途上にあり、様々な内部ツールがGoのソースツリー内の異なる場所に散在していました。これらのツールは、Goプログラムのビルド、テスト、解析など、Go開発の基盤を支える重要な役割を担っています。
この変更の主な背景には、以下の点が挙げられます。
- ツールの一元管理と発見可能性の向上: 複数のツールが異なるディレクトリに配置されていると、それらの管理が煩雑になり、開発者がどのツールがどこにあるのかを把握しにくくなります。
go-toolディレクトリに集約することで、Goの内部ツール群が論理的に一箇所にまとめられ、発見しやすくなります。 - ビルドプロセスの整合性: Goのビルドシステムは、
GOROOTやGOBINといった環境変数に依存して動作します。これらのツールが$GOROOT/bin/go-toolという特定のパスに配置されることで、ビルドスクリプトや他のツールがこれらのツールをより確実に、かつ一貫した方法で参照できるようになります。これは、クロスコンパイルや異なる環境でのビルドの安定性にも寄与します。 - 将来的な拡張性: ツール群を特定のディレクトリにまとめることで、将来的に新しい内部ツールを追加したり、既存のツールを更新したりする際の構造が明確になります。これにより、ビルドシステムのメンテナンス性と拡張性が向上します。
goapiのリネーム:goapiツールは、GoパッケージのエクスポートされたAPIを計算する役割を担っていますが、その名称がgoコマンドのサブコマンドと紛らわしい可能性がありました。src/cmd/apiへのリネームは、その役割をより明確にし、命名規則の整合性を図る目的があります。
これらの背景から、Goのビルドシステムをより堅牢で、管理しやすく、そして将来にわたって持続可能なものにするための重要な一歩として、このコミットが実施されました。
前提知識の解説
このコミットを理解するためには、以下のGo言語のビルドシステムと関連ツールの基本的な概念を理解しておく必要があります。
GOROOT: Goのインストールディレクトリのルートパスを示す環境変数です。Goの標準ライブラリ、ツールチェイン、ソースコードなどがこのディレクトリ配下に配置されます。GOBIN: Goの実行可能バイナリがインストールされるディレクトリを示す環境変数です。通常、go installコマンドでビルドされたプログラムがここに配置されます。- Goのビルドプロセス: Goのプログラムは、
go buildやgo installといったコマンドによってビルドされます。これらのコマンドは、内部的にコンパイラ、リンカ、アセンブラなどのツールチェインを呼び出して実行可能ファイルを生成します。 go-toolディレクトリ:$GOROOT/bin/go-toolは、Goの内部ツールや補助的な実行可能ファイルが配置される特別なディレクトリです。これらのツールは、Goのビルドシステムや開発プロセスをサポートするために使用されます。Make.inc: Goのビルドシステムで使用されるMakefileのインクルードファイルの一つです。ビルドに関する共通の設定や変数が定義されています。make.bash: GoのソースコードからGoのツールチェイン全体をビルドするためのシェルスクリプトです。Goの初期のビルドプロセスにおいて重要な役割を担っていました。autogen.sh: Goのランタイムパッケージ (src/pkg/runtime) で使用される自動生成スクリプトです。C言語のソースコードを生成したり、バージョン情報を埋め込んだりする際に利用されます。
このコミットで移動される主要なツールは以下の通りです。
goapi(リネーム後api): GoパッケージのエクスポートされたAPI(関数、型、変数など)を抽出・計算するためのツールです。APIの互換性チェックなどに利用されます。quietgcc: GCCコンパイラをラップし、特定の警告や出力を抑制するためのスクリプトまたはツールです。Goのビルドプロセスにおいて、CgoなどC言語との連携部分で利用されることがあります。cgo: GoとC言語のコードを相互に呼び出すためのメカニズムを提供するツールです。Cgoを使用すると、Goプログラムから既存のCライブラリを呼び出したり、CのコードをGoプログラムに組み込んだりすることができます。gotype: Goのソースコードの型チェックを行うツールです。コンパイル前にコードの構文や型の一貫性を検証するのに役立ちます。ebnflint: EBNF (Extended Backus-Naur Form) 形式の文法定義を解析し、構文エラーなどをチェックするツールです。Goのパーサーや言語仕様に関連する部分で利用される可能性があります。
これらのツールは、Go言語のコンパイラやランタイムの内部的な開発、テスト、およびメンテナンスにおいて不可欠な要素です。
技術的詳細
このコミットの技術的な詳細は、主にGoのビルドシステムにおけるツールのパス解決と、それらのツールがGoの標準的なツールチェインの一部として認識されるようにするための変更に集約されます。
-
goapiのリネームと移動:src/cmd/goapiディレクトリがsrc/cmd/apiにリネームされました。これは、ツールの役割をより明確にし、goコマンドのサブコマンドとの混同を避けるためです。- 同時に、このツールは
$GOROOT/bin/go-tool/apiとしてインストールされるようになります。
-
quietgccのパス変更:src/Make.incにおいて、HOST_CCとHOST_LDの定義がquietgccから$(QUOTED_GOROOT)/bin/go-tool/quietgccに変更されました。これは、ビルド時に使用されるCコンパイラとリンカのラッパーであるquietgccが、go-toolディレクトリから参照されるようにするためです。src/make.bashでは、quietgccスクリプトの生成パスが$GOBIN/quietgccから$GOROOT/bin/go-tool/quietgccに変更されました。これにより、quietgccが$GOROOT/bin/go-tool配下に配置され、ビルドシステム全体で一貫して参照されるようになります。
-
src/cmd/go/pkg.goのisGoToolマップの更新:src/cmd/go/pkg.goファイル内のisGoToolマップは、goコマンドが内部的に認識する$GOROOT/bin/go-toolにインストールされるGoプログラムのリストを定義しています。- このコミットでは、
cmd/api(旧cmd/goapi)、cmd/cgo、exp/gotype、exp/ebnflintがこのマップに追加されました。これにより、goコマンドはこれらのツールをGoの公式ツールとして認識し、適切なパス解決を行うことができるようになります。
-
src/pkg/runtime/autogen.shのパス変更:src/pkg/runtime/autogen.shスクリプト内で、goc2cとmkversionのビルド時にquietgccを呼び出す箇所が、単なるquietgccから"$GOROOT"/bin/go-tool/quietgccに変更されました。これは、ランタイムの自動生成プロセスにおいても、go-toolディレクトリに配置されたquietgccを明示的に使用するようにするためです。
これらの変更は、Goのビルドシステムが内部ツールをどのように発見し、実行するかというメカニズムに直接影響を与えます。ツールのパスをハードコードするのではなく、GOROOT を基準とした相対パスで参照することで、ビルド環境の柔軟性と移植性が向上します。また、isGoTool マップの更新は、go コマンドがこれらのツールを「公式」なものとして扱い、必要に応じて適切な処理を行うための内部的なフックを提供します。
コアとなるコードの変更箇所
このコミットにおける主要なコード変更は以下のファイルに集中しています。
-
src/Make.inc:--- a/src/Make.inc +++ b/src/Make.inc @@ -105,8 +105,8 @@ LD=$(QUOTED_GOROOT)/bin/go-tool/$(O)l OS=568vq CFLAGS=-FVw -HOST_CC=quietgcc -HOST_LD=quietgcc +HOST_CC=$(QUOTED_GOROOT)/bin/go-tool/quietgcc +HOST_LD=$(QUOTED_GOROOT)/bin/go-tool/quietgcc HOST_O=o HOST_YFLAGS=-d HOST_AR?=arHOST_CCとHOST_LDがquietgccから$GOROOT/bin/go-tool/quietgccを指すように変更されました。 -
src/cmd/{goapi => api}/goapi.go(リネーム):--- a/src/cmd/goapi/goapi.go +++ b/src/cmd/api/goapi.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 -// Goapi computes the exported API of a set of Go packages.\n +// Api computes the exported API of a set of Go packages.\n package main import (ファイル名が
goapi.goからapi.goに変更され、内部のコメントもGoapiからApiに修正されました。 -
src/cmd/go/pkg.go:--- a/src/cmd/go/pkg.go +++ b/src/cmd/go/pkg.go @@ -229,9 +229,13 @@ Loop:\n // isGoTool is the list of directories for Go programs that are installed in // $GOROOT/bin/go-tool.\n var isGoTool = map[string]bool{\n -\t\"cmd/fix\": true,\n -\t\"cmd/vet\": true,\n -\t\"cmd/yacc\": true,\n +\t\"cmd/api\": true,\n +\t\"cmd/cgo\": true,\n +\t\"cmd/fix\": true,\n +\t\"cmd/vet\": true,\n +\t\"cmd/yacc\": true,\n +\t\"exp/gotype\": true,\n +\t\"exp/ebnflint\": true,\n }\n func scanPackage(ctxt *build.Context, t *build.Tree, arg, importPath, dir string, stk *importStack) *Package {isGoToolマップにcmd/api、cmd/cgo、exp/gotype、exp/ebnflintが追加されました。 -
src/make.bash:--- a/src/make.bash +++ b/src/make.bash @@ -44,10 +44,11 @@ export MAKEFLAGS unset CDPATH\t# in case user has it set rm -f "$GOBIN"/quietgcc +rm -f "$GOROOT/bin/go-tool/quietgcc" CC=${CC:-gcc} export CC -sed -e "s|@CC@|$CC|" < "$GOROOT"/src/quietgcc.bash > "$GOBIN"/quietgcc -chmod +x "$GOBIN"/quietgcc +sed -e "s|@CC@|$CC|" < "$GOROOT"/src/quietgcc.bash > "$GOROOT"/bin/go-tool/quietgcc +chmod +x "$GOROOT"/bin/go-tool/quietgcc export GOMAKE="$GOROOT"/bin/go-tool/make rm -f "$GOBIN"/gomakequietgccの生成パスが$GOBINから$GOROOT/bin/go-toolに変更されました。 -
src/pkg/runtime/autogen.sh:--- a/src/pkg/runtime/autogen.sh +++ b/src/pkg/runtime/autogen.sh @@ -27,7 +27,7 @@ if [ "$GOROOT" = "" ]; then fi # Use goc2c to translate .goc files into arch-specific .c files. -quietgcc -o goc2c -I "$GOROOT/include" goc2c.c "$GOROOT/lib/lib9.a" +"$GOROOT"/bin/go-tool/quietgcc -o goc2c -I "$GOROOT/include" goc2c.c "$GOROOT/lib/lib9.a" for file in *.goc do for arch in $GOARCHES @@ -39,7 +39,7 @@ do done # Version constants. -quietgcc -o mkversion -I "$GOROOT/include" mkversion.c "$GOROOT/lib/lib9.a" +"$GOROOT"/bin/go-tool/quietgcc -o mkversion -I "$GOROOT/include" mkversion.c "$GOROOT/lib/lib9.a" GOROOT="$GOROOT_FINAL" ./mkversion >z.tmp mv z.tmp zversion.goautogen.sh内でquietgccを呼び出す際に、明示的に$GOROOT/bin/go-tool/quietgccのパスを使用するように変更されました。
コアとなるコードの解説
これらの変更は、Goのビルドシステムにおけるツールの配置と参照方法を標準化し、一貫性を持たせることを目的としています。
-
src/Make.incの変更:Make.incはGoのビルドプロセス全体で利用される共通のMakefile設定です。ここでHOST_CCとHOST_LDのパスを$GOROOT/bin/go-tool/quietgccに変更することで、GoのビルドシステムがCコンパイラとリンカのラッパーとしてquietgccを使用する際に、そのツールが$GOROOT/bin/go-toolディレクトリに存在することを期待するようになります。これにより、ビルドの依存関係が明確になり、quietgccがどこに配置されていても正しく参照されるようになります。
-
src/cmd/{goapi => api}/goapi.goのリネーム:goapiはGoのAPIを解析する重要なツールですが、その名前がgoコマンドのサブコマンドと紛らわしいという問題がありました。apiへのリネームは、ツールの目的をより簡潔かつ明確に表現し、Goのツールチェイン全体の命名規則との整合性を高めます。これにより、開発者がツールの役割を直感的に理解しやすくなります。
-
src/cmd/go/pkg.goのisGoToolマップの更新:isGoToolマップは、goコマンドが内部的に管理する「公式な」Goツールの一覧です。このマップにcmd/api、cmd/cgo、exp/gotype、exp/ebnflintを追加することで、goコマンドはこれらのツールを特別なものとして扱い、例えばgo installでビルドする際に$GOROOT/bin/go-toolに配置されるべきであると認識します。これは、Goのツールチェインの自己ホスティング能力と、内部ツールの管理を強化する上で重要です。
-
src/make.bashの変更:make.bashはGoのソースからGo全体をビルドするスクリプトであり、quietgccのような補助ツールを生成します。quietgccの出力先を$GOBINから$GOROOT/bin/go-toolに変更することで、quietgccがGoの内部ツールとして正式に$GOROOT/bin/go-toolディレクトリに配置されるようになります。これにより、ビルドプロセス全体でquietgccのパスが統一され、他のビルドスクリプトやMakefileから一貫して参照できるようになります。
-
src/pkg/runtime/autogen.shの変更:autogen.shはGoのランタイムパッケージのビルド時に、C言語のコード生成やバージョン情報の埋め込みを行うスクリプトです。このスクリプト内でquietgccを呼び出す際に、明示的に$GOROOT/bin/go-tool/quietgccのフルパスを使用するように変更することで、ビルド環境に依存せず、常に正しいquietgccが実行されることが保証されます。これは、ビルドの信頼性と再現性を高める上で重要です。
これらの変更は、Goのビルドシステムがより堅牢で、自己完結的で、そして将来の拡張に対応できるような基盤を構築するための重要なステップでした。ツールの配置を標準化し、パス解決を統一することで、Goの開発者はより安定した環境で作業できるようになります。
関連リンク
- Go言語の公式ウェブサイト: https://golang.org/
- Goのソースコードリポジトリ (GitHub): https://github.com/golang/go
- Goのコードレビューシステム (Gerrit): https://go-review.googlesource.com/
- このコミットのGerritチェンジリスト: https://golang.org/cl/5552054
参考にした情報源リンク
- Go言語のドキュメント (特にビルドシステムに関する部分): https://golang.org/doc/
- Goのソースコード (特に
src/cmd/goおよびsrc/make.bash): https://github.com/golang/go/tree/master/src - Goの環境変数に関するドキュメント: https://golang.org/cmd/go/#hdr-Environment_variables
- Goのビルドプロセスに関する議論やメーリングリストのアーカイブ (golang-dev): https://groups.google.com/g/golang-dev
cgoのドキュメント: https://golang.org/cmd/cgo/goapi(現在のapi) ツールの目的に関する情報 (Goのソースコード内のコメントや関連ドキュメント): https://github.com/golang/go/blob/master/src/cmd/api/api.go- EBNF (Extended Backus-Naur Form) に関する一般的な情報: https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form
gotypeツールの目的に関する情報 (Goのソースコード内のコメントや関連ドキュメント): https://github.com/golang/go/tree/master/x/tools/cmd/gotype (注:gotypeは後にx/toolsに移動しています)