[インデックス 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=
- 検索結果は、