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

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

このコミットは、Go言語のビルドシステム、特にWindows環境におけるビルドプロセスとテスト実行の改善に焦点を当てています。主な目的は、ビルドの柔軟性を高め、より多くのコンポーネントをビルド対象に含め、API互換性チェックを導入することです。

コミット

commit 7fbef930a6f84b4ba57fa90a39131263967248f5
Author: Alex Brainman <alex.brainman@gmail.com>
Date:   Tue Mar 20 14:04:20 2012 +1100

    build: do more during windows build
    
    - use GO_GCFLAGS and GO_LDFLAGS if supplied
    - build misc\dashboard\builder and misc\goplay
    - run tests in test\bench\go1
    - check api compatibility
    
    R=golang-dev, r, kardianos, bradfitz
    CC=golang-dev
    https://golang.org/cl/5847063

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

https://github.com/golang/go/commit/7fbef930a6f84b4ba57fa90a39131263967248f5

元コミット内容

build: do more during windows build

- use GO_GCFLAGS and GO_LDFLAGS if supplied
- build misc\dashboard\builder and misc\goplay
- run tests in test\bench\go1
- check api compatibility

変更の背景

このコミットが行われた2012年3月時点のGo言語は、まだ比較的新しい言語であり、ビルドシステムやクロスプラットフォーム対応が進化の途上にありました。特にWindows環境でのビルドプロセスは、Linux/Unix系環境と比較して機能が限定的であった可能性があります。

このコミットの背景には、以下の必要性があったと考えられます。

  1. ビルドの柔軟性向上: コンパイラやリンカに渡すフラグ(GO_GCFLAGS, GO_LDFLAGS)を外部から指定できるようにすることで、開発者やCI/CDシステムがビルドオプションをより細かく制御できるようになります。これにより、デバッグビルド、最適化ビルド、特定の環境に合わせたビルドなど、多様なビルド要件に対応できるようになります。
  2. Windows環境での機能 parity: misc\dashboard\buildermisc\goplay といったGoプロジェクトの補助ツールや、test\bench\go1 のベンチマークテストがWindowsビルドプロセスに含まれていなかった可能性があります。これらのコンポーネントをWindowsビルドに含めることで、Windows環境でも他のプラットフォームと同等の開発・テスト環境を提供し、Go言語のWindowsサポートを強化する狙いがあります。
  3. API互換性の維持: Go言語は急速に進化していましたが、既存のコードベースとの互換性を維持することは非常に重要です。go tool api コマンドを用いたAPI互換性チェックをビルドプロセスに組み込むことで、意図しないAPIの変更や破壊的変更を早期に検出し、Goエコシステムの安定性を保つことができます。
  4. Windows固有の課題への対応: src/pkg/log/syslog/syslog_windows.go の追加は、Windows環境におけるシステムログ(syslog)の取り扱いに関する課題を示唆しています。この時点ではまだ実装されていないものの、将来的なWindowsでのログ機能サポートに向けた準備と考えられます。

これらの変更は、Go言語の成熟度を高め、特にWindows開発者にとっての利便性と信頼性を向上させるための重要なステップでした。

前提知識の解説

