[インデックス 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言語初期のビルドシステムと関連する概念について知る必要があります。
-
6.out
とは: Go言語の初期のビルドシステムでは、コンパイラやリンカが生成する実行可能ファイルやオブジェクトファイルに、ターゲットアーキテクチャを示すプレフィックスが付与されていました。6
は、AMD64 (x86-64) アーキテクチャを指していました。これは、Plan 9 from Bell Labs の慣習に由来します。8
は、386 (x86) アーキテクチャを指しました。5
は、ARM アーキテクチャを指しました。 したがって、6.out
は、AMD64 向けにコンパイルされた実行可能ファイル(テストバイナリを含む)のデフォルトの出力ファイル名でした。これは、現在のgo build
が生成する実行可能ファイル名(通常はパッケージ名と同じ)とは異なります。
-
gobuild
とは:gobuild
は、Go言語の初期のビルドツールの一つです。これは、GoのソースコードからMakefile
を生成する役割を担っていました。現在のgo build
コマンドに相当する機能の一部を担っていましたが、より低レベルでMakefile
を介したビルドプロセスを前提としていました。 -
gotest
とは:gotest
は、Go言語の初期のテスト実行ツールです。現在のgo test
コマンドに相当します。テストコードをコンパイルし、実行し、その結果を報告する役割を担っていました。このツールはシェルスクリプトとして実装されており、テストバイナリの生成と実行、そして一時ファイルのクリーンアップを管理していました。 -
Makefile
とmake clean
:Makefile
は、make
ユーティリティがプロジェクトのビルドプロセスを自動化するために使用するファイルです。Go言語の初期のプロジェクトでは、C言語やUnix系のプロジェクトと同様にMakefile
が広く利用されていました。clean
ターゲットは、Makefile
において、ビルドプロセス中に生成された一時ファイルや成果物(オブジェクトファイル、実行可能ファイルなど)を削除するための標準的な慣習です。make clean
を実行することで、ビルドディレクトリをクリーンな状態に戻すことができます。 -
シェルスクリプトの
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
ファイルの管理ロジックを変更しています。
-
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.out
がtrap
コマンドの対象から外され、gotest
の実行が終了しても6.out
ファイルが削除されずに残るようになりました。 -
Makefile
のclean
ターゲットへの$O.out
の追加: Go言語の初期のビルドシステムでは、各パッケージのMakefile
にclean
ターゲットが定義されており、ビルド成果物を削除する役割を担っていました。 このコミットでは、src/cmd/gobuild/gobuild.c
(これはMakefile
を生成するツール) と、src/lib/fmt/Makefile
、src/lib/http/Makefile
など、Go標準ライブラリの複数のMakefile
に変更が加えられています。 変更前:rm -f *.$O *.a
変更後:rm -f *.$O *.a $O.out
ここで$O
は、ビルド環境に応じて6
(AMD64),8
(x86),5
(ARM) などのアーキテクチャ識別子に展開される変数です。したがって、$O.out
は6.out
、8.out
、5.out
のいずれかに解決されます。 この変更により、make clean
コマンドが実行された際に、6.out
(または対応するアーキテクチャの.out
ファイル) が明示的に削除されるようになりました。
これらの変更は、6.out
ファイルのライフサイクルを、テスト実行後の即時削除から、明示的なクリーンアップコマンドによる削除へと移行させるものです。これにより、開発者はテスト結果のデバッグや分析のために 6.out
を保持しつつ、必要に応じてビルド環境をクリーンに保つことができるようになりました。
コアとなるコードの変更箇所
このコミットは、以下のファイルに影響を与えています。
-
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"
-
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'
-
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
コアとなるコードの解説
-
src/cmd/gobuild/gobuild.c
の変更: このファイルは、GoのビルドシステムがMakefile
を生成する際に使用するテンプレートの一部を定義しています。clean
ターゲットのrm -f
コマンドに$O.out
が追加されました。これは、gobuild
が生成するすべてのMakefile
に、make clean
実行時に6.out
(または対応するアーキテクチャの.out
ファイル) を削除する指示が含まれるようになることを意味します。これにより、6.out
のクリーンアップがビルドシステム全体で一貫して管理されるようになります。 -
src/cmd/gotest/gotest
の変更: このシェルスクリプトは、Goのテストを実行する際のロジックを定義しています。変更前は、スクリプトの終了時にtrap
コマンドによって6.out
が自動的に削除されていました。この変更により、6.out
がtrap
コマンドの対象から外され、gotest
が終了しても6.out
が残るようになりました。これは、テスト実行後に6.out
を検査したい開発者のニーズに応えるための直接的な変更です。 -
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 このコミットの変更は、このリポジトリの歴史の一部です。
参考にした情報源リンク
- Go言語のバージョン履歴: Go言語のバージョン命名規則や歴史的背景を理解するために参照しました。
- Plan 9 from Bell Labs のアーキテクチャ命名規則:
6
,8
,5
などの数字がアーキテクチャを指す慣習について理解するために参照しました。- https://9p.io/wiki/plan9/faq/index.html (Plan 9のFAQなど)
- Unix/Linux シェルスクリプトの
trap
コマンド:trap
コマンドの動作とシグナル処理について理解するために参照しました。- 一般的なシェルスクリプトのドキュメントやチュートリアル。
Makefile
の基本とclean
ターゲット:Makefile
の構造とclean
ターゲットの役割について理解するために参照しました。- 一般的な
make
ユーティリティのドキュメントやチュートリアル。
- 一般的な
- Google Web Search: 「Go 6.out early development」などのキーワードで検索を行い、関連する情報や文脈を探索しました。
- 検索結果は、
6.out
がGoの公式バージョン名ではないことを示唆し、初期のビルドアーティファクトである可能性が高いという仮説を補強しました。- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFec9dcaHzBaGjgF6zio2ErbuctuGg9npq_zf7dS8dof1ggcm9_gSR2d6yWmVTFBnWZhuYRM1ZS87EoWLIR9Sp2FyVaIxFQJ4SF8YR_UqSdc3Wjk75UhgQGEJWLXjCj2yFpx3pQL6FCo5ZxVzpt
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGM0kBJegd6AI2G4ygOkghPDcUHAh_B5O5NekUS2USej6lAeje6dyXfPGQ9Gew7H2WVHa59ZjsVMEfKmOeIidlS7yF1eO0kDUvpVNkTC7rxcc9tfQ_KBhKC4VY-z9qEQOEKVyCkmd_rCTwizDis6gQyUg==
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHLWt5v4Ig_gyX80lXLWUFArZRbdc4odls0sUe09lK5ECB2Ep5Ldj3JXmnJji0GXzRMRIgM_z8T0ueFd2szC_CEEQO5Trs4yGwbWzcL027c6coh-Vo_fwS8X00=
- 検索結果は、