[インデックス 11142] ファイルの概要
このコミットは、src/Make.pkg
ファイルに対する変更を含んでいます。このファイルはGo言語のビルドシステムにおいて、C言語ソースファイルのコンパイルルールを定義するMakefileの一部です。
コミット
- コミットハッシュ:
e91b31bc79809ccb3ac86dc9c71d7fad4acbc40d
- 作者: Russ Cox rsc@golang.org
- コミット日時: 2012年1月12日 木曜日 15:27:49 -0800
- コミットメッセージ:
fix build TBR=gri CC=golang-dev https://golang.org/cl/5528090
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/e91b31bc79809ccb3ac86dc9c71d7fad4acbc40d
元コミット内容
fix build
TBR=gri
CC=golang-dev
https://golang.org/cl/5528090
変更の背景
このコミットの主な目的は、Go言語のビルドプロセスにおける問題を修正することです。コミットメッセージは簡潔に「fix build」と述べており、関連するGo Change List (CL) 5528090のタイトルも「FIX BUILD」となっています。これは、何らかのビルドエラーが発生しており、その解決のためにこの変更が導入されたことを示唆しています。
具体的なビルドエラーの内容はコミットメッセージからは直接読み取れませんが、変更内容から推測すると、C言語のソースファイルをコンパイルする際に、特定のヘッダーファイルやオブジェクトファイルが見つからないという問題が発生していた可能性があります。特に、GoのビルドシステムではCGO(C言語とGo言語の相互運用機能)を使用する際に、C言語のコードがコンパイルされることが多く、その際にインクルードパスの設定が重要になります。
この修正は、ビルドの安定性と信頼性を確保するために行われました。
前提知識の解説
このコミットを理解するためには、以下の概念について知っておく必要があります。
- Makefile:
Make.pkg
はMakefileの一部であり、ソフトウェアのビルドプロセスを自動化するためのルールを記述するファイルです。make
コマンドによって解釈され、ソースコードのコンパイル、リンク、インストールなどのタスクを実行します。 - Go言語のビルドシステム: Go言語は独自のビルドシステムを持っており、
go build
コマンドなどで利用されます。しかし、内部的にはC言語で書かれた部分(ランタイムなど)やCGOを介してC言語のコードを扱う場合があり、その際には伝統的なC/C++コンパイラ(GCCなど)とMakefileが使用されます。 - CGO: Go言語とC言語のコードを相互に呼び出すためのメカニズムです。CGOを使用すると、Goプログラムから既存のCライブラリを利用したり、C言語でパフォーマンスが重要な部分を記述したりできます。CGOが関与する場合、C言語のソースコードがコンパイルされるため、Cコンパイラのオプションが重要になります。
HOST_CC
: Goのビルドシステム内で定義される変数で、ホストシステム(ビルドを実行している環境)のCコンパイラを指します。通常はgcc
やclang
などです。CGO_CFLAGS
/_CGO_CFLAGS
/_CGO_CFLAGS_$(GOARCH)
: これらはCGOに関連するCコンパイラのフラグ(オプション)を格納する変数です。CGO_CFLAGS
: ユーザーが指定するCGOのコンパイルフラグ。_CGO_CFLAGS
: 内部的に使用されるCGOのコンパイルフラグ。_CGO_CFLAGS_$(GOARCH)
: 特定のアーキテクチャ(例:amd64
,arm
など)に特化したCGOのコンパイルフラグ。$(GOARCH)
は現在のターゲットアーキテクチャを表す変数です。
-g
: デバッグ情報を生成するためのコンパイラオプション。-fPIC
: Position-Independent Code(位置独立コード)を生成するためのコンパイラオプション。共有ライブラリをビルドする際などに必要となります。-O2
: 最適化レベルを指定するコンパイラオプション。O2
は中程度の最適化を意味します。-o $@
: 出力ファイル名を指定するオプション。$@
はMakefileの自動変数で、ターゲットファイル名(この場合は.o
ファイル)を表します。-c
: コンパイルのみを行い、リンクは行わないことを指定するオプション。オブジェクトファイル(.o
ファイル)を生成します。-I<dir>
: インクルードパスを追加するためのコンパイラオプション。コンパイラがヘッダーファイルを探すディレクトリを指定します。$*.c
: Makefileの自動変数で、パターンマッチングルールにおいて、ターゲット名から拡張子を除いた部分(ベース名)に.c
を付けたものを表します。$^
: Makefileの自動変数で、依存関係にあるすべてのファイルを表します。
技術的詳細
このコミットの技術的な核心は、src/Make.pkg
内のC言語ソースファイルのコンパイルルールに、-I_obj
というインクルードパスを追加した点にあります。
変更前は以下のコンパイルルールでした。
%.o: %.c
$(HOST_CC) $(_CGO_CFLAGS_$(GOARCH)) -g -fPIC -O2 -o $@ -c $(CGO_CFLAGS) $(_CGO_CFLAGS) $*.c
%.o: _obj/%.c
$(HOST_CC) $(_CGO_CFLAGS_$(GOARCH)) -I . -g -fPIC -O2 -o $@ -c $(CGO_CFLAGS) $(_CGO_CFLAGS) $^
変更後は以下のようになります。
%.o: %.c
$(HOST_CC) $(_CGO_CFLAGS_$(GOARCH)) -g -fPIC -O2 -o $@ -c -I_obj $(CGO_CFLAGS) $(_CGO_CFLAGS) $*.c
%.o: _obj/%.c
$(HOST_CC) $(_CGO_CFLAGS_$(GOARCH)) -I . -g -fPIC -O2 -o $@ -c -I_obj $(CGO_CFLAGS) $(_CGO_CFLAGS) $^
両方のルールに-I_obj
が追加されています。
%.o: %.c
: これは、現在のディレクトリにある.c
ファイルをコンパイルして.o
ファイルを生成する一般的なルールです。%.o: _obj/%.c
: これは、_obj
ディレクトリにある.c
ファイルをコンパイルして.o
ファイルを生成するルールです。_obj
ディレクトリは、Goのビルドプロセスにおいて、CGOによって生成されたCソースファイルや、中間的なオブジェクトファイルが配置される場所としてよく使用されます。
-I_obj
を追加することで、Cコンパイラはヘッダーファイルを検索する際に、_obj
ディレクトリも参照するようになります。これは、CGOによって生成されたヘッダーファイルや、ビルドプロセス中に_obj
ディレクトリに配置される他の必要なヘッダーファイルが、コンパイル時に見つからないという問題を解決するために不可欠です。
Goのビルドシステムは複雑であり、特にCGOが絡む場合、C言語のコンパイル環境(インクルードパス、ライブラリパスなど)が正しく設定されていることが重要です。この修正は、特定のビルド環境やGoのバージョンアップに伴って発生した、ヘッダーファイルの検索パスに関する問題を解決するためのものであったと考えられます。
コアとなるコードの変更箇所
--- a/src/Make.pkg
+++ b/src/Make.pkg
@@ -149,10 +149,10 @@ endif
# Compile rules for gcc source files.
%.o: %.c
- $(HOST_CC) $(_CGO_CFLAGS_$(GOARCH)) -g -fPIC -O2 -o $@ -c $(CGO_CFLAGS) $(_CGO_CFLAGS) $*.c
+ $(HOST_CC) $(_CGO_CFLAGS_$(GOARCH)) -g -fPIC -O2 -o $@ -c -I_obj $(CGO_CFLAGS) $(_CGO_CFLAGS) $*.c
%.o: _obj/%.c
- $(HOST_CC) $(_CGO_CFLAGS_$(GOARCH)) -I . -g -fPIC -O2 -o $@ -c $(CGO_CFLAGS) $(_CGO_CFLAGS) $^\
+ $(HOST_CC) $(_CGO_CFLAGS_$(GOARCH)) -I . -g -fPIC -O2 -o $@ -c -I_obj $(CGO_CFLAGS) $(_CGO_CFLAGS) $^\
# To find out which symbols are needed from external libraries
# and which libraries are needed, we build a simple a.out that
コアとなるコードの解説
この変更は、src/Make.pkg
ファイル内の2つのコンパイルルールに、-I_obj
というコンパイラオプションを追加しています。
-
%.o: %.c
ルールへの変更:- $(HOST_CC) $(_CGO_CFLAGS_$(GOARCH)) -g -fPIC -O2 -o $@ -c $(CGO_CFLAGS) $(_CGO_CFLAGS) $*.c + $(HOST_CC) $(_CGO_CFLAGS_$(GOARCH)) -g -fPIC -O2 -o $@ -c -I_obj $(CGO_CFLAGS) $(_CGO_CFLAGS) $*.c
このルールは、現在のディレクトリにある
.c
ソースファイルをコンパイルして、対応する.o
オブジェクトファイルを生成するためのものです。変更により、Cコンパイラ($(HOST_CC)
)がソースファイルをコンパイルする際に、-I_obj
オプションが追加されました。これにより、コンパイラはヘッダーファイルを検索するパスとして_obj
ディレクトリも考慮するようになります。 -
%.o: _obj/%.c
ルールへの変更:- $(HOST_CC) $(_CGO_CFLAGS_$(GOARCH)) -I . -g -fPIC -O2 -o $@ -c $(CGO_CFLAGS) $(_CGO_CFLAGS) $^\ + $(HOST_CC) $(_CGO_CFLAGS_$(GOARCH)) -I . -g -fPIC -O2 -o $@ -c -I_obj $(CGO_CFLAGS) $(_CGO_CFLAGS) $^\
このルールは、
_obj
ディレクトリにある.c
ソースファイルをコンパイルするためのものです。このルールには元々-I .
(現在のディレクトリをインクルードパスに追加)が含まれていましたが、今回の変更でさらに-I_obj
が追加されました。これは、_obj
ディレクトリ内のCソースファイルが、同じ_obj
ディレクトリ内、またはGoのビルドプロセスによって生成された他の場所に存在するヘッダーファイルに依存している場合に、それらを正しく見つけられるようにするために必要です。
両方のルールに-I_obj
を追加することで、Goのビルドプロセス、特にCGOが関与する部分において、C言語のコンパイル時に必要なヘッダーファイルが適切に解決されるようになり、ビルドエラーが解消されたと考えられます。これは、ビルド環境の変更や、CGOが生成するファイルの配置に関する内部的な変更に対応するための、堅牢性を高める修正と言えます。
関連リンク
- Go Change List 5528090: https://golang.org/cl/5528090
参考にした情報源リンク
- Go Change List 5528090の概要 (Web検索結果より)
- Makefileの一般的な構文と自動変数に関する知識
- C/C++コンパイラのオプション(
-I
,-c
,-g
,-fPIC
,-O
など)に関する一般的な知識 - Go言語のビルドシステムとCGOに関する一般的な知識 (Go公式ドキュメントなど)