[インデックス 11824] ファイルの概要
このコミットは、Go言語のビルドシステムにおける2つの主要な変更を導入しています。第一に、Windows環境でmake.bash
スクリプトが誤って使用されることを防ぐためのチェックを追加し、ユーザーにmake.bat
の使用を促します。第二に、ブートストラップビルドプロセス中にcmd/dist
のビルドフェーズが他のビルドフェーズと同様に表示されるように、出力にecho cmd/dist
を追加しています。これにより、ビルドプロセスの可視性と一貫性が向上します。
コミット
commit b5d81e5ed57287a97b0f81b1928f8356e8660afc
Author: Russ Cox <rsc@golang.org>
Date: Sun Feb 12 23:14:37 2012 -0500
build: reject make.bash on Windows
Also, echo cmd/dist during bootstrap build
Makes that phase look like all the others.
Fixes #2908.
R=golang-dev, alex.brainman, bradfitz
CC=golang-dev
https://golang.org/cl/5655065
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/b5d81e5ed57287a97b0f81b1928f8356e8660afc
元コミット内容
build: reject make.bash on Windows
Also, echo cmd/dist during bootstrap build
Makes that phase look like all the others.
Fixes #2908.
変更の背景
このコミットは、Go言語のビルドプロセスにおける特定の課題に対処するために行われました。
-
Windowsでの
make.bash
誤用防止: Go言語のビルドシステムは、Unix系システム(Linux, macOSなど)ではmake.bash
スクリプトを、Windowsシステムではmake.bat
スクリプトを使用するように設計されています。しかし、Windows環境にGit BashやCygwinなどのUnix互換環境がインストールされている場合、ユーザーが誤ってmake.bash
を実行してしまう可能性がありました。make.bash
はUnix系コマンドに依存しているため、Windows環境で実行すると予期せぬエラーやビルドの失敗を引き起こす可能性がありました。この変更は、このような誤用を検出し、適切なスクリプト(make.bat
)の使用を促すことで、ユーザーエクスペリエンスを向上させ、ビルドの安定性を確保することを目的としています。 -
ブートストラップビルドの出力の一貫性: Goのビルドプロセスは、Goコンパイラ自体をビルドするために、まず既存のCコンパイラを使用してGoのサブセット(ブートストラップツール)をビルドするという「ブートストラップ」フェーズを含みます。このフェーズでは、
cmd/dist
というツールがビルドされます。コミットメッセージにある「Makes that phase look like all the others.」という記述は、このcmd/dist
のビルドフェーズが、他のビルドフェーズと同様に、現在ビルドされているモジュール名(この場合はcmd/dist
)を標準出力に表示するように変更されたことを示しています。これにより、ビルドの進行状況がより明確になり、ユーザーがどのステップで何が起こっているかを把握しやすくなります。 -
Issue #2908の修正: コミットメッセージには「Fixes #2908」と記載されています。これは、このコミットがGoプロジェクトのIssueトラッカーで報告された2908番の問題を解決したことを意味します。Web検索では、Go言語に関連する複数の「Issue 2908」が存在し、このコミットが修正した具体的な問題の内容を特定することはできませんでした。しかし、コミット内容から判断すると、このIssueはWindows環境でのビルドスクリプトの誤用、またはブートストラップビルドの出力に関する問題であった可能性が高いです。
前提知識の解説
このコミットを理解するためには、以下の概念について知っておく必要があります。
- Go言語のビルドシステム: Go言語は、自身のコンパイラや標準ライブラリをソースコードからビルドするための独自のブートストラッププロセスを持っています。これは、GoのソースコードがGo自身で書かれているため、最初にGoのサブセットをC言語などでビルドし、それを使って完全なGoコンパイラをビルドするという多段階のプロセスです。
make.bash
とmake.bat
:make.bash
: Unix系システム(Linux, macOSなど)でGoをビルドするためのシェルスクリプトです。bash
シェルで実行されることを前提としており、uname
などのUnix系コマンドを使用します。make.bat
: WindowsシステムでGoをビルドするためのバッチスクリプトです。Windowsのコマンドプロンプト(cmd.exe
)で実行されることを前提としており、Windows固有のコマンドを使用します。
uname
コマンド: Unix系システムで動作しているオペレーティングシステムの情報を表示するコマンドです。例えば、uname
はLinux
、Darwin
(macOS)、MINGW
(MinGW環境)、CYGWIN
(Cygwin環境)などを返します。このコミットでは、uname
の出力を使ってWindows環境(MinGW, Cygwin, WIN32など)を検出しています。cmd/dist
: Goのブートストラップビルドプロセスで最初にビルドされる重要なツールの一つです。これは、Goのツールチェインの他の部分をビルドするために使用される、Goの初期コンパイラとリンカの役割を果たすC言語で書かれたプログラムです。- ブートストラップビルド: 自身をコンパイルできるコンパイラを構築するプロセスです。Goの場合、Goコンパイラ自体がGoで書かれているため、まずC言語で書かれた最小限のGoコンパイラ(ブートストラップコンパイラ)をビルドし、そのブートストラップコンパイラを使って完全なGoコンパイラをビルドします。
技術的詳細
このコミットは、src/make.bash
とsrc/make.bat
の2つのファイルに変更を加えています。
src/make.bash
の変更
src/make.bash
には、Windows環境での実行を検出して拒否する新しいセクションが追加されました。
# Test for Windows.
case "$(uname)" in
*MINGW* | *WIN32* | *CYGWIN*)
echo 'ERROR: Do not use make.bash to build on Windows.'
echo 'Use make.bat instead.'
echo
exit 1
;;
esac
case "$(uname)" in ... esac
: これはシェルスクリプトの条件分岐構文で、uname
コマンドの出力に基づいて処理を分岐させます。*MINGW* | *WIN32* | *CYGWIN*)
:uname
の出力がMINGW
、WIN32
、またはCYGWIN
のいずれかの文字列を含む場合にマッチします。これらの文字列は、それぞれMinGW、ネイティブWindows(Git Bashなど)、CygwinといったWindows上のUnix互換環境でuname
を実行した際に返される可能性のある値です。echo 'ERROR: ...'
: マッチした場合、エラーメッセージを標準出力に表示します。ユーザーにmake.bash
ではなくmake.bat
を使用するよう明確に指示します。exit 1
: エラーコード1でスクリプトを終了します。これにより、ビルドプロセスが停止し、ユーザーは適切なスクリプトを使用するように促されます。
また、src/make.bash
のブートストラップビルドセクションにecho cmd/dist
が追加されました。
echo '# Building C bootstrap tool.'
echo cmd/dist
mkdir -p ../bin/tool
export GOROOT="$(cd .. && pwd)"
GOROOT_FINAL="${GOROOT_FINAL:-$GOROOT}"
echo cmd/dist
:echo '# Building C bootstrap tool.'
の直後にcmd/dist
という文字列を出力することで、現在cmd/dist
ツールがビルドされていることをユーザーに明示します。これにより、ビルドの進行状況がより分かりやすくなります。
src/make.bat
の変更
src/make.bat
には、@echo off
のコメントアウトが解除され、echo cmd/dist
が追加されました。
:: Copyright 2012 The Go Authors. All rights reserved.
:: Use of this source code is governed by a BSD-style
:: license that can be found in the LICENSE file.
@echo off
set GOBUILDFAIL=0
:: ... (中略) ...
echo # Building C bootstrap tool.
echo cmd/dist
if not exist ..\bin\tool mkdir ..\bin\tool
:: Windows has no glob expansion, so spell out cmd/dist/*.c.
gcc -O2 -Wall -Werror -o ../bin/tool/dist.exe -Icmd/dist %DEFGOROOT% cmd/dist/buf.c cmd/dist/build.c cmd/dist/buildgc.c cmd/dist/buildruntime.c cmd/dist/goc2c.c cmd/dist/main.c cmd/dist/windows.c
@echo off
: この行の先頭の::
(コメントアウト)が削除され、@echo off
が有効になりました。これにより、バッチスクリプトが実行される際に、各コマンドが実行されるたびにそのコマンド自体がコンソールに表示されるのを抑制します。これにより、出力がよりクリーンになり、重要なメッセージ(例えばecho cmd/dist
)が目立つようになります。echo cmd/dist
:make.bash
と同様に、echo # Building C bootstrap tool.
の直後にcmd/dist
という文字列を出力することで、ブートストラップビルド中にcmd/dist
がビルドされていることを示します。これにより、Unix系とWindows系の両方のビルドスクリプトで出力の一貫性が保たれます。
コアとなるコードの変更箇所
--- a/src/make.bash
+++ b/src/make.bash
@@ -9,6 +9,16 @@ if [ ! -f run.bash ]; then
exit 1
fi
+# Test for Windows.
+case "$(uname)" in
+*MINGW* | *WIN32* | *CYGWIN*)
+ echo 'ERROR: Do not use make.bash to build on Windows.'
+ echo 'Use make.bat instead.'
+ echo
+ exit 1
+ ;;
+esac
+
# Test for bad ld.
if ld --version 2>&1 | grep 'gold.* 2\.20' >/dev/null; then
echo 'ERROR: Your system has gold 2.20 installed.'
@@ -46,6 +56,7 @@ done
# Finally! Run the build.
echo '# Building C bootstrap tool.'
+echo cmd/dist
mkdir -p ../bin/tool
export GOROOT="$(cd .. && pwd)"
GOROOT_FINAL="${GOROOT_FINAL:-$GOROOT}"
diff --git a/src/make.bat b/src/make.bat
index 3a456513fa..010e418c01 100644
--- a/src/make.bat
+++ b/src/make.bat
@@ -1,7 +1,7 @@
:: Copyright 2012 The Go Authors. All rights reserved.
:: Use of this source code is governed by a BSD-style
:: license that can be found in the LICENSE file.
-::@echo off
+@echo off
set GOBUILDFAIL=0
@@ -22,6 +22,7 @@ if "x%GOROOT_FINAL%"=="x" set GOROOT_FINAL=%GOROOT%\n
set DEFGOROOT=-DGOROOT_FINAL=\"\\\"%GOROOT_FINAL:\\=\\\\%\\\"\"\n
echo # Building C bootstrap tool.\n
+echo cmd/dist\n
if not exist ..\bin\tool mkdir ..\bin\tool\n
:: Windows has no glob expansion, so spell out cmd/dist/*.c.\n
gcc -O2 -Wall -Werror -o ../bin/tool/dist.exe -Icmd/dist %DEFGOROOT% cmd/dist/buf.c cmd/dist/build.c cmd/dist/buildgc.c cmd/dist/buildruntime.c cmd/dist/goc2c.c cmd/dist/main.c cmd/dist/windows.c
コアとなるコードの解説
src/make.bash
の変更点
-
Windows環境の検出とエラー処理:
case "$(uname)" in *MINGW* | *WIN32* | *CYGWIN*) ... esac
ブロックが追加されました。これは、uname
コマンドの出力(現在のオペレーティングシステム名)をチェックし、それがMINGW
、WIN32
、またはCYGWIN
のいずれかを含む場合に、Windows環境でmake.bash
が実行されていると判断します。- これらの環境が検出された場合、スクリプトはエラーメッセージ(
ERROR: Do not use make.bash to build on Windows. Use make.bat instead.
)を標準出力に表示し、exit 1
で終了します。これにより、Windowsユーザーが誤ってUnix系ビルドスクリプトを使用することを防ぎ、適切なmake.bat
の使用を促します。
-
cmd/dist
ビルドフェーズの出力強化:echo '# Building C bootstrap tool.'
の直後にecho cmd/dist
が追加されました。これにより、ブートストラップツール(cmd/dist
)のビルドが開始される際に、そのフェーズ名が明示的に出力されます。これは、ビルドプロセスの各ステップの可視性を高め、ユーザーがビルドの進行状況をより詳細に把握できるようにするための変更です。
src/make.bat
の変更点
-
コマンドエコーの無効化:
::@echo off
の行からコメントアウトを示す::
が削除され、@echo off
が有効になりました。これにより、バッチスクリプトが実行される際に、各コマンドが実行されるたびにそのコマンド自体がコンソールに表示されるのを抑制します。これにより、出力がよりクリーンになり、ユーザーにとって重要な情報(例えば、ビルドフェーズのメッセージ)が目立つようになります。
-
cmd/dist
ビルドフェーズの出力強化:echo # Building C bootstrap tool.
の直後にecho cmd/dist
が追加されました。これはmake.bash
の変更と同様に、ブートストラップツール(cmd/dist
)のビルドが開始される際に、そのフェーズ名が明示的に出力されるようにするためのものです。これにより、Windows環境でのビルド出力もUnix系環境と一貫性を持つようになります。
これらの変更は、Goのビルドプロセスの堅牢性とユーザーフレンドリーさを向上させることを目的としています。特に、Windows環境でのビルドの誤用を防ぎ、ビルドの進行状況をより明確にすることで、開発者のエクスペリエンスを改善しています。
関連リンク
- GitHubコミットページ: https://github.com/golang/go/commit/b5d81e5ed57287a97b0f81b1928f8356e8660afc
- Go CL (Code Review): https://golang.org/cl/5655065
参考にした情報源リンク
- Go Issue 2908 (Web検索結果):
golang/vscode-go
Issue #2908: "The test adapter should ignore underscored packages" (直接関連なし)aws/aws-sdk-go
Issue #2908: "Connection reset errors are not retryable" (直接関連なし)- その他、Goのソースコード内の行番号や内部参照としての「2908」の言及、および一般的なGoのインストールやランタイムに関する問題としての「2908」の言及が見られましたが、このコミットが修正した具体的なGoプロジェクトのIssue #2908の内容を特定できる情報は見つかりませんでした。ただし、コミットメッセージに「Fixes #2908」と明記されているため、このコミットが何らかの形でその問題に対処したことは確かです。