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

[インデックス 11894] ファイルの概要

このコミットは、Go言語のダッシュボードビルダにおけるWindows環境設定の修正に関するものです。具体的には、GOROOT_FINAL環境変数のパス表記をCygwin形式からWindowsネイティブ形式へと変更しています。

コミット

commit db93edfc286e05b6f1a1a8e0973a1dfa1ba8046d
Author: Russ Cox <rsc@golang.org>
Date:   Tue Feb 14 01:23:25 2012 -0500

    builder: fix windows environment
    
    Not causing problems yet, but no need to
    keep using cygwin paths now that we're off cygwin.
    
    R=alex.brainman
    CC=golang-dev
    https://golang.org/cl/5656053

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/db93edfc286e05b6f1a1a8e0973a1dfa1ba8046d

元コミット内容

builder: fix windows environment

Not causing problems yet, but no need to
keep using cygwin paths now that we're off cygwin.

R=alex.brainman
CC=golang-dev
https://golang.org/cl/5656053

変更の背景

このコミットが行われた2012年頃のGo言語のWindowsビルド環境は、過渡期にありました。初期のGo言語のWindowsサポートは、CygwinのようなPOSIX互換レイヤーに依存している部分がありました。Cygwinは、Windows上でLinuxのような環境を提供し、/c/go のようなPOSIXスタイルのパス表記をWindowsの C:\go のようなパスに変換します。

しかし、Go言語の開発が進むにつれて、Windowsネイティブなツールチェインやビルド環境への移行が進められていました。このコミットのメッセージにある「now that we're off cygwin」(Cygwinから離れたので)という記述は、GoのビルドシステムがCygwinへの依存を減らし、よりWindowsネイティブな環境で動作するようになったことを示唆しています。

この変更は、既存のCygwinパス表記が「まだ問題を引き起こしていない」ものの、将来的な互換性や環境のクリーンさを保つために、不要になったCygwinパス表記を排除し、Windowsネイティブなパス表記に統一することを目的としています。これにより、ビルド環境の複雑さを軽減し、潜在的な問題を未然に防ぐことが意図されています。

前提知識の解説

Cygwinとパス表記

Cygwinは、Windows上でUNIXライクな環境を提供するソフトウェアです。これにより、UNIX/LinuxのコマンドラインツールやアプリケーションをWindows上で実行できます。Cygwin環境では、Windowsのドライブレター(例: C:)は /cygdrive/c/c のようにPOSIXスタイルのパスにマッピングされます。

  • Cygwinパス: /c/go のように、スラッシュ (/) を区切り文字とし、ドライブレターをルートディレクトリ直下のディレクトリとして表現します。
  • Windowsネイティブパス: c:\go のように、バックスラッシュ (\) を区切り文字とし、ドライブレターとコロン (:) で始まるパスです。

Go言語のビルドシステムやツールがCygwinに依存している場合、Cygwinパスを使用することが一般的でしたが、ネイティブなWindows環境に移行する際には、Windowsネイティブパスを使用することが望ましいとされます。

Go言語のビルドシステムと環境変数

Go言語のビルドシステムは、環境変数に大きく依存しています。特に重要なのが以下の環境変数です。

  • GOOS: ターゲットとするオペレーティングシステム(例: windows, linux, darwin)。
  • GOARCH: ターゲットとするアーキテクチャ(例: amd64, 386, arm)。
  • GOROOT: Goのインストールディレクトリのルートパス。
  • GOROOT_FINAL: Goの最終的なインストールパスを指定するために使用される環境変数。これは、クロスコンパイルや特定のビルドシナリオで、ビルドされたGoのバイナリが最終的に配置される場所を示すために使われることがあります。この変数は、ビルドプロセスが完了した後に、Goのツールチェインがどこにあると想定すべきかを指示します。

これらの環境変数は、Goのコンパイラやリンカが適切なライブラリやツールを見つけるために不可欠です。

Goダッシュボードとビルダー

Goプロジェクトには、継続的インテグレーション(CI)システムの一部として、様々なプラットフォームでのビルドとテストの状況を監視するための「ダッシュボード」が存在します。このダッシュボードは、世界中の様々な環境でGoのコードをビルド・テストする「ビルダー」と呼ばれるマシン群からの結果を集約します。

misc/dashboard/builder/main.go は、このビルダーの一部であり、特定の環境(この場合はWindows)でGoのビルドを実行するための環境設定を管理するロジックを含んでいます。

技術的詳細

このコミットの技術的詳細は、Windows環境におけるパス表記の正規化と、Go言語のビルドシステムにおける環境変数の扱いに集約されます。

変更前は、GOROOT_FINAL 環境変数が /c/go というCygwinスタイルのパスで設定されていました。これは、Cygwin環境下でGoをビルド・実行する際に機能しますが、GoのビルドシステムがCygwinへの依存を減らし、WindowsネイティブなAPIやパス解決メカニズムを使用するようになった場合、このCygwinパスは不適切になる可能性があります。

