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

[インデックス 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が対象)のクリーンアップがあります。

  1. ビルド依存関係の改善: y.tab.h は、bison(またはyacc)のようなパーサジェネレータによって go.y という文法定義ファイルから生成されるヘッダファイルです。従来の Makefile では、y.tab.hgo.y のみに依存すると記述されていました。しかし、実際には go.errorsbisonerrors といった他のファイルも y.tab.h の生成に影響を与える可能性があり、これらの変更が y.tab.h の再生成をトリガーしない場合、ビルドが古いままであったり、不整合が生じたりするリスクがありました。このコミットは、より正確な依存関係を Makefile に記述することで、ビルドの信頼性と正確性を向上させることを目的としています。

  2. 不要なファイルの無視: y.outputbison -v コマンドを実行した際に生成される詳細なデバッグ情報を含むファイルです。これはパーサのデバッグには有用ですが、最終的なビルド成果物ではなく、ソースコードリポジトリに含めるべきではありません。このような生成されたファイルをバージョン管理システムから無視することで、リポジトリのサイズを小さく保ち、クリーンな状態を維持し、開発者が誤ってコミットしてしまうことを防ぎます。

前提知識の解説

1. Makefileと依存関係

Makefilemake ユーティリティが使用するビルド自動化スクリプトです。make は、ターゲットファイル(例: y.tab.h)が依存するファイル(例: go.y)よりも古い場合にのみ、そのターゲットを再構築します。この依存関係の定義が不正確だと、ソースコードが変更されてもターゲットが再構築されず、古いビルド成果物が使用されてしまう「ビルドの不整合」が発生する可能性があります。

2. Bison (Yacc) とパーサジェネレータ

Bison は、Yacc (Yet Another Compiler Compiler) と互換性のあるパーサジェネレータです。これは、BNF(Backus-Naur Form)のような形式で記述された文法定義ファイル(例: go.y)を読み込み、その文法を解析するためのC言語(または他の言語)のソースコード(例: y.tab.cy.tab.h)を生成します。

  • go.y: Go言語のコンパイラにおける字句解析器/構文解析器の文法定義ファイル。
  • y.tab.h: bisongo.y から生成するヘッダファイル。通常、トークン定義やパーサの状態に関する情報が含まれます。
  • y.tab.c: bisongo.y から生成するC言語のソースファイル。実際のパーサロジックが含まれます。
  • y.output: bison -v オプションを付けて実行した際に生成されるファイル。パーサの状態遷移、競合(shift/reduce, reduce/reduce conflict)に関する詳細な情報が含まれており、文法定義のデバッグに役立ちます。

3. .hgignore

.hgignore は、Mercurial バージョン管理システムにおいて、特定のファイルやディレクトリを無視するための設定ファイルです。Gitにおける .gitignore と同様の役割を果たします。ビルド生成物、一時ファイル、IDEの設定ファイルなど、リポジトリに含めるべきではないファイルを指定するために使用されます。

技術的詳細

このコミットは、Goコンパイラのビルドプロセスにおける2つの重要な側面に対処しています。

  1. Makefileにおける依存関係の厳密化: src/cmd/gc/Makefile 内の y.tab.h ターゲットの依存関係が go.y から go.y go.errors bisonerrors に変更されました。 これは、y.tab.h の生成が go.y だけでなく、go.errorsbisonerrors というファイルの内容にも依存する可能性があることを示唆しています。これらのファイルは、エラーメッセージの定義やBisonの内部的な設定など、パーサの動作に影響を与える可能性のある情報を含んでいると考えられます。 この変更により、go.errorsbisonerrors が更新された場合でも、y.tab.h が確実に再生成されるようになり、ビルドの整合性が保たれます。これは、インクリメンタルビルドの正確性を高める上で非常に重要です。

  2. y.output の無視: .hgignore ファイルに src/cmd/?a/y.output が追加されました。 ?a は、6a, 8a, 5a など、Goのクロスコンパイルターゲット(アーキテクチャ)を示すプレースホルダーです。これは、各アーキテクチャのコンパイラ(例: src/cmd/6a/amd64 用のアセンブラ)ディレクトリ内で y.output が生成される可能性があることを意味します。 y.outputbison -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.hgo.y のみに依存すると定義されていました。
  • 変更後: y.tab.h: go.y go.errors bisonerrors y.tab.hgo.y に加えて、go.errorsbisonerrors にも依存すると定義されました。

この変更により、go.errors または bisonerrors のいずれかのファイルが変更された場合でも、y.tab.h が確実に再生成されるようになります。これは、ビルドシステムの依存関係追跡をより正確にし、ビルドの信頼性を向上させるための重要な改善です。特に、これらのファイルがパーサの動作やエラー処理に影響を与える定義を含んでいる場合、その変更がビルドに適切に反映されることが保証されます。

関連リンク

参考にした情報源リンク