[インデックス 11468] ファイルの概要
本コミットは、Go言語プロジェクトのビルドスクリプトである src/make.bash
において、hgpatch
というツールがビルドクリーンアップ時に削除されるリストから除外されるように変更するものです。これにより、hgpatch
がビルドプロセス中に誤って削除されることを防ぎます。
コミット
このコミットは、Go言語のビルドシステムにおけるクリーンアップ処理の改善を目的としています。具体的には、src/make.bash
スクリプト内で、古いバイナリを削除する際に hgpatch
ツールが誤って削除対象に含まれていた問題を修正します。hgpatch
はMercurial (hg) リポジトリに対するパッチ適用に関連するツールであり、Goのビルドプロセスにおいて特定の役割を果たす可能性があります。この変更により、hgpatch
がビルド環境から不必要に削除されることがなくなり、ビルドの安定性とツールの可用性が向上します。
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/2d6c0116744df631e3df629055bb54dcc9e8a3e9
元コミット内容
make.bash: don't remove hgpatch
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5598046
変更の背景
Go言語のビルドシステムは、src/make.bash
のようなシェルスクリプトを使用して、ソースコードのコンパイル、ツールのビルド、および古いバイナリのクリーンアップを行います。このスクリプトには、過去のビルドで生成された可能性のある古いツールやコンパイラを削除するセクションが含まれています。
hgpatch
は、Mercurial (hg) バージョン管理システムに関連するツールであり、Goプロジェクトの初期段階ではMercurialが主要なバージョン管理システムとして使用されていました。そのため、hgpatch
はGoのビルド環境や開発ワークフローにおいて重要な役割を担っていた可能性があります。
しかし、src/make.bash
の既存のクリーンアップロジックでは、hgpatch
が他の古いGoツール群と共に無差別に削除されるリストに含まれていました。これは、hgpatch
がGoのコアツールではないにもかかわらず、ビルド環境の整合性を保つために必要とされる場合に、誤って削除されてしまう可能性を意味します。
このコミットの背景には、hgpatch
がビルドプロセスや開発ワークフローにおいて引き続き必要とされるツールであるにもかかわらず、クリーンアップスクリプトによって不適切に削除されるという問題があったと考えられます。この変更は、hgpatch
の意図しない削除を防ぎ、ビルド環境の安定性を確保することを目的としています。
前提知識の解説
make.bash
make.bash
は、Go言語プロジェクトのルートディレクトリにある主要なビルドスクリプトです。これはBashシェルスクリプトで書かれており、Goコンパイラ、標準ライブラリ、および各種開発ツールのビルドプロセスを自動化します。GoのソースコードからGo自体をビルドする「ブートストラップ」プロセスにおいて中心的な役割を果たします。このスクリプトは、環境変数の設定、依存関係のチェック、コンパイル、テスト、そして古いビルド成果物のクリーンアップなど、多岐にわたるタスクを実行します。
GOROOT
GOROOT
は、Go言語のインストールディレクトリのルートパスを示す環境変数です。Goのコンパイラ、標準ライブラリ、およびツール群がこのディレクトリ以下に配置されます。make.bash
スクリプトは、この GOROOT
を参照して、ビルドされたバイナリを適切な場所に配置したり、古いバイナリを削除したりします。
GOBIN
GOBIN
は、Goのコマンドラインツールがインストールされるディレクトリのパスを示す環境変数です。通常、$GOROOT/bin
がデフォルトですが、ユーザーが独自のツールディレクトリを指定するために設定することもあります。make.bash
は、GOBIN
が設定されている場合に、そのディレクトリ内の古いGoツールもクリーンアップの対象とします。
rm -f
rm -f
はUnix/Linux系のコマンドで、ファイルやディレクトリを強制的に(-f
オプション)削除するために使用されます。f
は "force" を意味し、存在しないファイルを削除しようとしてもエラーを出さず、また、通常は確認を求めるような状況でも確認なしに削除を実行します。ビルドスクリプトでは、古い成果物を確実に削除するために頻繁に利用されます。
hgpatch
hgpatch
は、Mercurial (hg) バージョン管理システムに関連するツールです。MercurialはGitと同様に分散型バージョン管理システムであり、Goプロジェクトの初期にはその開発に広く利用されていました。hgpatch
は、Mercurialリポジトリに対してパッチファイル(差分情報を含むファイル)を適用する機能を提供します。Goの開発ワークフローにおいて、特定の変更を適用したり、異なるブランチ間の差分を管理したりするために使用されていた可能性があります。このツールはGo言語で書かれたものではなく、Goのビルドプロセスで生成されるGoツール群とは性質が異なります。
ビルドスクリプトにおける古いバイナリのクリーンアップの目的
ビルドスクリプトが古いバイナリをクリーンアップする主な目的は以下の通りです。
- 環境の整合性維持: 過去のビルドで生成された古いバージョンのツールやコンパイラが残っていると、新しいビルドプロセスと競合したり、予期せぬ動作を引き起こしたりする可能性があります。クリーンアップにより、常に最新かつ整合性の取れたビルド環境を保証します。
- ディスクスペースの節約: 不要なビルド成果物が蓄積されるのを防ぎ、ディスクスペースを節約します。
- ビルドの信頼性向上: クリーンな状態からビルドを開始することで、過去のビルドの残骸による問題を排除し、ビルドの信頼性を高めます。
- ツールの更新: 新しいバージョンのツールがビルドされる際に、古いバージョンを確実に置き換えるために、事前に削除する場合があります。
技術的詳細
このコミットの技術的な変更は、src/make.bash
スクリプト内の rm -f
コマンドの引数から hgpatch
を削除することに集約されます。
元のコードでは、$GOROOT/bin
および $GOBIN
ディレクトリ内の古いGoツール群を削除する際に、以下のようなコマンドが使用されていました。
rm -f "$GOROOT"/bin/{6cov,6nm,cgo,ebnflint,goapi,gofix,goinstall,gomake,gopack,gopprof,gotest,gotype,govet,goyacc,hgpatch,quietgcc}
このコマンドは、{}
で囲まれたリスト内のすべてのファイルを削除します。このリストには、6cov
, 6nm
, cgo
といったGoのビルドプロセスで生成されるツールに加えて、hgpatch
が含まれていました。
今回の変更では、このリストから hgpatch
が削除されました。
rm -f "$GOROOT"/bin/{6cov,6nm,cgo,ebnflint,goapi,gofix,goinstall,gomake,gopack,gopprof,gotest,gotype,govet,goyacc,quietgcc}
同様の変更が、GOBIN
が設定されている場合のクリーンアップ処理にも適用されています。
この変更により、make.bash
が実行されても hgpatch
は自動的に削除されなくなります。これは、hgpatch
がGoのビルドシステムによって生成されるツールではなく、外部のMercurial関連ツールであり、Goのビルドクリーンアップの対象とすべきではないという判断に基づいています。hgpatch
が開発ワークフローにおいて引き続き必要とされる場合、この変更はツールの可用性を保証し、開発者の手間を省きます。
コアとなるコードの変更箇所
--- a/src/make.bash
+++ b/src/make.bash
@@ -27,13 +27,13 @@ mkdir -p "$GOROOT/pkg"
# Remove old, pre-go-tool binaries.
rm -f "$GOROOT"/bin/[568][acgl]
-rm -f "$GOROOT"/bin/{6cov,6nm,cgo,ebnflint,goapi,gofix,goinstall,gomake,gopack,gopprof,gotest,gotype,govet,goyacc,hgpatch,quietgcc}
+rm -f "$GOROOT"/bin/{6cov,6nm,cgo,ebnflint,goapi,gofix,goinstall,gomake,gopack,gopprof,gotest,gotype,govet,goyacc,quietgcc}
# If GOBIN is set and it has a Go compiler, it must also be cleaned.
if [ -n "GOBIN" ]; then
if [ -x "$GOBIN"/5g -o -x "$GOBIN"/6g -o -x "$GOBIN"/8g ]; then
rm -f "$GOBIN"/[568][acgl]
-\t\trm -f "$GOBIN"/{6cov,6nm,cgo,ebnflint,goapi,gofix,goinstall,gomake,gopack,gopprof,gotest,gotype,govet,goyacc,hgpatch,quietgcc}\n+\t\trm -f "$GOBIN"/{6cov,6nm,cgo,ebnflint,goapi,gofix,goinstall,gomake,gopack,gopprof,gotest,gotype,govet,goyacc,quietgcc}
fi
fi
コアとなるコードの解説
上記の diff
は、src/make.bash
ファイルに対する変更を示しています。
--- a/src/make.bash
と+++ b/src/make.bash
は、それぞれ変更前のファイルと変更後のファイルを示します。@@ -27,13 +27,13 @@
は、変更がファイルの27行目から始まり、変更前と変更後でそれぞれ13行のコンテキストがあることを示します。
変更の具体的な内容は以下の2行です。
-
-rm -f "$GOROOT"/bin/{6cov,6nm,cgo,ebnflint,goapi,gofix,goinstall,gomake,gopack,gopprof,gotest,gotype,govet,goyacc,hgpatch,quietgcc}
- この行は変更前のコードで、
$GOROOT/bin
ディレクトリ内の古いGoツールを削除するrm -f
コマンドです。 - 注目すべきは、削除対象のリスト
{...}
の中にhgpatch
が含まれている点です。 - 行頭の
-
は、この行が削除されたことを意味します。
- この行は変更前のコードで、
-
+rm -f "$GOROOT"/bin/{6cov,6nm,cgo,ebnflint,goapi,gofix,goinstall,gomake,gopack,gopprof,gotest,gotype,govet,goyacc,quietgcc}
- この行は変更後のコードで、同様に
$GOROOT/bin
ディレクトリ内の古いGoツールを削除するrm -f
コマンドです。 - 変更点として、削除対象のリスト
{...}
からhgpatch
が取り除かれています。 - 行頭の
+
は、この行が追加されたことを意味します。
- この行は変更後のコードで、同様に
同様の変更が、GOBIN
環境変数が設定されている場合のクリーンアップ処理にも適用されています。
この変更により、make.bash
が実行される際に、hgpatch
は $GOROOT/bin
や $GOBIN
ディレクトリから自動的に削除されなくなります。これは、hgpatch
がGoのビルドシステムが生成するツールではなく、外部の依存関係として扱われるべきであるという認識に基づいています。
関連リンク
- Go Code Review 5598046: このコミットの元となったGoのコードレビューシステム (Gerrit) の変更リストです。詳細な議論や背景情報が含まれている可能性があります。
参考にした情報源リンク
- 上記のGo Code Reviewリンク
- Go言語のビルドシステムに関する一般的な知識
- Mercurial (hg) および
hgpatch
ツールに関する一般的な知識