このコミットを理解するためには、以下のGo言語およびビルドシステムに関する基本的な知識が必要です。

  1. Go言語のビルドプロセス:
    • Go言語のソースコードは、go build コマンドによってコンパイルされ、実行可能ファイルやライブラリが生成されます。
    • Goのビルドシステムは、依存関係の解決、コンパイル、リンクといった一連の処理を自動的に行います。
    • make.bash (Unix/Linux) と make.bat (Windows) は、GoのソースコードからGoツールチェイン自体をビルドするためのスクリプトです。これらはGoのブートストラッププロセス(GoでGoをビルドする)の重要な部分を担います。
  2. GO_GCFLAGSGO_LDFLAGS:
    • GO_GCFLAGS: Goコンパイラ(5g/6g/8g など、当時のGoのコンパイラ名)に渡す追加のフラグを指定するための環境変数です。例えば、最適化レベルの調整やデバッグ情報の埋め込みなどに使用されます。
    • GO_LDFLAGS: Goリンカ(5l/6l/8l など)に渡す追加のフラグを指定するための環境変数です。例えば、静的リンクの強制、シンボルテーブルの削除、バージョン情報の埋め込みなどに使用されます。
    • これらのフラグは、ビルドの挙動を細かく制御するために上級ユーザーやビルドシステムによって利用されます。
  3. CGO_ENABLED:
    • Go言語がC言語のコードを呼び出すための機能(cgo)を有効にするかどうかを制御する環境変数です。
    • CGO_ENABLED=1 の場合、cgoが有効になり、Cコードを含むGoパッケージがビルドされます。
    • CGO_ENABLED=0 の場合、cgoが無効になり、Cコードはビルドから除外されます。これは、クロスコンパイル時や、Cコンパイラが利用できない環境でのビルドに役立ちます。
  4. go tool api:
    • Goツールチェインの一部である api コマンドは、Goの標準ライブラリの公開APIをチェックするために使用されます。
    • このコマンドは、指定されたAPI定義ファイル(例: go1.txt)と現在のGoソースコードのAPIを比較し、互換性のない変更がないかを確認します。
    • Go 1の互換性保証(Go 1 Compatibility Promise)を維持するために重要なツールです。
  5. misc ディレクトリ:
    • Goプロジェクトの misc ディレクトリには、Go言語に関連する様々な補助ツールや実験的なコードが含まれています。
    • dashboard/builder: Goプロジェクトのダッシュボード(CIシステム)に関連するビルドツール。
    • goplay: Go Playgroundのローカル版または関連ツール。
  6. test/bench/go1:
    • Goのベンチマークテストが含まれるディレクトリです。Go 1リリースに向けたパフォーマンス測定や回帰テストに使用されました。
  7. runtime_defs.go:
    • Goのランタイムに関する定義が含まれるファイルで、通常はビルドプロセス中に自動生成されます。このファイルが古いまま残っているとビルドエラーの原因となることがあります。

技術的詳細

このコミットは、主にWindows環境でのGoのビルドスクリプト (src/make.batsrc/run.bat) に変更を加えています。

  1. GO_GCFLAGSGO_LDFLAGS のサポート:
    • src/make.bat において、go_bootstrap install コマンドに gcflagsldflags オプションが追加されました。これにより、これらの環境変数が設定されている場合、コンパイラとリンカにその値が渡されるようになります。
    • 変更前: "%GOTOOLDIR%\\go_bootstrap" install -v std
    • 変更後: "%GOTOOLDIR%\\go_bootstrap" install -gcflags "%GO_GCFLAGS%" -ldflags "%GO_LDFLAGS%" -v std
    • これは、Goのビルドプロセスがより柔軟になり、外部からコンパイル・リンクオプションを注入できるようになったことを意味します。
  2. CGO_ENABLED の説明更新:
    • src/make.bashsrc/make.bat の両方で、CGO_ENABLED 環境変数の説明がより詳細になりました。特に、CGO_ENABLED=0 がcgo関連ファイルを無視すること、CGO_ENABLED=1 がcgo関連ファイルをビルドに含めることを明確にしています。これは、cgoの挙動に関する誤解を減らすためのドキュメンテーションの改善です。
  3. runtime_defs.go のクリーンアップ処理の移動:
    • src/make.bat で、del /F ".\\pkg\\runtime\\runtime_defs.go" の行が、GOROOT_FINAL の設定より前に移動されました。これは、ビルドの初期段階で古い生成済みファイルを確実に削除し、潜在的なビルド問題を回避するための順序の調整です。
  4. 追加コンポーネントのビルドとテスト実行:
    • src/run.bat に、以下のステップが追加されました。
      • go build ..\misc\dashboard\builder ..\misc\goplay: misc ディレクトリ内の補助ツール (buildergoplay) をビルドします。これにより、これらのツールがWindows環境でも利用可能になります。
      • go test ..\test\bench\go1: test\bench\go1 ディレクトリ内のベンチマークテストを実行します。これは、Go 1のパフォーマンスベンチマークがWindowsビルドの検証プロセスに含まれるようになったことを示します。
  5. API互換性チェックの導入:
    • src/run.batgo tool api -c ..\api\go1.txt コマンドが追加されました。
    • このコマンドは、現在のGoソースコードの公開APIが、api\go1.txt で定義されたGo 1の公式APIと互換性があるかをチェックします。
    • これにより、Go 1の互換性保証がビルドプロセスの一部として自動的に検証されるようになり、APIの破壊的変更がリリース前に検出される可能性が高まります。
  6. Windows Syslogパッケージの追加:
    • src/pkg/log/syslog/syslog_windows.go という新しいファイルが追加されました。
    • このファイルは、Windowsにおけるsyslogパッケージのプレースホルダーであり、// BUG(brainman): This package is not implemented on Windows yet. というコメントが含まれています。これは、将来的にWindowsでもsyslog機能を提供する意図があることを示していますが、このコミット時点ではまだ実装されていないことを明示しています。

