[インデックス 10766] ファイルの概要
このコミットは、Go言語のビルドプロセスにおける問題を修正するためのものです。具体的には、src/clean.bash
スクリプトとtest/bench/shootout/Makefile
内のパス参照を修正し、ビルドが正しく機能するようにしています。コミットメッセージにある「fix build, sorry」が示す通り、以前の変更によってビルドが壊れてしまったことに対する修正です。
コミット
commit 1161e1172bfc17a23fb38f8e930d230c5bc78eae
Author: Russ Cox <rsc@golang.org>
Date: Tue Dec 13 17:53:00 2011 -0500
fix build, sorry
TBR=r
CC=golang-dev
https://golang.org/cl/5488066
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/1161e1172bfc17a23fb38f8e930d230c5bc78eae
元コミット内容
fix build, sorry
TBR=r
CC=golang-dev
https://golang.org/cl/5488066
変更の背景
このコミットの背景には、Go言語のビルドシステムにおけるパスの不整合があります。コミットメッセージの「fix build, sorry」という簡潔な表現から、以前の変更がビルドプロセスを壊してしまったことが伺えます。特に、src/clean.bash
スクリプトはGoプロジェクト全体のクリーンアップを担当し、test/bench/shootout/Makefile
はベンチマークテストの一部をビルドするために使用されます。これらのファイル内のパス参照が正しくない場合、ビルドツールが適切なディレクトリやファイルを見つけられなくなり、ビルドエラーが発生します。
この修正は、Goプロジェクトの継続的な開発とテストの健全性を維持するために不可欠でした。ビルドが壊れた状態では、新しい機能の追加やバグ修正が困難になり、開発効率が著しく低下するため、迅速な対応が求められました。
前提知識の解説
Go言語のビルドシステム
Go言語のプロジェクトは、通常、GOROOT
という環境変数で指定されるGoのインストールディレクトリと、GOPATH
で指定されるワークスペースディレクトリに依存します。ビルドプロセスは、これらのパスを基準にしてソースコードやツールを探します。
GOROOT
: GoのSDKがインストールされているルートディレクトリ。標準ライブラリやGoツールチェインの実行ファイルなどが含まれます。src
ディレクトリ:GOROOT
の下にあり、Goの標準ライブラリやGoツールチェインのソースコードが格納されています。Makefile
: Unix系のシステムでプログラムのビルドを自動化するためのツールであるmake
が使用する設定ファイルです。依存関係とビルドコマンドを定義します。Goプロジェクトでも、コンパイル、テスト、クリーンアップなどのタスクを自動化するためにMakefile
が利用されることがあります。clean.bash
: Goプロジェクトにおけるクリーンアップスクリプトです。通常、ビルドによって生成された中間ファイルや実行可能ファイルなどを削除し、クリーンな状態に戻すために使用されます。このスクリプトは、Goのソースツリー内の様々なサブディレクトリに対してmake clean
コマンドを実行することで機能します。test/bench/shootout
: このパスは、Go言語のベンチマークスイートの一部を示しています。shootout
は、The Computer Language Benchmarks Game(旧称:Debian Shootout)に由来するベンチマークで、異なるプログラミング言語間のパフォーマンスを比較するために設計された一連のプログラムを含んでいます。Go言語の実装もこのベンチマークに含まれており、Goのパフォーマンス特性を評価するために使用されます。
パス参照と相対パス
ファイルシステムにおけるパス参照は、絶対パスと相対パスの2種類があります。
- 絶対パス: ファイルシステムのルートディレクトリから始まる完全なパス(例:
/home/user/project/file.txt
)。 - 相対パス: 現在の作業ディレクトリを基準にしたパス(例:
../src/Make.inc
)。相対パスを使用する場合、スクリプトが実行される現在のディレクトリが重要になります。もしスクリプトが異なるディレクトリから実行された場合、相対パスの解釈が変わり、ファイルが見つからなくなる可能性があります。
このコミットでは、特に相対パスの誤った解釈が問題の原因となっています。
技術的詳細
このコミットは、Go言語のビルドシステムにおける2つの異なるファイル内のパス参照を修正しています。
-
src/clean.bash
の修正:- このスクリプトは、Goのソースツリー内の様々なサブディレクトリに対して
make clean
コマンドを実行することで、ビルドによって生成されたファイルを削除します。 - 変更前は、
../test/bench
というパスが指定されていました。 - 変更後は、
../test/bench/shootout
に修正されています。 - これは、
clean.bash
がsrc
ディレクトリから実行されることを前提としており、test/bench
ディレクトリの直下ではなく、そのサブディレクトリであるshootout
ディレクトリに対してクリーンアップ操作を行う必要があることを示しています。おそらく、test/bench
ディレクトリ自体にはMakefile
が存在せず、shootout
ディレクトリにのみMakefile
が存在するため、直接shootout
を指定する必要があったと考えられます。
- このスクリプトは、Goのソースツリー内の様々なサブディレクトリに対して
-
test/bench/shootout/Makefile
の修正:- この
Makefile
は、shootout
ベンチマークのビルドプロセスを管理しています。 - 変更前は、
include ../../src/Make.inc
というパスで共通のMake.inc
ファイルを取り込んでいました。 - 変更後は、
include ../../../src/Make.inc
に修正されています。 - この変更は、
Makefile
がtest/bench/shootout
ディレクトリに存在することを考慮すると、Make.inc
ファイルへの相対パスが1階層ずれていたことを意味します。- 変更前:
test/bench/shootout
->test/bench
->src
(誤り) - 変更後:
test/bench/shootout
->test/bench
->test
->src
(正しい)
- 変更前:
Make.inc
はGoのビルドシステムにおける共通の設定や変数を定義するファイルであり、これが正しくインクルードされないと、ビルドに必要な情報が不足し、コンパイルエラーやリンクエラーが発生します。
- この
これらの修正は、Goのソースツリー内のディレクトリ構造の変更、または以前のコミットでのパス指定の誤りによって引き起こされたビルドの不整合を解消するためのものです。
コアとなるコードの変更箇所
diff --git a/src/clean.bash b/src/clean.bash
index e4e2f8f55a..3c6a3972d8 100755
--- a/src/clean.bash
+++ b/src/clean.bash
@@ -24,7 +24,7 @@ for i in lib9 libbio libmach cmd pkg \
../misc/cgo/life ../misc/cgo/test \
../misc/dashboard/builder ../misc/goplay\
../doc/codelab/wiki\
-\t../test/bench ../test/garbage
+\t../test/bench/shootout ../test/garbage
do
# Do not use gomake here. It may not be available.
$MAKE -C "$GOROOT/src/$i" clean
diff --git a/test/bench/shootout/Makefile b/test/bench/shootout/Makefile
index 145fe0cea6..e1c9b7b8e 100644
--- a/test/bench/shootout/Makefile
+++ b/test/bench/shootout/Makefile
@@ -2,7 +2,7 @@
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.
-include ../../src/Make.inc
+include ../../../src/Make.inc
all:
@echo "make clean or timing"
コアとなるコードの解説
src/clean.bash
の変更
- 変更前:
../test/bench
- 変更後:
../test/bench/shootout
この変更は、clean.bash
スクリプトがGOROOT/src
ディレクトリから実行されることを前提としています。
clean.bash
は、for i in ...
ループ内で指定された各ディレクトリに対してmake clean
コマンドを実行します。
以前は../test/bench
が指定されていましたが、これはGOROOT/test/bench
を指します。しかし、make clean
コマンドを実行する必要があるMakefile
は、実際にはGOROOT/test/bench/shootout
ディレクトリ内に存在していました。
したがって、パスを../test/bench/shootout
に修正することで、clean.bash
がshootout
ベンチマークのクリーンアップを正しく実行できるようになりました。これにより、ビルドプロセス中に生成された一時ファイルや実行可能ファイルが適切に削除され、クリーンなビルド環境が維持されます。
test/bench/shootout/Makefile
の変更
- 変更前:
include ../../src/Make.inc
- 変更後:
include ../../../src/Make.inc
この変更は、test/bench/shootout/Makefile
が、Goのビルドシステム全体で共有される共通のMake.inc
ファイルを正しくインクルードできるようにするためのものです。
Makefile
はGOROOT/test/bench/shootout
ディレクトリに存在します。
include
ディレクティブは、指定されたファイルを現在のMakefile
に読み込みます。
- 変更前の
../../src/Make.inc
は、shootout
ディレクトリから2階層上に移動し、test
ディレクトリに到達し、そこからsrc
ディレクトリを探そうとします。これは誤りです。test/bench/shootout
->test/bench
->test
(ここが誤り)
- 変更後の
../../../src/Make.inc
は、shootout
ディレクトリから3階層上に移動し、GOROOT
ディレクトリに到達し、そこからsrc/Make.inc
を正しく参照します。test/bench/shootout
->test/bench
->test
->GOROOT
(ここが正しい) この修正により、Makefile
はビルドに必要な共通の定義やルールを正しく読み込むことができ、shootout
ベンチマークのビルドが成功するようになります。
これらの変更は、Goのソースツリー内のディレクトリ構造と、スクリプトやMakefile
が実行されるコンテキストを正確に反映させることで、ビルドの不整合を解消し、全体的なビルドプロセスの信頼性を向上させています。
関連リンク
参考にした情報源リンク
- Go言語の公式ドキュメント (Goのビルドシステム、
GOROOT
,GOPATH
に関する情報) - Makefileのドキュメント (includeディレクティブ、相対パスに関する情報)
- The Computer Language Benchmarks Game (Shootoutベンチマークに関する情報)
- Gitのdiffコマンドの出力形式に関する情報
- Bashスクリプトの基本的な構文とパス解決に関する情報
- Go言語のソースコードリポジトリの構造に関する一般的な知識