[インデックス 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アーキテクチャ向けの実行ファイルを簡単に生成できることを意味します。
-
GOOS
とGOARCH
:GOOS
(Go Operating System): ビルド対象のオペレーティングシステムを指定します(例:linux
,windows
,darwin
)。GOARCH
(Go Architecture): ビルド対象のCPUアーキテクチャを指定します(例:amd64
,arm
,arm64
)。- これらの環境変数は、
go build
コマンドなどでターゲット環境を指定するために使われます。例えば、GOOS=windows GOARCH=amd64 go build
と実行すると、Windows 64bit向けの実行ファイルが生成されます。
-
GOHOSTOS
とGOHOSTARCH
: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.c
の static struct { ... }
定義内で、cmd/5c
(Plan 9 CコンパイラのGoポート) が libcc.a
を参照する際に、$GOROOT/pkg/obj/$GOOS_$GOARCH/libcc.a
を使用していました。もし GOOS=windows
、GOARCH=amd64
でクロスコンパイルを行っている場合、cmd/5c
は windows_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つのセクションを変更しています。
-
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とアーキテクチャに対応するライブラリを正しく参照するようになります。これは、クロスコンパイル時にホストで動作するツールが、ターゲット環境のライブラリではなく、ホスト環境のライブラリにリンクされることを保証します。
- この構造体は、Goツールチェインの様々なコンポーネント(
-
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アーキテクチャ向けの実行ファイルを簡単に生成できることを意味します。
-
GOOS
とGOARCH
:GOOS
(Go Operating System): ビルド対象のオペレーティングシステムを指定します(例:linux
,windows
,darwin
)。GOARCH
(Go Architecture): ビルド対象のCPUアーキテクチャを指定します(例:amd64
,arm
,arm64
)。- これらの環境変数は、
go build
コマンドなどでターゲット環境を指定するために使われます。例えば、GOOS=windows GOARCH=amd64 go build
と実行すると、Windows 64bit向けの実行ファイルが生成されます。
-
GOHOSTOS
とGOHOSTARCH
: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.c
の static struct { ... }
定義内で、cmd/5c
(Plan 9 CコンパイラのGoポート) が libcc.a
を参照する際に、$GOROOT/pkg/obj/$GOOS_$GOARCH/libcc.a
を使用していました。もし GOOS=windows
、GOARCH=amd64
でクロスコンパイルを行っている場合、cmd/5c
は windows_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つのセクションを変更しています。
-
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とアーキテクチャに対応するライブラリを正しく参照するようになります。これは、クロスコンパイル時にホストで動作するツールが、ターゲット環境のライブラリではなく、ホスト環境のライブラリにリンクされることを保証します。
- この構造体は、Goツールチェインの様々なコンポーネント(
-
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
環境変数の役割に関する一般的なプログラミング知識