これらの変更は、Goのビルドシステムがより堅牢で、機能が豊富になり、特にWindows環境での開発とテストのワークフローが改善されたことを示しています。

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

このコミットにおける主要なコード変更は以下のファイルに集中しています。

  • src/make.bash: CGO_ENABLED のコメント更新
  • src/make.bat:
    • 環境変数の説明追加
    • runtime_defs.go の削除処理の移動
    • GO_GCFLAGSGO_LDFLAGSgo_bootstrap install コマンドに渡す変更
  • src/pkg/log/syslog/syslog_windows.go: 新規追加(プレースホルダー)
  • src/run.bat:
    • misc ツール (dashboard/builder, goplay) のビルド追加
    • test/bench/go1 のテスト実行追加
    • go tool api によるAPI互換性チェックの追加

コアとなるコードの解説

src/make.bat の変更

--- a/src/make.bat
+++ b/src/make.bat
@@ -1,6 +1,31 @@
 :: 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.
+\n+:: Environment variables that control make.bat:\n+::\n+:: GOROOT_FINAL: The expected final Go root, baked into binaries.\n+:: The default is the location of the Go tree during the build.\n+::\n+:: GOHOSTARCH: The architecture for host tools (compilers and\n+:: binaries).  Binaries of this type must be executable on the current\n+:: system, so the only common reason to set this is to set\n+:: GOHOSTARCH=386 on an amd64 machine.\n+::\n+:: GOARCH: The target architecture for installed packages and tools.\n+::\n+:: GOOS: The target operating system for installed packages and tools.\n+::\n+:: GO_GCFLAGS: Additional 5g/6g/8g arguments to use when\n+:: building the packages and commands.\n+::\n+:: GO_LDFLAGS: Additional 5l/6l/8l arguments to use when\n+:: building the commands.\n+::\n+:: CGO_ENABLED: Controls cgo usage during the build. Set it to 1\n+:: to include all cgo related files, .c and .go file with "cgo"\n+:: build directive, in the build. Set it to 0 to ignore them.\n+\n @echo off
 \n :: Keep environment variables within this script
@@ -17,9 +42,6 @@ echo Must run make.bat from Go src directory.\n goto fail \n :ok\n \n+:: Clean old generated file that will cause problems in the build.\n+del /F ".\\pkg\\runtime\\runtime_defs.go" 2>NUL
+:: Grab default GOROOT_FINAL and set GOROOT for build.\n :: The expression %VAR:\\=\\\\% means to take %VAR%\n :: and apply the substitution \\ = \\\\, escaping the\n@@ -28,9 +56,6 @@ cd src\n if "x%GOROOT_FINAL%"=="x" set GOROOT_FINAL=%GOROOT%\n set DEFGOROOT=-DGOROOT_FINAL="\\\"%GOROOT_FINAL:\\=\\\\%\\\""\n \n-:: Clean old generated file that will cause problems in the build.\n-del /F ".\\pkg\\runtime\\runtime_defs.go" 2>NUL
-\n echo # Building C bootstrap tool.\n echo cmd/dist\n if not exist ..\\bin\\tool mkdir ..\\bin\\tool\n@@ -62,14 +87,14 @@ echo # Building tools for local system. %GOHOSTOS%/%GOHOSTARCH%\n setlocal\n set GOOS=%GOHOSTOS%\n set GOARCH=%GOHOSTARCH%\n-\"%GOTOOLDIR%\\go_bootstrap\" install -v std\n+\"%GOTOOLDIR%\\go_bootstrap\" install -gcflags "%GO_GCFLAGS%" -ldflags "%GO_LDFLAGS%" -v std\n endlocal\n if errorlevel 1 goto fail\n echo.\n \n :mainbuild\n echo # Building packages and commands.\n-\"%GOTOOLDIR%\\go_bootstrap\" install -a -v std\n+\"%GOTOOLDIR%\\go_bootstrap\" install -gcflags "%GO_GCFLAGS%" -ldflags "%GO_LDFLAGS%" -a -v std\n if errorlevel 1 goto fail\n del "%GOTOOLDIR%\\go_bootstrap.exe"\n echo.\n```
この差分は、`make.bat` の冒頭にGoビルドに関連する環境変数の説明を追加し、ビルドコマンド (`go_bootstrap install`) に `GO_GCFLAGS` と `GO_LDFLAGS` を渡すように変更しています。これにより、Windows環境でのビルドのカスタマイズ性が向上しました。また、`runtime_defs.go` の削除処理がより早い段階に移動され、ビルドの信頼性が高まっています。