Windowsネイティブな環境では、パスは C:\go のようにドライブレターとバックスラッシュで構成されます。GoのランタイムやツールがWindowsネイティブなパス解決を期待する場合、Cygwinパスが渡されると、パスが見つからない、あるいは正しく解釈されないといった問題が発生する可能性があります。

このコミットでは、GOROOT_FINAL の値を /c/go から c:\go に変更しています。Goの文字列リテラルでは、バックスラッシュはエスケープシーケンスの開始文字として扱われるため、リテラルとしてバックスラッシュを含めるには \\ と記述するか、バッククォート ( ) で囲まれたRaw文字列リテラルを使用します。このコミットでは、Raw文字列リテラル c:\go を使用しており、これによりバックスラッシュがそのままパスの一部として解釈されます。

この変更は、GoのビルドシステムがWindowsネイティブなパス解決を正しく行えるようにするためのものであり、Cygwin環境への依存を完全に断ち切る一環として行われました。これにより、Windows上でのGoのビルドと実行がより堅牢になり、将来的な互換性の問題を防ぐことができます。

また、コメントアウトされた // TODO(brainman): remove once we find make that does not hang.\"MAKEFLAGS\": \"-j1\", の行は、当時のWindowsビルド環境における make コマンドの安定性の問題を示唆しています。-j1make をシングルスレッドで実行するオプションであり、並列ビルドによるハングアップを回避するための暫定的な対策であったことが伺えます。このコミットではこの行が削除されており、make の問題が解決されたか、あるいは別のビルドメカニズムに移行したことを示唆しています。

コアとなるコードの変更箇所

misc/dashboard/builder/main.go ファイルの以下の行が変更されました。

--- a/misc/dashboard/builder/main.go
+++ b/misc/dashboard/builder/main.go
@@ -493,9 +493,7 @@ func (b *Builder) envvWindows() []string {
 	start := map[string]string{
 		"GOOS":         b.goos,
 		"GOARCH":       b.goarch,
-		"GOROOT_FINAL": "/c/go",
-		// TODO(brainman): remove once we find make that does not hang.
-		"MAKEFLAGS":   "-j1",
+		"GOROOT_FINAL": `c:\go`,
 		"GOBUILDEXIT": "1", // exit all.bat with completion status.
 	}
 	for _, name := range extraEnv {

コアとなるコードの解説

変更されたコードは、Builder 構造体の envvWindows() メソッド内にあります。このメソッドは、Windows環境でGoのビルドを実行する際に使用される環境変数のマップを初期化する役割を担っています。

具体的には、start という map[string]string 型の変数に、GOOSGOARCHGOROOT_FINALGOBUILDEXIT などの環境変数が設定されています。

  • 変更前:

    "GOROOT_FINAL": "/c/go",
    // TODO(brainman): remove once we find make that does not hang.
    "MAKEFLAGS":   "-j1",
    

    ここでは、GOROOT_FINAL がCygwinスタイルのパス /c/go に設定されていました。また、MAKEFLAGS-j1 に設定され、make のハングアップ問題に対する一時的な回避策が講じられていました。

  • 変更後:

    "GOROOT_FINAL": `c:\go`,
    

    GOROOT_FINAL の値が、Windowsネイティブなパス表記である c:\go に変更されました。バッククォート ( ) で囲むことで、GoのRaw文字列リテラルとして扱われ、バックスラッシュがエスケープされることなくそのままパスの一部として解釈されます。 また、MAKEFLAGS の行と関連するコメントが削除されています。これは、make の問題が解決されたか、あるいはビルドプロセスが make に依存しなくなったことを示唆しています。

この変更により、Windows環境でGoのビルドが実行される際に、GOROOT_FINAL 環境変数がWindowsネイティブなパスで正しく設定されるようになり、Cygwinへの依存がさらに軽減されました。これは、Go言語がWindowsプラットフォームでのネイティブサポートを強化していく過程における重要なステップの一つです。

関連リンク

参考にした情報源リンク

  • Go言語のコミット履歴 (GitHub): https://github.com/golang/go/commits/master
  • Go言語のコードレビューシステム (Gerrit): https://go.googlesource.com/go/+/refs/heads/master (コミットメッセージに記載されている https://golang.org/cl/5656053 は、当時のGerritのURL形式です。現在は https://go.googlesource.com/go/+/5656053 のようにアクセスできます。)
  • Cygwinのパス変換に関する情報: (一般的なCygwinのドキュメントやフォーラムで確認可能)
  • Go言語のビルドシステムに関する一般的な知識。
  • Windowsのパス表記に関する一般的な知識。
  • Go言語の文字列リテラルに関する知識。
  • make コマンドのオプションに関する知識。