[インデックス 11908] ファイルの概要
このコミットは、Go言語のビルドシステムにおけるsrc/make.bash
スクリプトの変更に関するものです。具体的には、--dist-tool
オプションを使用してビルドする際に、Goツールが配置されるディレクトリ($GOTOOLDIR
)が正しく作成されるように修正されています。
コミット
Go言語のビルドスクリプトmake.bash
において、--dist-tool
オプション使用時の$GOTOOLDIR
の作成パスが誤っていた問題を修正しました。これにより、make.bash --dist-tool
が正常に動作するようになります。
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/0ab3ea9738bb28211c156faf38923bb6c28952cb
元コミット内容
commit 0ab3ea9738bb28211c156faf38923bb6c28952cb
Author: David Symonds <dsymonds@golang.org>
Date: Wed Feb 15 09:06:24 2012 +1100
build: create the correct $GOTOOLDIR.
Before this, make.bash --dist-tool would fail,
because $GOROOT/bin/tool was being mkdir'd
instead of $GOROOT/pkg/tool/linux_amd64.
R=rsc
CC=golang-dev
https://golang.org/cl/5666046
変更の背景
この変更の背景には、Go言語のビルドプロセスにおける特定のツールの配置に関する問題がありました。コミットメッセージによると、以前のmake.bash
スクリプトでは、--dist-tool
オプションを使用してビルドを行う際に、Goのツール(特にdist
ツール)を配置するディレクトリが誤って$GOROOT/bin/tool
として作成されていました。しかし、本来ツールが配置されるべき正しいパスは、プラットフォーム固有のディレクトリ、例えばLinux AMD64環境であれば$GOROOT/pkg/tool/linux_amd64
でした。
このパスの不一致が原因で、make.bash --dist-tool
コマンドが失敗するという問題が発生していました。ビルドシステムが期待する場所にツールが作成されないため、後続のビルドステップやツールの利用が不可能になっていたと考えられます。このコミットは、このビルドの失敗を解消し、Goツールの配置をGoの標準的なディレクトリ構造に合わせることを目的としています。
前提知識の解説
このコミットを理解するためには、以下のGo言語のビルドシステムに関する前提知識が必要です。
make.bash
: Go言語のソースコードからGoツールチェイン全体をビルドするための主要なシェルスクリプトです。Goの初期のバージョンから存在し、Goのコンパイラ、リンカ、アセンブラなどのツール群を構築するために使用されます。通常、Goのソースコードをダウンロードした後、src
ディレクトリ内で./make.bash
を実行することで、Goの開発環境をセットアップします。$GOROOT
: Go言語のインストールルートディレクトリを指す環境変数です。Goの標準ライブラリ、ツール、ソースコードなどがこのディレクトリ以下に配置されます。例えば、$GOROOT/bin
にはGoの実行可能ファイル(go
コマンドなど)が、$GOROOT/pkg
にはコンパイル済みのパッケージが格納されます。$GOTOOLDIR
: Goのビルドツール(コンパイラ、リンカ、アセンブラなど)が配置されるディレクトリを指す環境変数です。このディレクトリは通常、$GOROOT/pkg/tool/<GOOS>_<GOARCH>
のような形式になります。ここで<GOOS>
はオペレーティングシステム(例:linux
)、<GOARCH>
はアーキテクチャ(例:amd64
)を示します。このパスは、クロスコンパイルをサポートするためにプラットフォームごとに異なります。cmd/dist
: Goのビルドシステム自体を管理するツールです。dist
ツールは、GoのソースコードからGoツールチェインをビルドする際の様々なタスク(例えば、ソースファイルの準備、コンパイル、リンク、テストの実行など)を調整します。make.bash
スクリプトはこのdist
ツールを利用してGoのビルドプロセスを進行させます。--dist-tool
オプション:make.bash
スクリプトに渡されるオプションの一つで、dist
ツールのみをビルドして終了することを指示します。これは、Goツールチェイン全体のビルドに先立って、ビルドシステムの中核となるdist
ツールが正しく機能するかを確認したり、特定のデバッグシナリオで使用されたりします。
これらの要素が連携して、Go言語の複雑なビルドプロセスを管理しています。このコミットは、特に$GOTOOLDIR
のパス解決とdist
ツールの配置に関する問題を修正することで、ビルドの堅牢性を高めています。
技術的詳細
このコミットが解決しようとした技術的な問題は、make.bash --dist-tool
実行時にdist
ツールが誤ったディレクトリに作成されることでした。
問題点:
以前のmake.bash
では、--dist-tool
オプションが指定された場合、dist
ツールを配置するためにmkdir -p ../bin/tool
というコマンドが実行されていました。これは、$GOROOT/bin/tool
というパスにディレクトリを作成しようとするものです。しかし、Goのビルドシステムでは、プラットフォーム固有のビルドツールは$GOTOOLDIR
、すなわち$GOROOT/pkg/tool/<GOOS>_<GOARCH>
に配置されるのが正しい挙動です。このパスの不一致が原因で、make.bash --dist-tool
が期待通りに動作せず、ビルドが失敗していました。
解決策: コミットは、この問題を以下の方法で解決しました。
- 不要な
mkdir
の削除:echo cmd/dist
の直後にあったmkdir -p ../bin/tool
の行を削除しました。これにより、誤ったパスにディレクトリが作成されることがなくなりました。 - 正しい
$GOTOOLDIR
の作成:--dist-tool
オプションの処理ブロック内にmkdir -p $GOTOOLDIR
を追加しました。これにより、dist
ツールを移動する前に、正しいターゲットディレクトリである$GOTOOLDIR
が確実に存在するようにしました。 dist
ツールの移動:mv cmd/dist/dist $GOTOOLDIR/dist
という既存の行はそのまま残され、dist
ツールが正しく作成された$GOTOOLDIR
に移動されるようになりました。
この変更により、make.bash --dist-tool
は、dist
ツールをGoの標準的なツールディレクトリに正しく配置できるようになり、ビルドの失敗が解消されました。これは、Goのビルドシステムの整合性を保ち、クロスコンパイルなどの複雑なビルドシナリオにおいてもツールの配置が予測可能であることを保証するために重要な修正です。
コアとなるコードの変更箇所
--- a/src/make.bash
+++ b/src/make.bash
@@ -57,7 +57,6 @@ done
echo '# Building C bootstrap tool.'
echo cmd/dist
-mkdir -p ../bin/tool
export GOROOT="$(cd .. && pwd)"
GOROOT_FINAL="${GOROOT_FINAL:-$GOROOT}"
DEFGOROOT='-DGOROOT_FINAL="'"$GOROOT_FINAL"'"'
@@ -67,6 +66,10 @@ echo
if [ "$1" = "--dist-tool" ]; then
# Stop after building dist tool.
+ mkdir -p $GOTOOLDIR
+ if [ "$2" != "" ]; then
+ cp cmd/dist/dist "$2"
+ fi
mv cmd/dist/dist $GOTOOLDIR/dist
exit 0
fi
コアとなるコードの解説
このコミットにおける主要な変更は、src/make.bash
スクリプト内の2つの部分にあります。
-
削除された行 (
- mkdir -p ../bin/tool
): この行は、echo cmd/dist
の直後に存在していました。以前は、dist
ツールをビルドする準備として、$GOROOT/bin/tool
というディレクトリを作成していました。しかし、前述の通り、これはGoのビルドツールが配置されるべき正しいパスではありませんでした。この行を削除することで、誤ったディレクトリが作成されることを防ぎ、ビルドプロセスの混乱を解消しました。 -
追加された行 (
+ mkdir -p $GOTOOLDIR
および+ if [ "$2" != "" ]; then cp cmd/dist/dist "$2"; fi
): これらの行は、if [ "$1" = "--dist-tool" ]; then
ブロック内に追加されました。このブロックは、make.bash
が--dist-tool
オプション付きで実行された場合にのみ処理されます。mkdir -p $GOTOOLDIR
: これがこのコミットの核心的な変更です。$GOTOOLDIR
は、Goのビルドツールが配置されるべき正しいプラットフォーム固有のディレクトリ(例:$GOROOT/pkg/tool/linux_amd64
)を指します。このコマンドを追加することで、dist
ツールを移動する前に、正しいターゲットディレクトリが確実に存在するようにしました。-p
オプションは、親ディレクトリが存在しない場合でも作成することを意味します。if [ "$2" != "" ]; then cp cmd/dist/dist "$2"; fi
: この部分は、--dist-tool
オプションに加えて2番目の引数($2
)が指定された場合に、ビルドされたdist
ツールをその指定されたパスにコピーする処理です。これは、dist
ツールを一時的な場所や特定のテスト環境に配置したい場合などに利用される可能性があります。この行は、dist
ツールが$GOTOOLDIR
に移動される前に実行されます。
これらの変更により、make.bash --dist-tool
は、dist
ツールをGoのビルドシステムが期待する正しい場所に配置できるようになり、ビルドの信頼性と正確性が向上しました。
関連リンク
- Go Change List 5666046: このコミットに対応するGoの変更リスト(Code Review)ページです。コミットの詳細な議論、レビューコメント、関連する変更履歴などを確認できます。 https://golang.org/cl/5666046
参考にした情報源リンク
- Go言語の公式ドキュメント:
Go言語のビルドプロセス、環境変数(
GOROOT
,GOPATH
など)、およびツールに関する一般的な情報源として参照しました。 https://golang.org/doc/ - Goのソースコードリポジトリ:
src/make.bash
やcmd/dist
などのGoのビルドシステム関連のファイルは、Goの公式GitHubリポジトリで確認できます。 https://github.com/golang/go - Goのビルドシステムに関する議論やドキュメント:
GOTOOLDIR
やcmd/dist
の役割について理解を深めるために、Goのメーリングリストや関連する技術ブログ、ドキュメントなどを参考にしました。 (具体的なURLはコミット情報からは特定できませんが、一般的なGoのビルドシステムに関する情報源を指します。)- 例: GoのIssueトラッカーやデザインドキュメントなど。 https://github.com/golang/go/issues https://go.dev/design/
- シェルスクリプトの一般的な知識:
mkdir -p
,export
,if [ ... ]
などのシェルスクリプトの構文とコマンドの理解に役立ちました。 (特定のURLはありませんが、Bashのmanページやオンラインのシェルスクリプトチュートリアル全般を指します。)