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

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

このコミットは、Go言語のビルドツールである cmd/dist において、ホスト環境のライブラリやバイナリを参照する際に使用する環境変数を $GOOS_$GOARCH から $GOHOSTOS_$GOHOSTARCH へと変更するものです。これにより、特にクロスコンパイル環境におけるビルドの正確性と安定性が向上します。

コミット

commit d826b2ed98ba7d37bd09addc9df16320e58f9e4e
Author: Jan Ziak <0xe2.0x9a.0x9b@gmail.com>
Date:   Tue Apr 15 08:46:21 2014 +0200

    cmd/dist: use GOHOSTARCH/GOHOSTOS instead of GOOS/GOARCH for host libraries and binaries
    
    Fixes #6559
    
    LGTM=rsc
    R=rsc
    CC=golang-codereviews
    https://golang.org/cl/81330045

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

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

元コミット内容

cmd/dist: use GOHOSTARCH/GOHOSTOS instead of GOOS/GOARCH for host libraries and binaries

Fixes #6559

LGTM=rsc
R=rsc
CC=golang-codereviews
https://golang.org/cl/81330045

変更の背景

この変更の背景には、Go言語のクロスコンパイルにおけるビルドシステムの正確性の問題がありました。Go言語は、あるオペレーティングシステム(OS)とアーキテクチャ(例: Linux/amd64)上で、別のOSとアーキテクチャ(例: Windows/arm64)向けのバイナリを生成する「クロスコンパイル」を強力にサポートしています。

Goのビルドプロセスでは、ターゲットとなるOSとアーキテクチャを $GOOS$GOARCH という環境変数で指定します。一方で、ビルドを実行しているホスト(現在のマシン)のOSとアーキテクチャは $GOHOSTOS$GOHOSTARCH で表されます。

cmd/dist はGoのソースコードからGoツールチェイン自体をビルドするための重要なツールです。このツールが、コンパイル時にホスト環境で動作するべきライブラリ(例えば、コンパイラやリンカが内部的に使用する補助ライブラリ)を参照する際に、誤って $GOOS_$GOARCH を使用していました。

この誤った参照は、特にクロスコンパイルを行う際に問題を引き起こします。例えば、Linux/amd64上でWindows/arm64向けのGoバイナリをビルドしようとした場合、cmd/dist はホスト(Linux/amd64)で必要なライブラリを $GOOS_$GOARCH (つまり windows_arm64) のパスから探そうとしてしまいます。しかし、そのパスにはターゲット環境向けのライブラリしか存在しないため、ビルドが失敗するか、不正なライブラリがリンクされて予期せぬ動作を引き起こす可能性がありました。

このコミットは、この問題を修正し、ホスト環境で必要なライブラリやバイナリのパスを $GOHOSTOS_$GOHOSTARCH を用いて正しく解決するように変更することで、クロスコンパイル環境でのビルドの堅牢性を高めています。コミットメッセージにある Fixes #6559 は、この問題に関連する特定のバグ報告を指していますが、公開されているGoのイシュートラッカーでは直接的な詳細が見つかりませんでした。しかし、変更内容からその問題がクロスコンパイル時のパス解決の誤りに起因していたことは明らかです。

前提知識の解説

Goのビルドシステムとクロスコンパイル

Go言語は、その設計思想の一つとして「シンプルなクロスコンパイル」を掲げています。これは、開発者が異なるOSやCPUアーキテクチャ向けの実行ファイルを簡単に生成できることを意味します。

  • GOOSGOARCH:

    • GOOS (Go Operating System): ビルド対象のオペレーティングシステムを指定します(例: linux, windows, darwin)。
    • GOARCH (Go Architecture): ビルド対象のCPUアーキテクチャを指定します(例: amd64, arm, arm64)。
    • これらの環境変数は、go build コマンドなどでターゲット環境を指定するために使われます。例えば、GOOS=windows GOARCH=amd64 go build と実行すると、Windows 64bit向けの実行ファイルが生成されます。
  • GOHOSTOSGOHOSTARCH:

    • GOHOSTOS (Go Host Operating System): ビルドを実行しているホストマシンのオペレーティングシステムを指定します。
    • GOHOSTARCH (Go Host Architecture): ビルドを実行しているホストマシンのCPUアーキテクチャを指定します。
    • これらの変数は、Goツールチェイン自体が、自身の動作に必要なホスト固有のコンポーネント(例えば、コンパイラやリンカの内部ライブラリ)を識別するために使用します。通常、これらはGoのインストール時に自動的に設定されます。

