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

[インデックス 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つの異なるファイル内のパス参照を修正しています。

  1. src/clean.bash の修正:

    • このスクリプトは、Goのソースツリー内の様々なサブディレクトリに対してmake cleanコマンドを実行することで、ビルドによって生成されたファイルを削除します。
    • 変更前は、../test/benchというパスが指定されていました。
    • 変更後は、../test/bench/shootoutに修正されています。
    • これは、clean.bashsrcディレクトリから実行されることを前提としており、test/benchディレクトリの直下ではなく、そのサブディレクトリであるshootoutディレクトリに対してクリーンアップ操作を行う必要があることを示しています。おそらく、test/benchディレクトリ自体にはMakefileが存在せず、shootoutディレクトリにのみMakefileが存在するため、直接shootoutを指定する必要があったと考えられます。
  2. test/bench/shootout/Makefile の修正:

    • このMakefileは、shootoutベンチマークのビルドプロセスを管理しています。
    • 変更前は、include ../../src/Make.incというパスで共通のMake.incファイルを取り込んでいました。
    • 変更後は、include ../../../src/Make.incに修正されています。
    • この変更は、Makefiletest/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.bashshootoutベンチマークのクリーンアップを正しく実行できるようになりました。これにより、ビルドプロセス中に生成された一時ファイルや実行可能ファイルが適切に削除され、クリーンなビルド環境が維持されます。

test/bench/shootout/Makefile の変更

  • 変更前: include ../../src/Make.inc
  • 変更後: include ../../../src/Make.inc

この変更は、test/bench/shootout/Makefileが、Goのビルドシステム全体で共有される共通のMake.incファイルを正しくインクルードできるようにするためのものです。 MakefileGOROOT/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言語のソースコードリポジトリの構造に関する一般的な知識