### `src/run.bat` の変更

```diff
--- a/src/run.bat
+++ b/src/run.bat
@@ -36,6 +36,16 @@ go test sync -short -timeout=120s -cpu=10
 if errorlevel 1 goto fail
 echo.\n \n+echo # ..\\misc\\dashboard\\builder ..\\misc\\goplay\n+go build ..\\misc\\dashboard\\builder ..\\misc\\goplay\n+if errorlevel 1 goto fail\n+echo.\n+\n+echo # ..\\test\\bench\\go1\n+go test ..\\test\\bench\\go1\n+if errorlevel 1 goto fail\n+echo.\n+\n :: TODO: The other tests in run.bash.\n \n echo # test
@@ -47,6 +57,11 @@ cd ..\\src\n echo.\n if %FAIL%==1 goto fail\n \n+echo # Checking API compatibility.\n+go tool api -c ..\\api\\go1.txt\n+if errorlevel 1 goto fail\n+echo.\n+\n echo ALL TESTS PASSED\n goto end\n \n```
この差分は、`run.bat` に新しいビルドとテストのステップを追加しています。具体的には、`misc` ディレクトリ内のツール (`dashboard/builder` と `goplay`) のビルド、`test/bench/go1` のベンチマークテストの実行、そして `go tool api` を使用したAPI互換性チェックです。これにより、Windows環境でのGoのビルドとテストの網羅性が大幅に向上しました。

### `src/pkg/log/syslog/syslog_windows.go` の新規追加

