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

[インデックス 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言語のビルドプロセスにおける特定の課題に対処するために行われました。

  1. 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)の使用を促すことで、ユーザーエクスペリエンスを向上させ、ビルドの安定性を確保することを目的としています。

  2. ブートストラップビルドの出力の一貫性: Goのビルドプロセスは、Goコンパイラ自体をビルドするために、まず既存のCコンパイラを使用してGoのサブセット(ブートストラップツール)をビルドするという「ブートストラップ」フェーズを含みます。このフェーズでは、cmd/distというツールがビルドされます。コミットメッセージにある「Makes that phase look like all the others.」という記述は、このcmd/distのビルドフェーズが、他のビルドフェーズと同様に、現在ビルドされているモジュール名(この場合はcmd/dist)を標準出力に表示するように変更されたことを示しています。これにより、ビルドの進行状況がより明確になり、ユーザーがどのステップで何が起こっているかを把握しやすくなります。

  3. Issue #2908の修正: コミットメッセージには「Fixes #2908」と記載されています。これは、このコミットがGoプロジェクトのIssueトラッカーで報告された2908番の問題を解決したことを意味します。Web検索では、Go言語に関連する複数の「Issue 2908」が存在し、このコミットが修正した具体的な問題の内容を特定することはできませんでした。しかし、コミット内容から判断すると、このIssueはWindows環境でのビルドスクリプトの誤用、またはブートストラップビルドの出力に関する問題であった可能性が高いです。

前提知識の解説

このコミットを理解するためには、以下の概念について知っておく必要があります。

  • Go言語のビルドシステム: Go言語は、自身のコンパイラや標準ライブラリをソースコードからビルドするための独自のブートストラッププロセスを持っています。これは、GoのソースコードがGo自身で書かれているため、最初にGoのサブセットをC言語などでビルドし、それを使って完全なGoコンパイラをビルドするという多段階のプロセスです。
  • make.bashmake.bat:
    • make.bash: Unix系システム(Linux, macOSなど)でGoをビルドするためのシェルスクリプトです。bashシェルで実行されることを前提としており、unameなどのUnix系コマンドを使用します。
    • make.bat: WindowsシステムでGoをビルドするためのバッチスクリプトです。Windowsのコマンドプロンプト(cmd.exe)で実行されることを前提としており、Windows固有のコマンドを使用します。
  • unameコマンド: Unix系システムで動作しているオペレーティングシステムの情報を表示するコマンドです。例えば、unameLinuxDarwin(macOS)、MINGW(MinGW環境)、CYGWIN(Cygwin環境)などを返します。このコミットでは、unameの出力を使ってWindows環境(MinGW, Cygwin, WIN32など)を検出しています。
  • cmd/dist: Goのブートストラップビルドプロセスで最初にビルドされる重要なツールの一つです。これは、Goのツールチェインの他の部分をビルドするために使用される、Goの初期コンパイラとリンカの役割を果たすC言語で書かれたプログラムです。
  • ブートストラップビルド: 自身をコンパイルできるコンパイラを構築するプロセスです。Goの場合、Goコンパイラ自体がGoで書かれているため、まずC言語で書かれた最小限のGoコンパイラ(ブートストラップコンパイラ)をビルドし、そのブートストラップコンパイラを使って完全なGoコンパイラをビルドします。

技術的詳細

このコミットは、src/make.bashsrc/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の出力がMINGWWIN32、または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の変更点

  1. Windows環境の検出とエラー処理:

    • case "$(uname)" in *MINGW* | *WIN32* | *CYGWIN*) ... esacブロックが追加されました。これは、unameコマンドの出力(現在のオペレーティングシステム名)をチェックし、それがMINGWWIN32、またはCYGWINのいずれかを含む場合に、Windows環境でmake.bashが実行されていると判断します。
    • これらの環境が検出された場合、スクリプトはエラーメッセージ(ERROR: Do not use make.bash to build on Windows. Use make.bat instead.)を標準出力に表示し、exit 1で終了します。これにより、Windowsユーザーが誤ってUnix系ビルドスクリプトを使用することを防ぎ、適切なmake.batの使用を促します。
  2. cmd/distビルドフェーズの出力強化:

    • echo '# Building C bootstrap tool.'の直後にecho cmd/distが追加されました。これにより、ブートストラップツール(cmd/dist)のビルドが開始される際に、そのフェーズ名が明示的に出力されます。これは、ビルドプロセスの各ステップの可視性を高め、ユーザーがビルドの進行状況をより詳細に把握できるようにするための変更です。

src/make.batの変更点

  1. コマンドエコーの無効化:

    • ::@echo offの行からコメントアウトを示す::が削除され、@echo offが有効になりました。これにより、バッチスクリプトが実行される際に、各コマンドが実行されるたびにそのコマンド自体がコンソールに表示されるのを抑制します。これにより、出力がよりクリーンになり、ユーザーにとって重要な情報(例えば、ビルドフェーズのメッセージ)が目立つようになります。
  2. cmd/distビルドフェーズの出力強化:

    • echo # Building C bootstrap tool.の直後にecho cmd/distが追加されました。これはmake.bashの変更と同様に、ブートストラップツール(cmd/dist)のビルドが開始される際に、そのフェーズ名が明示的に出力されるようにするためのものです。これにより、Windows環境でのビルド出力もUnix系環境と一貫性を持つようになります。

これらの変更は、Goのビルドプロセスの堅牢性とユーザーフレンドリーさを向上させることを目的としています。特に、Windows環境でのビルドの誤用を防ぎ、ビルドの進行状況をより明確にすることで、開発者のエクスペリエンスを改善しています。

関連リンク

参考にした情報源リンク

  • 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」と明記されているため、このコミットが何らかの形でその問題に対処したことは確かです。