cmd/dist

cmd/dist は、Goのソースコードリポジトリの src/cmd/dist に位置するGoのビルドシステムの中核をなすツールです。GoのソースコードからGoコンパイラ、リンカ、標準ライブラリ、その他のツールチェイン全体をビルドするために使用されます。これは、Goの自己ホスティング(Go自身がGoをビルドできること)を実現するための重要な部分です。

cmd/dist は、Goのソースツリー内の様々なコンポーネント(例えば、cmd/5c, cmd/6c, cmd/8c といった古いコンパイラフロントエンドや、cmd/5g, cmd/6g, cmd/8g といったGoコンパイラ、cmd/5l, cmd/6l, cmd/8l といったリンカなど)のビルド順序と依存関係を管理します。これらのコンポーネントは、それぞれが特定のOSとアーキテクチャに依存するライブラリ(例: libcc.a, libgc.a, liblink.a など)を必要とします。

技術的詳細

このコミットの技術的詳細は、cmd/dist がGoツールチェインのビルド時に、どのライブラリパスを参照するかという点に集約されます。

Goのビルドプロセスでは、コンパイラやリンカといったツール自体が、ビルドを実行しているホスト環境で動作する必要があります。これらのツールは、自身の機能を提供するために、特定のアーキテクチャに依存する静的ライブラリ(.a ファイル)を必要とします。これらのライブラリは、Goのソースツリー内の pkg/obj ディレクトリ以下に、$OS_$ARCH の形式で格納されています。

変更前は、cmd/dist 内のビルド定義において、これらのホスト環境で必要なライブラリのパスが $GOROOT/pkg/obj/$GOOS_$GOARCH/ の形式でハードコードされていました。これは、単一のターゲット環境(つまり、ホストとターゲットが同じ場合)でのビルドでは問題ありませんでした。しかし、クロスコンパイルを行う場合、$GOOS$GOARCH はビルド対象のOSとアーキテクチャを指すため、cmd/dist はホストで動作するツールが必要とするライブラリを、ターゲット環境向けのパスから探してしまいます。

例えば、src/cmd/dist/build.cstatic struct { ... } 定義内で、cmd/5c (Plan 9 CコンパイラのGoポート) が libcc.a を参照する際に、$GOROOT/pkg/obj/$GOOS_$GOARCH/libcc.a を使用していました。もし GOOS=windowsGOARCH=amd64 でクロスコンパイルを行っている場合、cmd/5cwindows_amd64 ディレクトリ内の libcc.a を探しますが、実際には cmd/5c 自体はビルドホスト(例えば linux_amd64)上で動作するため、linux_amd64 ディレクトリ内の libcc.a が必要になります。

このコミットは、この問題を解決するために、ホスト環境で動作するツールが参照するライブラリのパスを $GOROOT/pkg/obj/$GOHOSTOS_$GOHOSTARCH/ に変更しました。これにより、cmd/dist は常にビルドを実行しているホストのOSとアーキテクチャに対応するライブラリを正しく参照するようになります。

また、ファイルの末尾にある install 関数内の bsubst の呼び出しに $GOHOSTOS$GOHOSTARCH の置換が追加されています。これは、ビルドスクリプト内でこれらの変数が正しく展開されるようにするための変更であり、ビルドプロセス全体の一貫性を保つ上で重要です。

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

変更は src/cmd/dist/build.c ファイルに集中しています。