```diff
--- /dev/null
+++ b/src/pkg/log/syslog/syslog_windows.go
@@ -0,0 +1,8 @@
+// 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.
+\n+// Package syslog provides a simple interface to the system log service.\n+package syslog\n+\n+// BUG(brainman): This package is not implemented on Windows yet.

このファイルは、Windows向けのsyslogパッケージの初期プレースホルダーとして追加されました。まだ実装はされていませんが、将来的なWindowsでのシステムログ機能サポートに向けた意図が示されています。

関連リンク

参考にした情報源リンク

  • Go言語の公式リポジトリ (GitHub): https://github.com/golang/go
  • GoのIssue Tracker (Go 1の互換性に関する議論など): https://go.dev/issue
  • Goのメーリングリスト (golang-dev): https://groups.google.com/g/golang-dev
  • Goの初期のビルドプロセスに関するブログ記事やドキュメント (当時の情報を見つけるのは難しい可能性がありますが、一般的なGoのビルドに関する情報は役立ちます)
  • Goの make.bash および make.bat スクリプトの歴史的な変更履歴 (Git履歴を辿ることで詳細な背景がわかる場合があります)
  • Goの misc ディレクトリの目的と内容に関する情報 (Goのソースコードや関連ドキュメント)
  • Goのベンチマークに関する情報 (Goのテストドキュメントやブログ記事)
  • Goの CGO_ENABLED 環境変数に関するドキュメント: https://go.dev/cmd/go/#hdr-Environment_variables
  • Goの GO_GCFLAGS および GO_LDFLAGS 環境変数に関するドキュメント: https://go.dev/cmd/go/#hdr-Environment_variables
  • Goの runtime_defs.go の生成プロセスに関する情報 (Goのソースコードやビルドシステムに関するドキュメント)
  • Windowsにおけるsyslogの概念 (一般的なOSの知識)
  • Go 1リリースノート (Go 1の主要な変更点や互換性保証について): https://go.dev/doc/go1
  • Goのコミットメッセージの慣習 (Goプロジェクトの貢献ガイドラインなど)
  • Goのコードレビュープロセス (R=, CC= の意味など)# [インデックス 12691] ファイルの概要

このコミットは、Go言語のビルドシステム、特にWindows環境におけるビルドプロセスとテスト実行の改善に焦点を当てています。主な目的は、ビルドの柔軟性を高め、より多くのコンポーネントをビルド対象に含め、API互換性チェックを導入することです。

コミット

commit 7fbef930a6f84b4ba57fa90a39131263967248f5
Author: Alex Brainman <alex.brainman@gmail.com>
Date:   Tue Mar 20 14:04:20 2012 +1100

    build: do more during windows build
    
    - use GO_GCFLAGS and GO_LDFLAGS if supplied
    - build misc\dashboard\builder and misc\goplay
    - run tests in test\bench\go1
    - check api compatibility
    
    R=golang-dev, r, kardianos, bradfitz
    CC=golang-dev
    https://golang.org/cl/5847063

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

https://github.com/golang/go/commit/7fbef930a6f84b4ba57fa90a39131263967248f5

元コミット内容

build: do more during windows build

- use GO_GCFLAGS and GO_LDFLAGS if supplied
- build misc\dashboard\builder and misc\goplay
- run tests in test\bench\go1
- check api compatibility

変更の背景

このコミットが行われた2012年3月時点のGo言語は、まだ比較的新しい言語であり、ビルドシステムやクロスプラットフォーム対応が進化の途上にありました。特にWindows環境でのビルドプロセスは、Linux/Unix系環境と比較して機能が限定的であった可能性があります。

このコミットの背景には、以下の必要性があったと考えられます。

  1. ビルドの柔軟性向上: コンパイラやリンカに渡すフラグ(GO_GCFLAGS, GO_LDFLAGS)を外部から指定できるようにすることで、開発者やCI/CDシステムがビルドオプションをより細かく制御できるようになります。これにより、デバッグビルド、最適化ビルド、特定の環境に合わせたビルドなど、多様なビルド要件に対応できるようになります。
  2. Windows環境での機能 parity: misc\dashboard\buildermisc\goplay といったGoプロジェクトの補助ツールや、test\bench\go1 のベンチマークテストがWindowsビルドプロセスに含まれていなかった可能性があります。これらのコンポーネントをWindowsビルドに含めることで、Windows環境でも他のプラットフォームと同等の開発・テスト環境を提供し、Go言語のWindowsサポートを強化する狙いがあります。
  3. API互換性の維持: Go言語は急速に進化していましたが、既存のコードベースとの互換性を維持することは非常に重要です。go tool api コマンドを用いたAPI互換性チェックをビルドプロセスに組み込むことで、意図しないAPIの変更や破壊的変更を早期に検出し、Goエコシステムの安定性を保つことができます。
  4. Windows固有の課題への対応: src/pkg/log/syslog/syslog_windows.go の追加は、Windows環境におけるシステムログ(syslog)の取り扱いに関する課題を示唆しています。この時点ではまだ実装されていないものの、将来的なWindowsでのログ機能サポートに向けた準備と考えられます。

これらの変更は、Go言語の成熟度を高め、特にWindows開発者にとっての利便性と信頼性を向上させるための重要なステップでした。

前提知識の解説

このコミットを理解するためには、以下のGo言語およびビルドシステムに関する基本的な知識が必要です。

  1. Go言語のビルドプロセス:
    • Go言語のソースコードは、go build コマンドによってコンパイルされ、実行可能ファイルやライブラリが生成されます。
    • Goのビルドシステムは、依存関係の解決、コンパイル、リンクといった一連の処理を自動的に行います。
    • make.bash (Unix/Linux) と make.bat (Windows) は、GoのソースコードからGoツールチェイン自体をビルドするためのスクリプトです。これらはGoのブートストラッププロセス(GoでGoをビルドする)の重要な部分を担います。
  2. GO_GCFLAGSGO_LDFLAGS:
    • GO_GCFLAGS: Goコンパイラ(5g/6g/8g など、当時のGoのコンパイラ名)に渡す追加のフラグを指定するための環境変数です。例えば、最適化レベルの調整やデバッグ情報の埋め込みなどに使用されます。
    • GO_LDFLAGS: Goリンカ(5l/6l/8l など)に渡す追加のフラグを指定するための環境変数です。例えば、静的リンクの強制、シンボルテーブルの削除、バージョン情報の埋め込みなどに使用されます。
    • これらのフラグは、ビルドの挙動を細かく制御するために上級ユーザーやビルドシステムによって利用されます。
  3. CGO_ENABLED:
    • Go言語がC言語のコードを呼び出すための機能(cgo)を有効にするかどうかを制御する環境変数です。
    • CGO_ENABLED=1 の場合、cgoが有効になり、Cコードを含むGoパッケージがビルドされます。
    • CGO_ENABLED=0 の場合、cgoが無効になり、Cコードはビルドから除外されます。これは、クロスコンパイル時や、Cコンパイラが利用できない環境でのビルドに役立ちます。
  4. go tool api:
    • Goツールチェインの一部である api コマンドは、Goの標準ライブラリの公開APIをチェックするために使用されます。
    • このコマンドは、指定されたAPI定義ファイル(例: go1.txt)と現在のGoソースコードのAPIを比較し、互換性のない変更がないかを確認します。
    • Go 1の互換性保証(Go 1 Compatibility Promise)を維持するために重要なツールです。
  5. misc ディレクトリ:
    • Goプロジェクトの misc ディレクトリには、Go言語に関連する様々な補助ツールや実験的なコードが含まれています。
    • dashboard/builder: Goプロジェクトのダッシュボード(CIシステム)に関連するビルドツール。
    • goplay: Go Playgroundのローカル版または関連ツール。
  6. test/bench/go1:
    • Goのベンチマークテストが含まれるディレクトリです。Go 1リリースに向けたパフォーマンス測定や回帰テストに使用されました。
  7. runtime_defs.go:
    • Goのランタイムに関する定義が含まれるファイルで、通常はビルドプロセス中に自動生成されます。このファイルが古いまま残っているとビルドエラーの原因となることがあります。

技術的詳細

このコミットは、主にWindows環境でのGoのビルドスクリプト (src/make.batsrc/run.bat) に変更を加えています。

  1. GO_GCFLAGSGO_LDFLAGS のサポート:
    • src/make.bat において、go_bootstrap install コマンドに gcflagsldflags オプションが追加されました。これにより、これらの環境変数が設定されている場合、コンパイラとリンカにその値が渡されるようになります。
    • 変更前: "%GOTOOLDIR%\\go_bootstrap" install -v std
    • 変更後: "%GOTOOLDIR%\\go_bootstrap" install -gcflags "%GO_GCFLAGS%" -ldflags "%GO_LDFLAGS%" -v std
    • これは、Goのビルドプロセスがより柔軟になり、外部からコンパイル・リンクオプションを注入できるようになったことを意味します。
  2. CGO_ENABLED の説明更新:
    • src/make.bashsrc/make.bat の両方で、CGO_ENABLED 環境変数の説明がより詳細になりました。特に、CGO_ENABLED=0 がcgo関連ファイルを無視すること、CGO_ENABLED=1 がcgo関連ファイルをビルドに含めることを明確にしています。これは、cgoの挙動に関する誤解を減らすためのドキュメンテーションの改善です。
  3. runtime_defs.go のクリーンアップ処理の移動:
    • src/make.bat で、del /F ".\\pkg\\runtime\\runtime_defs.go" の行が、GOROOT_FINAL の設定より前に移動されました。これは、ビルドの初期段階で古い生成済みファイルを確実に削除し、潜在的なビルド問題を回避するための順序の調整です。
  4. 追加コンポーネントのビルドとテスト実行:
    • src/run.bat に、以下のステップが追加されました。
      • go build ..\misc\dashboard\builder ..\misc\goplay: misc ディレクトリ内の補助ツール (buildergoplay) をビルドします。これにより、これらのツールがWindows環境でも利用可能になります。
      • go test ..\test\bench\go1: test\bench\go1 ディレクトリ内のベンチマークテストを実行します。これは、Go 1のパフォーマンスベンチマークがWindowsビルドの検証プロセスに含まれるようになったことを示します。
  5. API互換性チェックの導入:
    • src/run.batgo tool api -c ..\api\go1.txt コマンドが追加されました。
    • このコマンドは、現在のGoソースコードの公開APIが、api\go1.txt で定義されたGo 1の公式APIと互換性があるかをチェックします。
    • これにより、Go 1の互換性保証がビルドプロセスの一部として自動的に検証されるようになり、APIの破壊的変更がリリース前に検出される可能性が高まります。
  6. Windows Syslogパッケージの追加:
    • src/pkg/log/syslog/syslog_windows.go という新しいファイルが追加されました。
    • このファイルは、Windowsにおけるsyslogパッケージのプレースホルダーであり、// BUG(brainman): This package is not implemented on Windows yet. というコメントが含まれています。これは、将来的にWindowsでもsyslog機能を提供する意図があることを示していますが、このコミット時点ではまだ実装されていないことを明示しています。

これらの変更は、Goのビルドシステムがより堅牢で、機能が豊富になり、特にWindows環境での開発とテストのワークフローが改善されたことを示しています。

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

このコミットにおける主要なコード変更は以下のファイルに集中しています。

  • src/make.bash: CGO_ENABLED のコメント更新
  • src/make.bat:
    • 環境変数の説明追加
    • runtime_defs.go の削除処理の移動
    • GO_GCFLAGSGO_LDFLAGSgo_bootstrap install コマンドに渡す変更
  • src/pkg/log/syslog/syslog_windows.go: 新規追加(プレースホルダー)
  • src/run.bat:
    • misc ツール (dashboard/builder, goplay) のビルド追加
    • test/bench/go1 のテスト実行追加
    • go tool api によるAPI互換性チェックの追加

コアとなるコードの解説

src/make.bat の変更

--- a/src/make.bat
+++ b/src/make.bat
@@ -1,6 +1,31 @@
 :: 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.
+\n+:: Environment variables that control make.bat:\n+::\n+:: GOROOT_FINAL: The expected final Go root, baked into binaries.\n+:: The default is the location of the Go tree during the build.\n+::\n+:: GOHOSTARCH: The architecture for host tools (compilers and\n+:: binaries).  Binaries of this type must be executable on the current\n+:: system, so the only common reason to set this is to set\n+:: GOHOSTARCH=386 on an amd64 machine.\n+::\n+:: GOARCH: The target architecture for installed packages and tools.\n+::\n+:: GOOS: The target operating system for installed packages and tools.\n+::\n+:: GO_GCFLAGS: Additional 5g/6g/8g arguments to use when\n+:: building the packages and commands.\n+::\n+:: GO_LDFLAGS: Additional 5l/6l/8l arguments to use when\n+:: building the commands.\n+::\n+:: CGO_ENABLED: Controls cgo usage during the build. Set it to 1\n+:: to include all cgo related files, .c and .go file with "cgo"\n+:: build directive, in the build. Set it to 0 to ignore them.\n+\n @echo off
 \n :: Keep environment variables within this script
@@ -17,9 +42,6 @@ echo Must run make.bat from Go src directory.\n goto fail \n :ok\n \n+:: Clean old generated file that will cause problems in the build.\n+del /F ".\\pkg\\runtime\\runtime_defs.go" 2>NUL
+:: Grab default GOROOT_FINAL and set GOROOT for build.\n :: The expression %VAR:\\=\\\\% means to take %VAR%\n :: and apply the substitution \\ = \\\\, escaping the\n@@ -28,9 +56,6 @@ cd src\n if "x%GOROOT_FINAL%"=="x" set GOROOT_FINAL=%GOROOT%\n set DEFGOROOT=-DGOROOT_FINAL="\\\"%GOROOT_FINAL:\\=\\\\%\\\""\n \n-:: Clean old generated file that will cause problems in the build.\n-del /F ".\\pkg\\runtime\\runtime_defs.go" 2>NUL
-\n echo # Building C bootstrap tool.\n echo cmd/dist\n if not exist ..\\bin\\tool mkdir ..\\bin\\tool\n@@ -62,14 +87,14 @@ echo # Building tools for local system. %GOHOSTOS%/%GOHOSTARCH%\n setlocal\n set GOOS=%GOHOSTOS%\n set GOARCH=%GOHOSTARCH%\n-\"%GOTOOLDIR%\\go_bootstrap\" install -v std\n+\"%GOTOOLDIR%\\go_bootstrap\" install -gcflags "%GO_GCFLAGS%" -ldflags "%GO_LDFLAGS%" -v std\n endlocal\n if errorlevel 1 goto fail\n echo.\n \n :mainbuild\n echo # Building packages and commands.\n-\"%GOTOOLDIR%\\go_bootstrap\" install -a -v std\n+\"%GOTOOLDIR%\\go_bootstrap\" install -gcflags "%GO_GCFLAGS%" -ldflags "%GO_LDFLAGS%" -a -v std\n if errorlevel 1 goto fail\n del "%GOTOOLDIR%\\go_bootstrap.exe"\n echo.\n```
この差分は、`make.bat` の冒頭にGoビルドに関連する環境変数の説明を追加し、ビルドコマンド (`go_bootstrap install`) に `GO_GCFLAGS` と `GO_LDFLAGS` を渡すように変更しています。これにより、Windows環境でのビルドのカスタマイズ性が向上しました。また、`runtime_defs.go` の削除処理がより早い段階に移動され、ビルドの信頼性が高まっています。

