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

[インデックス 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が期待通りに動作せず、ビルドが失敗していました。

解決策: コミットは、この問題を以下の方法で解決しました。

  1. 不要なmkdirの削除: echo cmd/distの直後にあったmkdir -p ../bin/toolの行を削除しました。これにより、誤ったパスにディレクトリが作成されることがなくなりました。
  2. 正しい$GOTOOLDIRの作成: --dist-toolオプションの処理ブロック内にmkdir -p $GOTOOLDIRを追加しました。これにより、distツールを移動する前に、正しいターゲットディレクトリである$GOTOOLDIRが確実に存在するようにしました。
  3. 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つの部分にあります。

  1. 削除された行 (- mkdir -p ../bin/tool): この行は、echo cmd/distの直後に存在していました。以前は、distツールをビルドする準備として、$GOROOT/bin/toolというディレクトリを作成していました。しかし、前述の通り、これはGoのビルドツールが配置されるべき正しいパスではありませんでした。この行を削除することで、誤ったディレクトリが作成されることを防ぎ、ビルドプロセスの混乱を解消しました。

  2. 追加された行 (+ 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.bashcmd/distなどのGoのビルドシステム関連のファイルは、Goの公式GitHubリポジトリで確認できます。 https://github.com/golang/go
  • Goのビルドシステムに関する議論やドキュメント: GOTOOLDIRcmd/distの役割について理解を深めるために、Goのメーリングリストや関連する技術ブログ、ドキュメントなどを参考にしました。 (具体的なURLはコミット情報からは特定できませんが、一般的なGoのビルドシステムに関する情報源を指します。)
  • シェルスクリプトの一般的な知識: mkdir -p, export, if [ ... ]などのシェルスクリプトの構文とコマンドの理解に役立ちました。 (特定のURLはありませんが、Bashのmanページやオンラインのシェルスクリプトチュートリアル全般を指します。)