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

[インデックス 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ツール群とは性質が異なります。

ビルドスクリプトにおける古いバイナリのクリーンアップの目的

ビルドスクリプトが古いバイナリをクリーンアップする主な目的は以下の通りです。

  1. 環境の整合性維持: 過去のビルドで生成された古いバージョンのツールやコンパイラが残っていると、新しいビルドプロセスと競合したり、予期せぬ動作を引き起こしたりする可能性があります。クリーンアップにより、常に最新かつ整合性の取れたビルド環境を保証します。
  2. ディスクスペースの節約: 不要なビルド成果物が蓄積されるのを防ぎ、ディスクスペースを節約します。
  3. ビルドの信頼性向上: クリーンな状態からビルドを開始することで、過去のビルドの残骸による問題を排除し、ビルドの信頼性を高めます。
  4. ツールの更新: 新しいバージョンのツールがビルドされる際に、古いバージョンを確実に置き換えるために、事前に削除する場合があります。

技術的詳細

このコミットの技術的な変更は、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行です。

  1. -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 が含まれている点です。
    • 行頭の - は、この行が削除されたことを意味します。
  2. +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 ツールに関する一般的な知識