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

[インデックス 1179] ファイルの概要

このコミットは、Go言語の初期開発段階におけるビルドシステム、特にテスト実行後の成果物 (6.out ファイル) の管理方法に関する変更です。具体的には、gotest コマンドがテスト実行後に自動的に 6.out ファイルを削除するのをやめ、代わりに make clean コマンドで明示的に削除されるように変更しています。これにより、テスト後に 6.out ファイルの内容を確認できるようになり、デバッグや分析の利便性が向上します。

コミット

  • コミットハッシュ: f1547e511b51b3f00e208fa80350c391bf6957d1
  • 作者: Russ Cox rsc@golang.org
  • コミット日時: 2008年11月19日 水曜日 09:40:54 -0800

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/f1547e511b51b3f00e208fa80350c391bf6957d1

元コミット内容

leave 6.out around after gotest;
delete it in make clean.

R=r
DELTA=10  (0 added, 0 deleted, 10 changed)
OCL=19542
CL=19581

変更の背景

この変更の背景には、Go言語の初期開発におけるビルドおよびテストプロセスの改善があります。以前は、gotest コマンドがテスト実行後に生成される 6.out という実行可能ファイルを自動的に削除していました。しかし、この 6.out ファイルは、テストが失敗した場合や、テストの動作を詳細に分析したい場合に、その内容(例えば、テストバイナリ自体や、テスト実行時の出力など)を確認するために有用であると考えられました。

自動削除の挙動は、開発者がテスト後のデバッグや調査を行う際に不便をもたらしていました。そこで、6.out ファイルをテスト後に残すことで、開発者が手動でその内容を検査できるようにし、一方で、ビルド環境をクリーンに保つための make clean コマンドで適切に削除されるように責任を移すことが決定されました。これにより、開発のワークフローにおける利便性とクリーンアップのバランスが取られました。

前提知識の解説

このコミットを理解するためには、以下のGo言語初期のビルドシステムと関連する概念について知る必要があります。

  1. 6.out とは: Go言語の初期のビルドシステムでは、コンパイラやリンカが生成する実行可能ファイルやオブジェクトファイルに、ターゲットアーキテクチャを示すプレフィックスが付与されていました。

    • 6 は、AMD64 (x86-64) アーキテクチャを指していました。これは、Plan 9 from Bell Labs の慣習に由来します。
    • 8 は、386 (x86) アーキテクチャを指しました。
    • 5 は、ARM アーキテクチャを指しました。 したがって、6.out は、AMD64 向けにコンパイルされた実行可能ファイル(テストバイナリを含む)のデフォルトの出力ファイル名でした。これは、現在の go build が生成する実行可能ファイル名(通常はパッケージ名と同じ)とは異なります。
  2. gobuild とは: gobuild は、Go言語の初期のビルドツールの一つです。これは、Goのソースコードから Makefile を生成する役割を担っていました。現在の go build コマンドに相当する機能の一部を担っていましたが、より低レベルで Makefile を介したビルドプロセスを前提としていました。

  3. gotest とは: gotest は、Go言語の初期のテスト実行ツールです。現在の go test コマンドに相当します。テストコードをコンパイルし、実行し、その結果を報告する役割を担っていました。このツールはシェルスクリプトとして実装されており、テストバイナリの生成と実行、そして一時ファイルのクリーンアップを管理していました。

  4. Makefilemake clean: Makefile は、make ユーティリティがプロジェクトのビルドプロセスを自動化するために使用するファイルです。Go言語の初期のプロジェクトでは、C言語やUnix系のプロジェクトと同様に Makefile が広く利用されていました。 clean ターゲットは、Makefile において、ビルドプロセス中に生成された一時ファイルや成果物(オブジェクトファイル、実行可能ファイルなど)を削除するための標準的な慣習です。make clean を実行することで、ビルドディレクトリをクリーンな状態に戻すことができます。

  5. シェルスクリプトの trap コマンド: trap コマンドは、Unix系シェルスクリプトにおいて、特定のシグナルを受信したときに実行するコマンドを指定するために使用されます。 構文は trap "command" signal1 signal2 ... です。 このコミットで特に重要なのは、trap "rm -f _testmain.go _testmain.6 6.out" 0 1 2 3 14 15 のような記述です。

    • rm -f _testmain.go _testmain.6 6.out: 削除するファイルリスト。
    • 0: シェルスクリプトが正常終了したときに実行されるシグナル(EXITシグナル)。
    • 1 (SIGHUP), 2 (SIGINT), 3 (SIGQUIT), 14 (SIGALRM), 15 (SIGTERM): これらのシグナルを受信したときにも指定されたコマンドが実行されます。これにより、スクリプトが予期せず終了した場合でも、一時ファイルがクリーンアップされるように設計されていました。

技術的詳細

