[インデックス 12573] ファイルの概要
このコミットは、Go言語のビルドシステムにおける依存関係の追跡を改善し、生成される中間ファイル(y.output
)をバージョン管理システムから無視するように設定するものです。具体的には、src/cmd/gc/Makefile
を更新して y.tab.h
の依存関係をより正確に定義し、.hgignore
ファイルに y.output
を追加して、ビルド時に生成される不要なファイルをリポジトリに含めないようにします。
コミット
- コミットハッシュ:
0359621241d09521978950ebc5e068352a549c64
- Author: Shenghou Ma minux.ma@gmail.com
- Date: Tue Mar 13 03:31:11 2012 +0800
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/0359621241d09521978950ebc5e068352a549c64
元コミット内容
build: update Makefile to track source code dependencies better
Also update .hgignore to ignore y.output.
R=rsc
CC=golang-dev
https://golang.org/cl/5797061
変更の背景
このコミットの背景には、Go言語のコンパイラ(gc
)のビルドプロセスにおける依存関係管理の最適化と、バージョン管理システム(当時はMercurialが主に使用されていたため.hgignore
が対象)のクリーンアップがあります。
-
ビルド依存関係の改善:
y.tab.h
は、bison
(またはyacc
)のようなパーサジェネレータによってgo.y
という文法定義ファイルから生成されるヘッダファイルです。従来のMakefile
では、y.tab.h
がgo.y
のみに依存すると記述されていました。しかし、実際にはgo.errors
やbisonerrors
といった他のファイルもy.tab.h
の生成に影響を与える可能性があり、これらの変更がy.tab.h
の再生成をトリガーしない場合、ビルドが古いままであったり、不整合が生じたりするリスクがありました。このコミットは、より正確な依存関係をMakefile
に記述することで、ビルドの信頼性と正確性を向上させることを目的としています。 -
不要なファイルの無視:
y.output
はbison -v
コマンドを実行した際に生成される詳細なデバッグ情報を含むファイルです。これはパーサのデバッグには有用ですが、最終的なビルド成果物ではなく、ソースコードリポジトリに含めるべきではありません。このような生成されたファイルをバージョン管理システムから無視することで、リポジトリのサイズを小さく保ち、クリーンな状態を維持し、開発者が誤ってコミットしてしまうことを防ぎます。
前提知識の解説
1. Makefileと依存関係
Makefile
は make
ユーティリティが使用するビルド自動化スクリプトです。make
は、ターゲットファイル(例: y.tab.h
)が依存するファイル(例: go.y
)よりも古い場合にのみ、そのターゲットを再構築します。この依存関係の定義が不正確だと、ソースコードが変更されてもターゲットが再構築されず、古いビルド成果物が使用されてしまう「ビルドの不整合」が発生する可能性があります。
2. Bison (Yacc) とパーサジェネレータ
Bison
は、Yacc
(Yet Another Compiler Compiler) と互換性のあるパーサジェネレータです。これは、BNF(Backus-Naur Form)のような形式で記述された文法定義ファイル(例: go.y
)を読み込み、その文法を解析するためのC言語(または他の言語)のソースコード(例: y.tab.c
や y.tab.h
)を生成します。
go.y
: Go言語のコンパイラにおける字句解析器/構文解析器の文法定義ファイル。y.tab.h
:bison
がgo.y
から生成するヘッダファイル。通常、トークン定義やパーサの状態に関する情報が含まれます。y.tab.c
:bison
がgo.y
から生成するC言語のソースファイル。実際のパーサロジックが含まれます。y.output
:bison -v
オプションを付けて実行した際に生成されるファイル。パーサの状態遷移、競合(shift/reduce, reduce/reduce conflict)に関する詳細な情報が含まれており、文法定義のデバッグに役立ちます。
3. .hgignore
.hgignore
は、Mercurial バージョン管理システムにおいて、特定のファイルやディレクトリを無視するための設定ファイルです。Gitにおける .gitignore
と同様の役割を果たします。ビルド生成物、一時ファイル、IDEの設定ファイルなど、リポジトリに含めるべきではないファイルを指定するために使用されます。
技術的詳細
このコミットは、Goコンパイラのビルドプロセスにおける2つの重要な側面に対処しています。
-
Makefile
における依存関係の厳密化:src/cmd/gc/Makefile
内のy.tab.h
ターゲットの依存関係がgo.y
からgo.y go.errors bisonerrors
に変更されました。 これは、y.tab.h
の生成がgo.y
だけでなく、go.errors
とbisonerrors
というファイルの内容にも依存する可能性があることを示唆しています。これらのファイルは、エラーメッセージの定義やBisonの内部的な設定など、パーサの動作に影響を与える可能性のある情報を含んでいると考えられます。 この変更により、go.errors
やbisonerrors
が更新された場合でも、y.tab.h
が確実に再生成されるようになり、ビルドの整合性が保たれます。これは、インクリメンタルビルドの正確性を高める上で非常に重要です。 -
y.output
の無視:.hgignore
ファイルにsrc/cmd/?a/y.output
が追加されました。?a
は、6a
,8a
,5a
など、Goのクロスコンパイルターゲット(アーキテクチャ)を示すプレースホルダーです。これは、各アーキテクチャのコンパイラ(例:src/cmd/6a/
はamd64
用のアセンブラ)ディレクトリ内でy.output
が生成される可能性があることを意味します。y.output
はbison -v
コマンドによって生成されるデバッグ用の出力ファイルであり、ソースコードの一部ではありません。これをバージョン管理システムから無視することで、リポジトリの肥大化を防ぎ、開発者が誤ってコミットするのを防ぎます。また、クリーンなリポジトリ状態を維持し、ビルド生成物とソースコードの分離を明確にします。
コアとなるコードの変更箇所
diff --git a/.hgignore b/.hgignore
index 741d7c61b2..b140555fd9 100644
--- a/.hgignore
+++ b/.hgignore
@@ -33,6 +33,7 @@ misc/goplay/goplay
misc/osx/*.pkg
misc/osx/*.dmg
src/cmd/6a/6a
+src/cmd/?a/y.output
src/cmd/?l/enam.c
src/cmd/cc/y.output
src/cmd/dist/dist.dSYM
diff --git a/src/cmd/gc/Makefile b/src/cmd/gc/Makefile
index df34c05b27..58e25faaf9 100644
--- a/src/cmd/gc/Makefile
+++ b/src/cmd/gc/Makefile
@@ -6,7 +6,7 @@ include ../../Make.dist
install: y.tab.h builtin.c
-y.tab.h: go.y
+y.tab.h: go.y go.errors bisonerrors
tbison -v -y -d go.y
# make yystate global, yytname mutable
cat y.tab.c | sed '/ int yystate;/d; s/int yychar;/int yychar, yystate;/; s/static const char \*const yytname/const char *yytname/; s/char const \*yymsgp/char *yymsgp/' >y1.tab.c
コアとなるコードの解説
.hgignore
の変更
--- a/.hgignore
+++ b/.hgignore
@@ -33,6 +33,7 @@ misc/goplay/goplay
misc/osx/*.pkg
misc/osx/*.dmg
src/cmd/6a/6a
+src/cmd/?a/y.output
src/cmd/?l/enam.c
src/cmd/cc/y.output
src/cmd/dist/dist.dSYM
この変更は、.hgignore
ファイルに src/cmd/?a/y.output
という行を追加しています。
src/cmd/
: Goコンパイラのコマンド関連のソースコードが置かれているディレクトリ。?a
: これはワイルドカードパターンで、6a
(amd64),8a
(arm),5a
(386) など、異なるアーキテクチャのアセンブラ/コンパイラディレクトリを指します。y.output
:bison -v
コマンドによって生成されるデバッグ情報ファイル。
この行の追加により、src/cmd/
以下の各アーキテクチャディレクトリで生成される y.output
ファイルがMercurialによって無視されるようになります。これにより、これらのファイルが誤ってリポジトリにコミットされることを防ぎ、リポジトリをクリーンに保ちます。
src/cmd/gc/Makefile
の変更
--- a/src/cmd/gc/Makefile
+++ b/src/cmd/gc/Makefile
@@ -6,7 +6,7 @@ include ../../Make.dist
install: y.tab.h builtin.c
-y.tab.h: go.y
+y.tab.h: go.y go.errors bisonerrors
tbison -v -y -d go.y
# make yystate global, yytname mutable
cat y.tab.c | sed '/ int yystate;/d; s/int yychar;/int yychar, yystate;/; s/static const char \*const yytname/const char *yytname/; s/char const \*yymsgp/char *yymsgp/' >y1.tab.c
この変更は、src/cmd/gc/Makefile
内の y.tab.h
ターゲットの依存関係を修正しています。
- 変更前:
y.tab.h: go.y
y.tab.h
はgo.y
のみに依存すると定義されていました。 - 変更後:
y.tab.h: go.y go.errors bisonerrors
y.tab.h
はgo.y
に加えて、go.errors
とbisonerrors
にも依存すると定義されました。
この変更により、go.errors
または bisonerrors
のいずれかのファイルが変更された場合でも、y.tab.h
が確実に再生成されるようになります。これは、ビルドシステムの依存関係追跡をより正確にし、ビルドの信頼性を向上させるための重要な改善です。特に、これらのファイルがパーサの動作やエラー処理に影響を与える定義を含んでいる場合、その変更がビルドに適切に反映されることが保証されます。
関連リンク
- Go Code Review: https://golang.org/cl/5797061
参考にした情報源リンク
- Bison Manual: https://www.gnu.org/software/bison/manual/
- GNU Make Manual: https://www.gnu.org/software/make/manual/
- Mercurial Documentation: https://www.mercurial-scm.org/