--- a/src/cmd/dist/build.c
+++ b/src/cmd/dist/build.c
@@ -545,17 +545,17 @@ static struct {
 	{"cmd/5c", {
 		"../cc/pgen.c",
 		"../cc/pswt.c",
-		"$GOROOT/pkg/obj/$GOOS_$GOARCH/libcc.a",
+		"$GOROOT/pkg/obj/$GOHOSTOS_$GOHOSTARCH/libcc.a",
 	}},
 	{"cmd/6c", {
 		"../cc/pgen.c",
 		"../cc/pswt.c",
-		"$GOROOT/pkg/obj/$GOOS_$GOARCH/libcc.a",
+		"$GOROOT/pkg/obj/$GOHOSTOS_$GOHOSTARCH/libcc.a",
 	}},
 	{"cmd/8c", {
 		"../cc/pgen.c",
 		"../cc/pswt.c",
-		"$GOROOT/pkg/obj/$GOOS_$GOARCH/libcc.a",
+		"$GOROOT/pkg/obj/$GOHOSTOS_$GOHOSTARCH/libcc.a",
 	}},
 	{"cmd/5g", {
 		"../gc/cplx.c",
@@ -563,7 +563,7 @@ static struct {
 		"../gc/plive.c",
 		"../gc/popt.c",
 		"../gc/popt.h",
-		"$GOROOT/pkg/obj/$GOOS_$GOARCH/libgc.a",
+		"$GOROOT/pkg/obj/$GOHOSTOS_$GOHOSTARCH/libgc.a",
 	}},
 	{"cmd/6g", {
 		"../gc/cplx.c",
@@ -571,7 +571,7 @@ static struct {
 		"../gc/plive.c",
 		"../gc/popt.c",
 		"../gc/popt.h",
-		"$GOROOT/pkg/obj/$GOOS_$GOARCH/libgc.a",
+		"$GOROOT/pkg/obj/$GOHOSTOS_$GOHOSTARCH/libgc.a",
 	}},
 	{"cmd/8g", {
 		"../gc/cplx.c",
@@ -579,7 +579,7 @@ static struct {
 		"../gc/plive.c",
 		"../gc/popt.c",
 		"../gc/popt.h",
-		"$GOROOT/pkg/obj/$GOOS_$GOARCH/libgc.a",
+		"$GOROOT/pkg/obj/$GOHOSTOS_$GOHOSTARCH/libgc.a",
 	}},
 	{"cmd/5l", {
 		"../ld/*",
@@ -594,9 +594,9 @@ static struct {
 		"zdefaultcc.go",
 	}},
 	{"cmd/", {
-		"$GOROOT/pkg/obj/$GOOS_$GOARCH/liblink.a",
-		"$GOROOT/pkg/obj/$GOOS_$GOARCH/libbio.a",
-		"$GOROOT/pkg/obj/$GOOS_$GOARCH/lib9.a",
+		"$GOROOT/pkg/obj/$GOHOSTOS_$GOHOSTARCH/liblink.a",
+		"$GOROOT/pkg/obj/$GOHOSTOS_$GOHOSTARCH/libbio.a",
+		"$GOROOT/pkg/obj/$GOHOSTOS_$GOHOSTARCH/lib9.a",
 	}},
 	{"pkg/runtime", {
 		"zaexperiment.h", // must sort above zasm
@@ -804,6 +804,8 @@ install(char *dir)
 				bsubst(&b1, "$GOROOT", goroot);\n
 				bsubst(&b1, "$GOOS", goos);\n
 				bsubst(&b1, "$GOARCH", goarch);\n
+\t\t\t\tbsubst(&b1, "$GOHOSTOS", gohostos);\n
+\t\t\t\tbsubst(&b1, "$GOHOSTARCH", gohostarch);\n
 \t\t\t\tp = bstr(&b1);\n
 \t\t\t\tif(hassuffix(p, \".a\")) {\n
 \t\t\t\t\tvadd(&lib, bpathf(&b, \"%s\", p));

コアとなるコードの解説

このコミットは、主に src/cmd/dist/build.c ファイル内の2つのセクションを変更しています。

  1. static struct { ... } 定義内のライブラリパスの変更:

    • この構造体は、Goツールチェインの様々なコンポーネント(cmd/5c, cmd/6c, cmd/8c などのCコンパイラフロントエンド、cmd/5g, cmd/6g, cmd/8g などのGoコンパイラ、そして一般的な cmd/ ツール)が依存するソースファイルやライブラリを定義しています。
    • 変更前は、これらのツールが依存する静的ライブラリ(例: libcc.a, libgc.a, liblink.a, libbio.a, lib9.a)のパスが $GOROOT/pkg/obj/$GOOS_$GOARCH/ と指定されていました。
    • この変更により、これらのパスが $GOROOT/pkg/obj/$GOHOSTOS_$GOHOSTARCH/ に修正されました。これにより、cmd/dist がGoツールチェインをビルドする際に、常にビルドを実行しているホストのOSとアーキテクチャに対応するライブラリを正しく参照するようになります。これは、クロスコンパイル時にホストで動作するツールが、ターゲット環境のライブラリではなく、ホスト環境のライブラリにリンクされることを保証します。
  2. install 関数内の bsubst 呼び出しの追加:

    • install 関数は、ビルドされたGoツールチェインのコンポーネントを適切なディレクトリにインストールする役割を担っています。
    • bsubst は、文字列内のプレースホルダー(例: $GOROOT, $GOOS)を実際の値に置換するユーティリティ関数です。
    • 変更前は $GOROOT, $GOOS, $GOARCH の置換のみが行われていました。
    • この変更により、$GOHOSTOS$GOHOSTARCH の置換も追加されました。これは、ビルドスクリプトや関連ファイル内でこれらのホスト環境変数が使用されている場合に、それらが正しく展開されることを保証します。これにより、ビルドプロセス全体で環境変数の扱いが一貫し、将来的な拡張やデバッグが容易になります。

これらの変更は、Goのビルドシステム、特にクロスコンパイルの堅牢性を高める上で非常に重要です。これにより、Go開発者はより多様な環境でGoアプリケーションをビルドできるようになり、Goのポータビリティという強みがさらに強化されます。

関連リンク

  • Go Change-Id: 81330045 (Gerrit Code Review): https://golang.org/cl/81330045
  • (参照されたIssue #6559の直接的な公開リンクは見つかりませんでした。)

参考にした情報源リンク

  • Go言語の公式ドキュメント (Goのビルドシステム、環境変数に関する一般的な情報)
  • Go言語のソースコード (src/cmd/dist/build.c の内容と周辺コード)
  • Go言語のクロスコンパイルに関する一般的な知識
  • GOOS, GOARCH, GOHOSTOS, GOHOSTARCH 環境変数の役割に関する一般的なプログラミング知識```

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

このコミットは、Go言語のビルドツールである cmd/dist において、ホスト環境のライブラリやバイナリを参照する際に使用する環境変数を $GOOS_$GOARCH から $GOHOSTOS_$GOHOSTARCH へと変更するものです。これにより、特にクロスコンパイル環境におけるビルドの正確性と安定性が向上します。

コミット

commit d826b2ed98ba7d37bd09addc9df16320e58f9e4e
Author: Jan Ziak <0xe2.0x9a.0x9b@gmail.com>
Date:   Tue Apr 15 08:46:21 2014 +0200

    cmd/dist: use GOHOSTARCH/GOHOSTOS instead of GOOS/GOARCH for host libraries and binaries
    
    Fixes #6559
    
    LGTM=rsc
    R=rsc
    CC=golang-codereviews
    https://golang.org/cl/81330045

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

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

元コミット内容

cmd/dist: use GOHOSTARCH/GOHOSTOS instead of GOOS/GOARCH for host libraries and binaries

Fixes #6559

LGTM=rsc
R=rsc
CC=golang-codereviews
https://golang.org/cl/81330045

変更の背景

この変更の背景には、Go言語のクロスコンパイルにおけるビルドシステムの正確性の問題がありました。Go言語は、あるオペレーティングシステム(OS)とアーキテクチャ(例: Linux/amd64)上で、別のOSとアーキテクチャ(例: Windows/arm64)向けのバイナリを生成する「クロスコンパイル」を強力にサポートしています。

Goのビルドプロセスでは、ターゲットとなるOSとアーキテクチャを $GOOS$GOARCH という環境変数で指定します。一方で、ビルドを実行しているホスト(現在のマシン)のOSとアーキテクチャは $GOHOSTOS$GOHOSTARCH で表されます。

cmd/dist はGoのソースコードからGoツールチェイン自体をビルドするための重要なツールです。このツールが、コンパイル時にホスト環境で動作するべきライブラリ(例えば、コンパイラやリンカが内部的に使用する補助ライブラリ)を参照する際に、誤って $GOOS_$GOARCH を使用していました。

この誤った参照は、特にクロスコンパイルを行う際に問題を引き起こします。例えば、Linux/amd64上でWindows/arm64向けのGoバイナリをビルドしようとした場合、cmd/dist はホスト(Linux/amd64)で必要なライブラリを $GOOS_$GOARCH (つまり windows_arm64) のパスから探そうとしてしまいます。しかし、そのパスにはターゲット環境向けのライブラリしか存在しないため、ビルドが失敗するか、不正なライブラリがリンクされて予期せぬ動作を引き起こす可能性がありました。

このコミットは、この問題を修正し、ホスト環境で必要なライブラリやバイナリのパスを $GOHOSTOS_$GOHOSTARCH を用いて正しく解決するように変更することで、クロスコンパイル環境でのビルドの堅牢性を高めています。コミットメッセージにある Fixes #6559 は、この問題に関連する特定のバグ報告を指していますが、公開されているGoのイシュートラッカーでは直接的な詳細が見つかりませんでした。しかし、変更内容からその問題がクロスコンパイル時のパス解決の誤りに起因していたことは明らかです。

前提知識の解説

Goのビルドシステムとクロスコンパイル

Go言語は、その設計思想の一つとして「シンプルなクロスコンパイル」を掲げています。これは、開発者が異なるOSやCPUアーキテクチャ向けの実行ファイルを簡単に生成できることを意味します。

  • GOOSGOARCH:

    • GOOS (Go Operating System): ビルド対象のオペレーティングシステムを指定します(例: linux, windows, darwin)。
    • GOARCH (Go Architecture): ビルド対象のCPUアーキテクチャを指定します(例: amd64, arm, arm64)。
    • これらの環境変数は、go build コマンドなどでターゲット環境を指定するために使われます。例えば、GOOS=windows GOARCH=amd64 go build と実行すると、Windows 64bit向けの実行ファイルが生成されます。
  • GOHOSTOSGOHOSTARCH:

    • GOHOSTOS (Go Host Operating System): ビルドを実行しているホストマシンのオペレーティングシステムを指定します。
    • GOHOSTARCH (Go Host Architecture): ビルドを実行しているホストマシンのCPUアーキテクチャを指定します。
    • これらの変数は、Goツールチェイン自体が、自身の動作に必要なホスト固有のコンポーネント(例えば、コンパイラやリンカの内部ライブラリ)を識別するために使用します。通常、これらはGoのインストール時に自動的に設定されます。

cmd/dist

cmd/dist は、Goのソースコードリポジトリの src/cmd/dist に位置するGoのビルドシステムの中核をなすツールです。GoのソースコードからGoコンパイラ、リンカ、標準ライブラリ、その他のツールチェイン全体をビルドするために使用されます。これは、Goの自己ホスティング(Go自身がGoをビルドできること)を実現するための重要な部分です。

cmd/dist は、Goのソースツリー内の様々なコンポーネント(例えば、cmd/5c, cmd/6c, cmd/8c といった古いコンパイラフロントエンドや、cmd/5g, cmd/6g, cmd/8g といったGoコンパイラ、cmd/5l, cmd/6l, cmd/8l といったリンカなど)のビルド順序と依存関係を管理します。これらのコンポーネントは、それぞれが特定のOSとアーキテクチャに依存するライブラリ(例: libcc.a, libgc.a, liblink.a など)を必要とします。

技術的詳細

このコミットの技術的詳細は、cmd/dist がGoツールチェインのビルド時に、どのライブラリパスを参照するかという点に集約されます。

Goのビルドプロセスでは、コンパイラやリンカといったツール自体が、ビルドを実行しているホスト環境で動作する必要があります。これらのツールは、自身の機能を提供するために、特定のアーキテクチャに依存する静的ライブラリ(.a ファイル)を必要とします。これらのライブラリは、Goのソースツリー内の pkg/obj ディレクトリ以下に、$OS_$ARCH の形式で格納されています。

変更前は、cmd/dist 内のビルド定義において、これらのホスト環境で必要なライブラリのパスが $GOROOT/pkg/obj/$GOOS_$GOARCH/ の形式でハードコードされていました。これは、単一のターゲット環境(つまり、ホストとターゲットが同じ場合)でのビルドでは問題ありませんでした。しかし、クロスコンパイルを行う場合、$GOOS$GOARCH はビルド対象のOSとアーキテクチャを指すため、cmd/dist はホストで動作するツールが必要とするライブラリを、ターゲット環境向けのパスから探してしまいます。

例えば、src/cmd/dist/build.cstatic struct { ... } 定義内で、cmd/5c (Plan 9 CコンパイラのGoポート) が libcc.a を参照する際に、$GOROOT/pkg/obj/$GOOS_$GOARCH/libcc.a を使用していました。もし GOOS=windowsGOARCH=amd64 でクロスコンパイルを行っている場合、cmd/5cwindows_amd64 ディレクトリ内の libcc.a を探しますが、実際には cmd/5c 自体はビルドホスト(例えば linux_amd64)上で動作するため、linux_amd64 ディレクトリ内の libcc.a が必要になります。

このコミットは、この問題を解決するために、ホスト環境で動作するツールが参照するライブラリのパスを $GOROOT/pkg/obj/$GOHOSTOS_$GOHOSTARCH/ に変更しました。これにより、cmd/dist は常にビルドを実行しているホストのOSとアーキテクチャに対応するライブラリを正しく参照するようになります。

また、ファイルの末尾にある install 関数内の bsubst の呼び出しに $GOHOSTOS$GOHOSTARCH の置換が追加されています。これは、ビルドスクリプト内でこれらの変数が正しく展開されるようにするための変更であり、ビルドプロセス全体の一貫性を保つ上で重要です。

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

変更は src/cmd/dist/build.c ファイルに集中しています。

--- a/src/cmd/dist/build.c
+++ b/src/cmd/dist/build.c
@@ -545,17 +545,17 @@ static struct {
 	{"cmd/5c", {
 		"../cc/pgen.c",
 		"../cc/pswt.c",
-		"$GOROOT/pkg/obj/$GOOS_$GOARCH/libcc.a",
+		"$GOROOT/pkg/obj/$GOHOSTOS_$GOHOSTARCH/libcc.a",
 	}},
 	{"cmd/6c", {
 		"../cc/pgen.c",
 		"../cc/pswt.c",
-		"$GOROOT/pkg/obj/$GOOS_$GOARCH/libcc.a",
+		"$GOROOT/pkg/obj/$GOHOSTOS_$GOHOSTARCH/libcc.a",
 	}},
 	{"cmd/8c", {
 		"../cc/pgen.c",
 		"../cc/pswt.c",
-		"$GOROOT/pkg/obj/$GOOS_$GOARCH/libcc.a",
+		"$GOROOT/pkg/obj/$GOHOSTOS_$GOHOSTARCH/libcc.a",
 	}},
 	{"cmd/5g", {
 		"../gc/cplx.c",
@@ -563,7 +563,7 @@ static struct {
 		"../gc/plive.c",
 		"../gc/popt.c",
 		"../gc/popt.h",
-		"$GOROOT/pkg/obj/$GOOS_$GOARCH/libgc.a",
+		"$GOROOT/pkg/obj/$GOHOSTOS_$GOHOSTARCH/libgc.a",
 	}},
 	{"cmd/6g", {
 		"../gc/cplx.c",
@@ -571,7 +571,7 @@ static struct {
 		"../gc/plive.c",
 		"../gc/popt.c",
 		"../gc/popt.h",
-		"$GOROOT/pkg/obj/$GOOS_$GOARCH/libgc.a",
+		"$GOROOT/pkg/obj/$GOHOSTOS_$GOHOSTARCH/libgc.a",
 	}},
 	{"cmd/8g", {
 		"../gc/cplx.c",
@@ -579,7 +579,7 @@ static struct {
 		"../gc/plive.c",
 		"../gc/popt.c",
 		"../gc/popt.h",
-		"$GOROOT/pkg/obj/$GOOS_$GOARCH/libgc.a",
+		"$GOROOT/pkg/obj/$GOHOSTOS_$GOHOSTARCH/libgc.a",
 	}},
 	{"cmd/5l", {
 		"../ld/*",
@@ -594,9 +594,9 @@ static struct {
 		"zdefaultcc.go",
 	}},
 	{"cmd/", {
-		"$GOROOT/pkg/obj/$GOOS_$GOARCH/liblink.a",
-		"$GOROOT/pkg/obj/$GOOS_$GOARCH/libbio.a",
-		"$GOROOT/pkg/obj/$GOOS_$GOARCH/lib9.a",
+		"$GOROOT/pkg/obj/$GOHOSTOS_$GOHOSTARCH/liblink.a",
+		"$GOROOT/pkg/obj/$GOHOSTOS_$GOHOSTARCH/libbio.a",
+		"$GOROOT/pkg/obj/$GOHOSTOS_$GOHOSTARCH/lib9.a",
 	}},
 	{"pkg/runtime", {
 		"zaexperiment.h", // must sort above zasm
@@ -804,6 +804,8 @@ install(char *dir)
 				bsubst(&b1, "$GOROOT", goroot);\n
 				bsubst(&b1, "$GOOS", goos);\n
 				bsubst(&b1, "$GOARCH", goarch);\n
+\t\t\t\tbsubst(&b1, "$GOHOSTOS", gohostos);\n
+\t\t\t\tbsubst(&b1, "$GOHOSTARCH", gohostarch);\n
 \t\t\t\tp = bstr(&b1);\n
 \t\t\t\tif(hassuffix(p, \".a\")) {\n
 \t\t\t\t\tvadd(&lib, bpathf(&b, \"%s\", p));

コアとなるコードの解説

このコミットは、主に src/cmd/dist/build.c ファイル内の2つのセクションを変更しています。

  1. static struct { ... } 定義内のライブラリパスの変更:

    • この構造体は、Goツールチェインの様々なコンポーネント(cmd/5c, cmd/6c, cmd/8c などのCコンパイラフロントエンド、cmd/5g, cmd/6g, cmd/8g などのGoコンパイラ、そして一般的な cmd/ ツール)が依存するソースファイルやライブラリを定義しています。
    • 変更前は、これらのツールが依存する静的ライブラリ(例: libcc.a, libgc.a, liblink.a, libbio.a, lib9.a)のパスが $GOROOT/pkg/obj/$GOOS_$GOARCH/ と指定されていました。
    • この変更により、これらのパスが $GOROOT/pkg/obj/$GOHOSTOS_$GOHOSTARCH/ に修正されました。これにより、cmd/dist がGoツールチェインをビルドする際に、常にビルドを実行しているホストのOSとアーキテクチャに対応するライブラリを正しく参照するようになります。これは、クロスコンパイル時にホストで動作するツールが、ターゲット環境のライブラリではなく、ホスト環境のライブラリにリンクされることを保証します。
  2. install 関数内の bsubst 呼び出しの追加:

    • install 関数は、ビルドされたGoツールチェインのコンポーネントを適切なディレクトリにインストールする役割を担っています。
    • bsubst は、文字列内のプレースホルダー(例: $GOROOT, $GOOS)を実際の値に置換するユーティリティ関数です。
    • 変更前は $GOROOT, $GOOS, $GOARCH の置換のみが行われていました。
    • この変更により、$GOHOSTOS$GOHOSTARCH の置換も追加されました。これは、ビルドスクリプトや関連ファイル内でこれらのホスト環境変数が使用されている場合に、それらが正しく展開されることを保証します。これにより、ビルドプロセス全体で環境変数の扱いが一貫し、将来的な拡張やデバッグが容易になります。

これらの変更は、Goのビルドシステム、特にクロスコンパイルの堅牢性を高める上で非常に重要です。これにより、Go開発者はより多様な環境でGoアプリケーションをビルドできるようになり、Goのポータビリティという強みがさらに強化されます。

関連リンク

  • Go Change-Id: 81330045 (Gerrit Code Review): https://golang.org/cl/81330045
  • (参照されたIssue #6559の直接的な公開リンクは見つかりませんでした。)

参考にした情報源リンク

  • Go言語の公式ドキュメント (Goのビルドシステム、環境変数に関する一般的な情報)
  • Go言語のソースコード (src/cmd/dist/build.c の内容と周辺コード)
  • Go言語のクロスコンパイルに関する一般的な知識
  • GOOS, GOARCH, GOHOSTOS, GOHOSTARCH 環境変数の役割に関する一般的なプログラミング知識