このコミットは、主に以下の2つの側面で 6.out ファイルの管理ロジックを変更しています。

  1. gotest スクリプトからの自動削除の停止: src/cmd/gotest/gotest シェルスクリプトでは、trap コマンドを使用して、スクリプトの終了時(正常終了または特定のシグナル受信時)に一時ファイルを自動的に削除していました。この一時ファイルリストの中に 6.out が含まれていました。 変更前: trap "rm -f _testmain.go _testmain.6 6.out" 0 1 2 3 14 15 変更後: trap "rm -f _testmain.go _testmain.6" 0 1 2 3 14 15 この変更により、6.outtrap コマンドの対象から外され、gotest の実行が終了しても 6.out ファイルが削除されずに残るようになりました。

  2. Makefileclean ターゲットへの $O.out の追加: Go言語の初期のビルドシステムでは、各パッケージの Makefileclean ターゲットが定義されており、ビルド成果物を削除する役割を担っていました。 このコミットでは、src/cmd/gobuild/gobuild.c (これは Makefile を生成するツール) と、src/lib/fmt/Makefilesrc/lib/http/Makefile など、Go標準ライブラリの複数の Makefile に変更が加えられています。 変更前: rm -f *.$O *.a 変更後: rm -f *.$O *.a $O.out ここで $O は、ビルド環境に応じて 6 (AMD64), 8 (x86), 5 (ARM) などのアーキテクチャ識別子に展開される変数です。したがって、$O.out6.out8.out5.out のいずれかに解決されます。 この変更により、make clean コマンドが実行された際に、6.out (または対応するアーキテクチャの .out ファイル) が明示的に削除されるようになりました。

これらの変更は、6.out ファイルのライフサイクルを、テスト実行後の即時削除から、明示的なクリーンアップコマンドによる削除へと移行させるものです。これにより、開発者はテスト結果のデバッグや分析のために 6.out を保持しつつ、必要に応じてビルド環境をクリーンに保つことができるようになりました。

コアとなるコードの変更箇所

このコミットは、以下のファイルに影響を与えています。

  1. src/cmd/gobuild/gobuild.c:

    --- a/src/cmd/gobuild/gobuild.c
    +++ b/src/cmd/gobuild/gobuild.c
    @@ -280,7 +280,7 @@ char preamble[] =
     	"default: packages\\n"\
     	"\\n"\
     	"clean:\\n"\
    -	"\\trm -f *.$O *.a\\n"\
    +	"\\trm -f *.$O *.a $O.out\\n"\
     	"\\n"\
     	"test: packages\\n"\
     	"\\tgotest\\n"
    
  2. src/cmd/gotest/gotest:

    --- a/src/cmd/gotest/gotest
    +++ b/src/cmd/gotest/gotest
    @@ -41,7 +41,7 @@ done
     set -e
     
     # They all compile; now generate the code to call them.
    -trap "rm -f _testmain.go _testmain.6 6.out" 0 1 2 3 14 15
    +trap "rm -f _testmain.go _testmain.6" 0 1 2 3 14 15
     {
     	# package spec
     	echo 'package main'
    
  3. src/lib/*/Makefile (例: src/lib/fmt/Makefile, src/lib/http/Makefile など、計8ファイル): これらのファイルはすべて同様の変更を受けています。

    --- a/src/lib/fmt/Makefile
    +++ b/src/lib/fmt/Makefile
    @@ -13,7 +13,7 @@ AR=$(O)ar
     default: packages
     
     clean:
    -	rm -f *.$O *.a
    +	rm -f *.$O *.a $O.out
     
     test: packages
     	gotest
    

コアとなるコードの解説

  1. src/cmd/gobuild/gobuild.c の変更: このファイルは、Goのビルドシステムが Makefile を生成する際に使用するテンプレートの一部を定義しています。clean ターゲットの rm -f コマンドに $O.out が追加されました。これは、gobuild が生成するすべての Makefile に、make clean 実行時に 6.out (または対応するアーキテクチャの .out ファイル) を削除する指示が含まれるようになることを意味します。これにより、6.out のクリーンアップがビルドシステム全体で一貫して管理されるようになります。

  2. src/cmd/gotest/gotest の変更: このシェルスクリプトは、Goのテストを実行する際のロジックを定義しています。変更前は、スクリプトの終了時に trap コマンドによって 6.out が自動的に削除されていました。この変更により、6.outtrap コマンドの対象から外され、gotest が終了しても 6.out が残るようになりました。これは、テスト実行後に 6.out を検査したい開発者のニーズに応えるための直接的な変更です。

  3. src/lib/*/Makefile の変更: Go標準ライブラリの各パッケージの Makefile にも、clean ターゲットの rm -f コマンドに $O.out が追加されました。これは、gobuild が生成する Makefile の変更と同期しており、各ライブラリのテスト実行によって生成された 6.out ファイルが、そのライブラリの make clean コマンドによって適切に削除されることを保証します。これにより、個々のパッケージレベルでのクリーンアップも 6.out を対象とするようになりました。

これらの変更は、6.out ファイルの管理責任を gotest の自動クリーンアップから、より明示的な make clean コマンドへと移行させることで、開発者のデバッグ体験を向上させつつ、ビルド環境の整合性を保つことを目的としています。

関連リンク

Go言語の初期のビルドシステムやツールの詳細に関する公式ドキュメントは、このコミットが非常に古い(2008年)ため、現在のGoのドキュメントサイトでは直接見つけるのが難しい場合があります。しかし、Goのソースコードリポジトリ自体が、当時の設計や実装の最も正確な情報源となります。

  • Go言語の公式GitHubリポジトリ: https://github.com/golang/go このコミットの変更は、このリポジトリの歴史の一部です。

参考にした情報源リンク