### `src/run.bat` の変更

```diff
--- a/src/run.bat
+++ b/src/run.bat
@@ -36,6 +36,16 @@ go test sync -short -timeout=120s -cpu=10
 if errorlevel 1 goto fail
 echo.\n \n+echo # ..\\misc\\dashboard\\builder ..\\misc\\goplay\n+go build ..\\misc\\dashboard\\builder ..\\misc\\goplay\n+if errorlevel 1 goto fail\n+echo.\n+\n+echo # ..\\test\\bench\\go1\n+go test ..\\test\\bench\\go1\n+if errorlevel 1 goto fail\n+echo.\n+\n :: TODO: The other tests in run.bash.\n \n echo # test
@@ -47,6 +57,11 @@ cd ..\\src\n echo.\n if %FAIL%==1 goto fail\n \n+echo # Checking API compatibility.\n+go tool api -c ..\\api\\go1.txt\n+if errorlevel 1 goto fail\n+echo.\n+\n echo ALL TESTS PASSED\n goto end\n \n```
この差分は、`run.bat` に新しいビルドとテストのステップを追加しています。具体的には、`misc` ディレクトリ内のツール (`dashboard/builder` と `goplay`) のビルド、`test/bench/go1` のベンチマークテストの実行、そして `go tool api` を使用したAPI互換性チェックです。これにより、Windows環境でのGoのビルドとテストの網羅性が大幅に向上しました。

