[インデックス 12574] ファイルの概要
このコミットは、Go言語のビルドシステムにおけるcmd/dist
ツールのコンパイル方法を修正するものです。具体的には、ホストアーキテクチャ(GOHOSTARCH
)に応じてgcc
に適切なフラグ(-m32
または-m64
)を渡すように変更し、cmd/dist
が正しくビルドされるようにします。
コミット
commit 72801291d6cb2109cc6578b4d1fb508cd4ae4f43
Author: Shenghou Ma <minux.ma@gmail.com>
Date: Tue Mar 13 03:34:22 2012 +0800
build: build correct cmd/dist matching GOHOSTARCH
Fix for issue 3210 comment #1.
R=adg, rsc
CC=golang-dev
https://golang.org/cl/5794057
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/72801291d6cb2109cc6578b4d1fb508cd4ae4f43
元コミット内容
build: build correct cmd/dist matching GOHOSTARCH
Fix for issue 3210 comment #1.
R=adg, rsc
CC=golang-dev
https://golang.org/cl/5794057
変更の背景
この変更は、Go言語のビルドプロセスにおいて、cmd/dist
という重要なツールが、ビルドを実行するホストシステムのアーキテクチャ(GOHOSTARCH
)と一致しない形でコンパイルされる可能性があった問題に対処するために行われました。
Go言語のビルドシステムは、クロスコンパイルを強力にサポートしていますが、その過程でビルドツール自体がホスト環境で正しく動作することが不可欠です。cmd/dist
はGoのビルドプロセスの中核をなすツールの一つであり、Goのソースコードからバイナリを生成する際に様々なビルドステップを調整します。
以前のビルドスクリプトでは、cmd/dist
をコンパイルする際に、ホストアーキテクチャに応じた適切なコンパイラフラグ(例えば32ビットシステム用の-m32
や64ビットシステム用の-m64
)がgcc
に明示的に渡されていませんでした。これにより、特定の環境、特に32ビットと64ビットの混在するシステムや、デフォルトのgcc
の挙動が期待と異なる場合に、cmd/dist
が正しく動作しない、あるいは予期せぬエラーを引き起こす可能性がありました。
コミットメッセージにある「Fix for issue 3210 comment #1」は、この問題が特定のバグトラッキングシステム(おそらくGoのIssue Tracker)で報告され、そのコメントで議論された解決策に基づいていることを示唆しています。ただし、現在のGoのIssue 3210はジェネリクスに関するものであり、このコミットの時期とは内容が異なるため、当時のIssue番号が現在とは異なるか、内部的な参照であった可能性があります。重要なのは、この変更がビルドの堅牢性を高めるための修正であるという点です。
前提知識の解説
このコミットを理解するためには、以下の概念を把握しておく必要があります。
- Go言語のビルドシステム: Go言語は、自身のコンパイラやツールチェインをGo自身で記述しており、そのビルドプロセスは非常に洗練されています。
make.bash
のようなシェルスクリプトが、このビルドプロセスの初期段階を担い、Goのツールチェインをブートストラップします。 GOHOSTARCH
: これはGoの環境変数の一つで、Goのツールチェインが動作するホストシステムのCPUアーキテクチャを示します。例えば、amd64
(64ビットIntel/AMD)、386
(32ビットIntel/AMD)、arm
などがあります。Goのビルドシステムは、この変数を利用して、ホスト環境に合わせたツールをビルドします。cmd/dist
: Goのソースツリー内のsrc/cmd/dist
ディレクトリにあるツールです。これはGoのビルドプロセスにおいて非常に重要な役割を果たします。具体的には、Goのソースコードからコンパイラ、リンカ、アセンブラなどのツールチェインをビルドし、Goの標準ライブラリをコンパイルし、最終的なGoのバイナリを生成する一連のステップを管理します。これはGoのビルドの「司令塔」のような存在です。make.bash
: Goのソースツリーのルートにあるシェルスクリプトです。これはGoのツールチェインをゼロからビルドする(ブートストラップする)ための主要なスクリプトです。cmd/dist
のような初期のビルドツールをコンパイルする役割も担っています。gcc
: GNU Compiler Collectionの略で、C言語、C++、Objective-C、Fortran、Ada、Goなどのプログラミング言語をコンパイルできるコンパイラ群です。Goの初期のビルドプロセスでは、cmd/dist
のようなC言語で書かれた部分をコンパイルするためにgcc
が使用されます。- コンパイラフラグ
-m32
と-m64
:gcc
において、これらのフラグは生成するバイナリのターゲットアーキテクチャを指定します。-m32
: 32ビットのバイナリを生成するよう指示します。これは、32ビットシステムで実行されるプログラムや、64ビットシステム上で32ビット互換モードで実行されるプログラムをビルドする際に使用されます。-m64
: 64ビットのバイナリを生成するよう指示します。これは、64ビットシステムで実行されるプログラムをビルドする際に使用されます。 これらのフラグは、特にマルチアーキテクチャをサポートするシステム(例えば、64ビットLinux上で32ビットライブラリも利用できる環境)で重要になります。
技術的詳細
このコミットの技術的な核心は、src/make.bash
スクリプト内でcmd/dist
をコンパイルするgcc
コマンドに、ホストアーキテクチャに応じた適切なビット幅指定フラグ(-m32
または-m64
)を追加することです。
変更前のmake.bash
では、cmd/dist
のコンパイルは以下の行で行われていました。
gcc -O2 -Wall -Werror -ggdb -o cmd/dist/dist -Icmd/dist "$DEFGOROOT" cmd/dist/*.c
このコマンドでは、最適化レベル(-O2
)、警告の有効化(-Wall
)、警告をエラーとして扱う(-Werror
)、デバッグ情報の生成(-ggdb
)、出力ファイル名(-o cmd/dist/dist
)、インクルードパス(-Icmd/dist
)、およびGoのルートパス定義("$DEFGOROOT"
)が指定されていますが、ターゲットアーキテクチャのビット幅を明示的に指定するフラグがありませんでした。
変更後、以下のロジックが追加されました。
mflag=""
case "$GOHOSTARCH" in
386) mflag=-m32;;
amd64) mflag=-m64;;
esac
gcc $mflag -O2 -Wall -Werror -ggdb -o cmd/dist/dist -Icmd/dist "$DEFGOROOT" cmd/dist/*.c
mflag=""
: まず、mflag
という変数を空文字列で初期化します。case "$GOHOSTARCH" in ... esac
:GOHOSTARCH
環境変数の値に基づいて条件分岐を行います。386)
:GOHOSTARCH
が386
(32ビットIntel/AMDアーキテクチャ)の場合、mflag
に-m32
を設定します。amd64)
:GOHOSTARCH
がamd64
(64ビットIntel/AMDアーキテクチャ)の場合、mflag
に-m64
を設定します。- この
case
文は、現在のGoがサポートする主要なIntel/AMDアーキテクチャに対応しています。他のアーキテクチャ(例:arm
)の場合、mflag
は空のままとなり、gcc
はデフォルトの挙動(通常はホストのネイティブアーキテクチャ)でコンパイルします。
gcc $mflag ...
: 最後に、gcc
コマンドの引数リストに$mflag
変数を挿入します。これにより、GOHOSTARCH
が386
であれば-m32
が、amd64
であれば-m64
がgcc
に渡され、cmd/dist
がホストアーキテクチャに合ったビット幅でコンパイルされるようになります。
この修正により、cmd/dist
が常にホストアーキテクチャに適合したバイナリとしてビルドされることが保証され、Goのビルドプロセスの安定性と信頼性が向上しました。特に、64ビットシステム上で32ビットのGoツールチェインをビルドするようなシナリオ(クロスコンパイルの準備段階など)において、この修正は重要です。
コアとなるコードの変更箇所
変更はsrc/make.bash
ファイルに集中しています。
--- a/src/make.bash
+++ b/src/make.bash
@@ -86,7 +86,14 @@ echo cmd/dist
export GOROOT="$(cd .. && pwd)"
GOROOT_FINAL="${GOROOT_FINAL:-$GOROOT}"
DEFGOROOT='-DGOROOT_FINAL="'"$GOROOT_FINAL"'"'
-gcc -O2 -Wall -Werror -ggdb -o cmd/dist/dist -Icmd/dist "$DEFGOROOT" cmd/dist/*.c
+
+mflag=""
+case "$GOHOSTARCH" in
+386) mflag=-m32;;
+amd64) mflag=-m64;;
+esac
+gcc $mflag -O2 -Wall -Werror -ggdb -o cmd/dist/dist -Icmd/dist "$DEFGOROOT" cmd/dist/*.c
+
eval $(./cmd/dist/dist env -p)
echo
コアとなるコードの解説
上記の差分が示すように、src/make.bash
の89行目付近で、cmd/dist
をコンパイルするためのgcc
コマンドが変更されています。
-
削除された行:
gcc -O2 -Wall -Werror -ggdb -o cmd/dist/dist -Icmd/dist "$DEFGOROOT" cmd/dist/*.c
これは、以前の
cmd/dist
コンパイルコマンドです。ここでは、gcc
にアーキテクチャ指定のフラグが渡されていませんでした。 -
追加された行:
mflag="" case "$GOHOSTARCH" in 386) mflag=-m32;; amd64) mflag=-m64;; esac gcc $mflag -O2 -Wall -Werror -ggdb -o cmd/dist/dist -Icmd/dist "$DEFGOROOT" cmd/dist/*.c
この新しいコードブロックは、
GOHOSTARCH
の値に基づいてmflag
変数を設定し、そのmflag
をgcc
コマンドに挿入しています。これにより、cmd/dist
がホストアーキテクチャに合わせたビット幅でコンパイルされることが保証されます。
この変更は、Goのビルドシステムの初期ブートストラップ段階における重要な修正であり、Goツールチェイン全体の安定性と互換性を向上させるものです。
関連リンク
- Go言語の公式ウェブサイト: https://golang.org/
- Goのソースコードリポジトリ(GitHub): https://github.com/golang/go
- GoのIssue Tracker (現在の): https://github.com/golang/go/issues
参考にした情報源リンク
- Go言語の公式ドキュメント(ビルドプロセスに関するもの)
- GCCのドキュメント(特に
-m32
や-m64
フラグに関するもの) - Goのソースコード(
src/make.bash
およびsrc/cmd/dist
) - 当時のGoコミュニティの議論(Goのメーリングリストや古いIssue Trackerなど、コミットメッセージに示唆されている情報源)
- ただし、Issue 3210の現在の内容はコミット当時のものと異なるため、当時の正確な議論を特定することは困難でした。