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

[インデックス 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コンパイラを指します。通常はgccclangなどです。
  • 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というコンパイラオプションを追加しています。

  1. %.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ディレクトリも考慮するようになります。

  2. %.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の概要 (Web検索結果より)
  • Makefileの一般的な構文と自動変数に関する知識
  • C/C++コンパイラのオプション(-I, -c, -g, -fPIC, -Oなど)に関する一般的な知識
  • Go言語のビルドシステムとCGOに関する一般的な知識 (Go公式ドキュメントなど)