### `src/pkg/log/syslog/syslog_windows.go` の新規追加

```diff
--- /dev/null
+++ b/src/pkg/log/syslog/syslog_windows.go
@@ -0,0 +1,8 @@
+// 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.
+\n+// Package syslog provides a simple interface to the system log service.\n+package syslog\n+\n+// BUG(brainman): This package is not implemented on Windows yet.

このファイルは、Windows向けのsyslogパッケージの初期プレースホルダーとして追加されました。まだ実装はされていませんが、将来的なWindowsでのシステムログ機能サポートに向けた意図が示されています。

関連リンク

参考にした情報源リンク

  • Go言語の公式リポジトリ (GitHub): https://github.com/golang/go
  • GoのIssue Tracker (Go 1の互換性に関する議論など): https://go.dev/issue
  • Goのメーリングリスト (golang-dev): https://groups.google.com/g/golang-dev
  • Goの初期のビルドプロセスに関するブログ記事やドキュメント (当時の情報を見つけるのは難しい可能性がありますが、一般的なGoのビルドに関する情報は役立ちます)
  • Goの make.bash および make.bat スクリプトの歴史的な変更履歴 (Git履歴を辿ることで詳細な背景がわかる場合があります)
  • Goの misc ディレクトリの目的と内容に関する情報 (Goのソースコードや関連ドキュメント)
  • Goのベンチマークに関する情報 (Goのテストドキュメントやブログ記事)
  • Goの CGO_ENABLED 環境変数に関するドキュメント: https://go.dev/cmd/go/#hdr-Environment_variables
  • Goの GO_GCFLAGS および GO_LDFLAGS 環境変数に関するドキュメント: https://go.dev/cmd/go/#hdr-Environment_variables
  • Goの runtime_defs.go の生成プロセスに関する情報 (Goのソースコードやビルドシステムに関するドキュメント)
  • Windowsにおけるsyslogの概念 (一般的なOSの知識)
  • Go 1リリースノート (Go 1の主要な変更点や互換性保証について): https://go.dev/doc/go1
  • Goのコミットメッセージの慣習 (Goプロジェクトの貢献ガイドラインなど)
  • Goのコードレビュープロセス (R=, CC= の意味など)