[インデックス 10851] ファイルの概要
このコミットは、Go言語のランタイムビルドシステムにおける問題を修正し、特に複数のビルドシステムを同時にサポートすることから脱却しようとする試みの一環です。Makefile
とMakefile.auto
という2つのビルド関連ファイルが変更され、ビルドプロセスの簡素化と循環依存性の解消が図られています。
コミット
commit cfd17a1b57adb6f1602f6a635af7f50be688ed10
Author: Russ Cox <rsc@golang.org>
Date: Fri Dec 16 17:58:53 2011 -0500
runtime: fix build
I am looking forward to not supporting two build
systems simultaneously. Make complains about
a circular dependency still, but I don't understand it
and it's probably not worth the time to figure out.
TBR=r
CC=golang-dev
https://golang.org/cl/5496058
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/cfd17a1b57adb6f1602f6a635af7f50be688ed10
元コミット内容
runtime: fix build
I am looking forward to not supporting two build
systems simultaneously. Make complains about
a circular dependency still, but I don't understand it
and it's probably not worth the time to figure out.
TBR=r
CC=golang-dev
https://golang.org/cl/5496058
変更の背景
このコミットが行われた2011年当時、Go言語のビルドシステムは過渡期にありました。従来のMakefile
ベースのビルドシステムと、Go自身のツールチェイン(go tool
コマンド群)を利用した新しいビルドシステムが混在しており、その両方をサポートすることによる複雑さや問題が発生していました。コミットメッセージにある「not supporting two build systems simultaneously」(2つのビルドシステムを同時にサポートしないこと)という記述は、この状況を解消し、ビルドプロセスを一本化したいという意図を明確に示しています。
また、Makefile
が「circular dependency」(循環依存性)について不満を述べている、という記述から、ビルドターゲット間の依存関係が複雑になり、無限ループやビルドエラーを引き起こす可能性のある問題が存在していたことが伺えます。このコミットは、これらの問題を解決し、Goランタイムのビルドを安定させることを目的としています。
前提知識の解説
Makefileとビルドシステム
Makefile
は、プログラムのコンパイルやリンクなどのビルドプロセスを自動化するためのファイルです。make
コマンドによって解釈され、ファイル間の依存関係を定義し、必要なコマンドを実行してターゲットを生成します。大規模なプロジェクトでは、複数のMakefile
が存在したり、自動生成されるMakefile
(例: Makefile.auto
)が使われたりすることがあります。
循環依存性 (Circular Dependency)
ビルドシステムにおける循環依存性とは、AがBに依存し、BがAに依存するといったように、ビルドターゲットやファイルが互いに依存し合う状態を指します。これはビルドプロセスの無限ループや、どのターゲットからビルドを開始すべきか判断できないといった問題を引き起こし、ビルドエラーの原因となります。
Go言語のビルドシステム (2011年頃)
Go言語は、その初期から独自のツールチェイン(go build
, go install
など)を持つことを目指していました。しかし、プロジェクトの初期段階では、C言語で書かれた部分(ランタイムなど)のビルドには従来のmake
が使われていました。このコミットが行われた時期は、Go自身のツールチェインが成熟しつつあり、make
への依存を減らしていく過渡期にあたります。
gomake
コミットメッセージや変更内容から推測すると、gomake
はGoプロジェクト内で使用される、make
コマンドのラッパーまたはGo言語に特化したmake
の代替のようなツールであると考えられます。これは、GoのビルドプロセスをよりGoらしく、かつ効率的に制御するために導入された可能性があります。
技術的詳細
このコミットの主要な変更点は、src/pkg/runtime/Makefile
とsrc/pkg/runtime/Makefile.auto
の2つのファイルにあります。
src/pkg/runtime/Makefile
の変更
-
x:=$(shell gomake -f Makefile.auto)
の追加:- これは、
Makefile
の冒頭に新しい行として追加されています。 $(shell ...)
は、シェルコマンドを実行し、その出力を変数に代入するmake
の機能です。gomake -f Makefile.auto
は、Makefile.auto
をgomake
で実行することを意味します。- この行の追加により、メインの
Makefile
がMakefile.auto
のビルドプロセスをトリガーするようになりました。これは、ビルドの制御をMakefile.auto
に委譲し、Makefile
とMakefile.auto
間の依存関係を明確にする(または、Makefile.auto
をメインのビルドフローに統合する)ための重要な変更です。これにより、従来のMakefile
が抱えていた循環依存性の問題の一部を解消しようとしている可能性があります。
- これは、
-
ヘッダーファイルの依存関係の削除:
AUTOHFILES
からzasm_GOOS_GOARCH.h
が削除されました。HFILES
からasm_$(GOARCH).h
が削除されました。- これらのヘッダーファイルは、Goランタイムのアセンブリコードに関連するもので、OSやアーキテクチャ固有の定義を含んでいます。これらの依存関係が
Makefile
から削除されたのは、おそらくMakefile.auto
がこれらのファイルの生成と依存関係をより適切に管理するようになったためと考えられます。
-
%.$O: zasm_GOOS_GOARCH.h
の追加:- これは、
zasm_GOOS_GOARCH.h
がオブジェクトファイル(.$O
)の依存関係として追加されたことを示しています。これは、zasm_GOOS_GOARCH.h
がオブジェクトファイルのビルドに必要であることを明示しています。
- これは、
src/pkg/runtime/Makefile.auto
の変更
-
include ../../Make.inc
の追加:Makefile.auto
もMake.inc
をインクルードするようになりました。これにより、共通のビルド設定や変数がMakefile.auto
でも利用可能になり、ビルドシステム全体の一貫性が向上します。
-
HFILES
変数の定義と追加:Makefile.auto
内でHFILES
変数が定義され、arch_GOARCH.h
,os_GOOS.h
,signals_GOOS.h
,defs_GOOS_GOARCH.h
,zasm_GOOS_GOARCH.h
といったヘッダーファイルが含まれるようになりました。- これは、
Makefile.auto
がこれらのヘッダーファイルの生成と管理の責任を負うことを明確にしています。
-
zasm_%.h
ターゲットの依存関係の変更:zasm_%.h: mkasmh.sh proc.c defs.h
がzasm_%.h: mkasmh.sh proc.c $(HFILES)
に変更されました。- これにより、
zasm_%.h
の生成が、Makefile.auto
で定義されたすべてのHFILES
に依存するようになりました。これは、ヘッダーファイルの依存関係をより包括的に管理するための変更です。
-
ヘッダーファイルのコピー規則の追加:
arch_GOARCH.h: arch_$(GOARCH).h
defs_GOOS_GOARCH.h: defs_$(GOOS)_$(GOARCH).h
os_GOOS.h: os_$(GOOS).h
signals_GOOS.h: signals_$(GOOS).h
zasm_GOOS_GOARCH.h: zasm_$(GOOS)_$(GOARCH).h
- これらの規則は、OSやアーキテクチャ固有のヘッダーファイルを、一般的な名前のヘッダーファイルにコピーする役割を担っています。これにより、ビルドプロセスが特定の環境に依存することなく、汎用的なヘッダーファイル名で参照できるようになります。
これらの変更は全体として、GoランタイムのビルドプロセスをMakefile.auto
に集約し、Makefile
の役割を簡素化することで、ビルドシステムの複雑性を軽減し、循環依存性の問題を解消しようとする意図が見られます。
コアとなるコードの変更箇所
diff --git a/src/pkg/runtime/Makefile b/src/pkg/runtime/Makefile
index 75443324da..4d81def5a8 100644
--- a/src/pkg/runtime/Makefile
+++ b/src/pkg/runtime/Makefile
@@ -4,6 +4,8 @@
include ../../Make.inc
+x:=$(shell gomake -f Makefile.auto)
+
TARG=runtime
GOFILES=\
@@ -106,7 +108,6 @@ AUTOHFILES=\
\tos_GOOS.h\\\
\tsignals_GOOS.h\\\
\tdefs_GOOS_GOARCH.h\\\
-\tzasm_GOOS_GOARCH.h\\\
HFILES=\
\tcgocall.h\\\
@@ -114,7 +115,6 @@ HFILES=\
\thashmap.h\\\
\tmalloc.h\\\
\tstack.h\\\
-\tasm_$(GOARCH).h\\\
\t$(AUTOHFILES)\\\
GOFILES+=$(GOFILES_$(GOOS))\
@@ -155,3 +155,5 @@ signals_GOOS.h: signals_$(GOOS).h
zasm_GOOS_GOARCH.h: zasm_$(GOOS)_$(GOARCH).h
\tcp $^ $@
+\
+%.$(O): zasm_GOOS_GOARCH.h
diff --git a/src/pkg/runtime/Makefile.auto b/src/pkg/runtime/Makefile.auto
index b3b31c8cca..7c9ceb0fa7 100644
--- a/src/pkg/runtime/Makefile.auto
+++ b/src/pkg/runtime/Makefile.auto
@@ -2,6 +2,8 @@
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.
+include ../../Make.inc
+
GOARCHES=\
\t386\\\
\tamd64\\\
@@ -48,6 +50,13 @@ AUTO=\
\tzsyscall_windows_amd64.c\\\
\tzversion.go\\\
+HFILES=\
+\tarch_GOARCH.h\\\
+\tos_GOOS.h\\\
+\tsignals_GOOS.h\\\
+\tdefs_GOOS_GOARCH.h\\\
+\tzasm_GOOS_GOARCH.h\\\
+\
all: auto
auto: $(AUTO)\
@@ -86,9 +95,24 @@ zruntime_defs_%.go: proc.c iface.c hashmap.c chan.c $(HFILES) mkgodefs.sh
\tmv -f $@.tmp $@
# struct field offsets #defined for assembly
-zasm_%.h: mkasmh.sh proc.c defs.h
+zasm_%.h: mkasmh.sh proc.c $(HFILES)
\t./mkasmh.sh $* >$@.tmp
\tmv -f $@.tmp $@
clean:\
\trm -f goc2c mkversion $(AUTO)\
+\
+arch_GOARCH.h: arch_$(GOARCH).h
+\tcp $^ $@
+\
+defs_GOOS_GOARCH.h: defs_$(GOOS)_$(GOARCH).h
+\tcp $^ $@
+\
+os_GOOS.h: os_$(GOOS).h
+\tcp $^ $@
+\
+signals_GOOS.h: signals_$(GOOS).h
+\tcp $^ $@
+\
+zasm_GOOS_GOARCH.h: zasm_$(GOOS)_$(GOARCH).h
+\tcp $^ $@
コアとなるコードの解説
src/pkg/runtime/Makefile
x:=$(shell gomake -f Makefile.auto)
: この行は、Makefile
が実行される際に、Makefile.auto
をgomake
で実行することを強制します。これにより、Makefile.auto
で定義されたビルドステップが、メインのビルドプロセスの一部として組み込まれます。これは、ビルドの制御をMakefile.auto
に委譲し、Makefile
の役割を簡素化する重要なステップです。AUTOHFILES
とHFILES
からのヘッダーファイル削除:zasm_GOOS_GOARCH.h
とasm_$(GOARCH).h
がこれらのリストから削除されました。これは、これらのヘッダーファイルの生成と依存関係の管理がMakefile.auto
に移管されたためです。%.$(O): zasm_GOOS_GOARCH.h
: この新しい規則は、すべてのオブジェクトファイル(.o
または.obj
)がzasm_GOOS_GOARCH.h
に依存することを宣言しています。これは、アセンブリコードのビルドに必要な定義がこのヘッダーファイルに含まれているためです。
src/pkg/runtime/Makefile.auto
include ../../Make.inc
:Makefile.auto
も共通のビルド設定をインクルードするようになり、ビルドシステム全体の一貫性が向上しました。HFILES
変数の定義:Makefile.auto
内で、ランタイムビルドに必要なすべてのヘッダーファイル(arch_GOARCH.h
,os_GOOS.h
,signals_GOOS.h
,defs_GOOS_GOARCH.h
,zasm_GOOS_GOARCH.h
)がHFILES
として明示的に定義されました。これにより、これらのファイルの生成と依存関係がMakefile.auto
によって一元的に管理されるようになります。zasm_%.h
ターゲットの依存関係の変更:zasm_%.h
の生成が、defs.h
だけでなく、Makefile.auto
で定義されたすべての$(HFILES)
に依存するようになりました。これは、アセンブリヘッダーの生成に必要なすべての依存関係を網羅するための変更です。- ヘッダーファイルのコピー規則の追加:
arch_GOARCH.h
,defs_GOOS_GOARCH.h
,os_GOOS.h
,signals_GOOS.h
,zasm_GOOS_GOARCH.h
といった汎用的なヘッダーファイル名が、それぞれOSやアーキテクチャ固有のファイルからコピーされる規則が追加されました。これにより、ビルドプロセスは特定の環境に依存せず、一貫したヘッダーファイル名で参照できるようになり、ビルドの柔軟性と移植性が向上します。
これらの変更は、Goランタイムのビルドプロセスをよりモジュール化し、Makefile.auto
にヘッダーファイルの生成と依存関係の管理を集約することで、従来のMakefile
が抱えていた複雑性や循環依存性の問題を解消しようとするものです。
関連リンク
- Go Change-Id: https://golang.org/cl/5496058
参考にした情報源リンク
make
コマンドとMakefile
の一般的なドキュメント- Go言語の初期のビルドシステムに関する議論やドキュメント(当時の情報源は現在アクセスできない可能性がありますが、一般的な知識として参照しました)
- 循環依存性に関する一般的なソフトウェアエンジニアリングの概念
- Go言語のソースコードリポジトリ(変更履歴とファイル構造の確認)
gomake
に関する情報(Goプロジェクトの文脈での使用法)
[インデックス 10851] ファイルの概要
このコミットは、Go言語のランタイムビルドシステムにおける問題を修正し、特に複数のビルドシステムを同時にサポートすることから脱却しようとする試みの一環です。Makefile
とMakefile.auto
という2つのビルド関連ファイルが変更され、ビルドプロセスの簡素化と循環依存性の解消が図られています。
コミット
commit cfd17a1b57adb6f1602f6a635af7f50be688ed10
Author: Russ Cox <rsc@golang.org>
Date: Fri Dec 16 17:58:53 2011 -0500
runtime: fix build
I am looking forward to not supporting two build
systems simultaneously. Make complains about
a circular dependency still, but I don't understand it
and it's probably not worth the time to figure out.
TBR=r
CC=golang-dev
https://golang.org/cl/5496058
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/cfd17a1b57adb6f1602f6a635af7f50be688ed10
元コミット内容
runtime: fix build
I am looking forward to not supporting two build
systems simultaneously. Make complains about
a circular dependency still, but I don't understand it
and it's probably not worth the time to figure out.
TBR=r
CC=golang-dev
https://golang.org/cl/5496058
変更の背景
このコミットが行われた2011年当時、Go言語のビルドシステムは過渡期にありました。従来のMakefile
ベースのビルドシステムと、Go自身のツールチェイン(go tool
コマンド群)を利用した新しいビルドシステムが混在しており、その両方をサポートすることによる複雑さや問題が発生していました。コミットメッセージにある「not supporting two build systems simultaneously」(2つのビルドシステムを同時にサポートしないこと)という記述は、この状況を解消し、ビルドプロセスを一本化したいという意図を明確に示しています。
また、Makefile
が「circular dependency」(循環依存性)について不満を述べている、という記述から、ビルドターゲット間の依存関係が複雑になり、無限ループやビルドエラーを引き起こす可能性のある問題が存在していたことが伺えます。このコミットは、これらの問題を解決し、Goランタイムのビルドを安定させることを目的としています。
前提知識の解説
Makefileとビルドシステム
Makefile
は、プログラムのコンパイルやリンクなどのビルドプロセスを自動化するためのファイルです。make
コマンドによって解釈され、ファイル間の依存関係を定義し、必要なコマンドを実行してターゲットを生成します。大規模なプロジェクトでは、複数のMakefile
が存在したり、自動生成されるMakefile
(例: Makefile.auto
)が使われたりすることがあります。
循環依存性 (Circular Dependency)
ビルドシステムにおける循環依存性とは、AがBに依存し、BがAに依存するといったように、ビルドターゲットやファイルが互いに依存し合う状態を指します。これはビルドプロセスの無限ループや、どのターゲットからビルドを開始すべきか判断できないといった問題を引き起こし、ビルドエラーの原因となります。
Go言語のビルドシステム (2011年頃)
Go言語は、その初期から独自のツールチェイン(go build
, go install
など)を持つことを目指していました。しかし、プロジェクトの初期段階では、C言語で書かれた部分(ランタイムなど)のビルドには従来のmake
が使われていました。このコミットが行われた時期は、Go自身のツールチェインが成熟しつつあり、make
への依存を減らしていく過渡期にあたります。
gomake
コミットメッセージや変更内容から推測すると、gomake
はGoプロジェクト内で使用される、make
コマンドのラッパーまたはGo言語に特化したmake
の代替のようなツールであると考えられます。これは、GoのビルドプロセスをよりGoらしく、かつ効率的に制御するために導入された可能性があります。
技術的詳細
このコミットの主要な変更点は、src/pkg/runtime/Makefile
とsrc/pkg/runtime/Makefile.auto
の2つのファイルにあります。
src/pkg/runtime/Makefile
の変更
-
x:=$(shell gomake -f Makefile.auto)
の追加:- これは、
Makefile
の冒頭に新しい行として追加されています。 $(shell ...)
は、シェルコマンドを実行し、その出力を変数に代入するmake
の機能です。gomake -f Makefile.auto
は、Makefile.auto
をgomake
で実行することを意味します。- この行の追加により、メインの
Makefile
がMakefile.auto
のビルドプロセスをトリガーするようになりました。これは、ビルドの制御をMakefile.auto
に委譲し、Makefile
とMakefile.auto
間の依存関係を明確にする(または、Makefile.auto
をメインのビルドフローに統合する)ための重要な変更です。これにより、従来のMakefile
が抱えていた循環依存性の問題の一部を解消しようとしている可能性があります。
- これは、
-
ヘッダーファイルの依存関係の削除:
AUTOHFILES
からzasm_GOOS_GOARCH.h
が削除されました。HFILES
からasm_$(GOARCH).h
が削除されました。- これらのヘッダーファイルは、Goランタイムのアセンブリコードに関連するもので、OSやアーキテクチャ固有の定義を含んでいます。これらの依存関係が
Makefile
から削除されたのは、おそらくMakefile.auto
がこれらのファイルの生成と依存関係をより適切に管理するようになったためと考えられます。
-
%.$O: zasm_GOOS_GOARCH.h
の追加:- これは、
zasm_GOOS_GOARCH.h
がオブジェクトファイル(.$O
)の依存関係として追加されたことを示しています。これは、zasm_GOOS_GOARCH.h
がオブジェクトファイルのビルドに必要であることを明示しています。
- これは、
src/pkg/runtime/Makefile.auto
の変更
-
include ../../Make.inc
の追加:Makefile.auto
もMake.inc
をインクルードするようになりました。これにより、共通のビルド設定や変数がMakefile.auto
でも利用可能になり、ビルドシステム全体の一貫性が向上します。
-
HFILES
変数の定義と追加:Makefile.auto
内でHFILES
変数が定義され、arch_GOARCH.h
,os_GOOS.h
,signals_GOOS.h
,defs_GOOS_GOARCH.h
,zasm_GOOS_GOARCH.h
といったヘッダーファイルが含まれるようになりました。- これは、
Makefile.auto
がこれらのヘッダーファイルの生成と管理の責任を負うことを明確にしています。
-
zasm_%.h
ターゲットの依存関係の変更:zasm_%.h: mkasmh.sh proc.c defs.h
がzasm_%.h: mkasmh.sh proc.c $(HFILES)
に変更されました。- これにより、
zasm_%.h
の生成が、Makefile.auto
で定義されたすべてのHFILES
に依存するようになりました。これは、ヘッダーファイルの依存関係をより包括的に管理するための変更です。
-
ヘッダーファイルのコピー規則の追加:
arch_GOARCH.h: arch_$(GOARCH).h
defs_GOOS_GOARCH.h: defs_$(GOOS)_$(GOARCH).h
os_GOOS.h: os_$(GOOS).h
signals_GOOS.h: signals_$(GOOS).h
zasm_GOOS_GOARCH.h: zasm_$(GOOS)_$(GOARCH).h
- これらの規則は、OSやアーキテクチャ固有のヘッダーファイルを、一般的な名前のヘッダーファイルにコピーする役割を担っています。これにより、ビルドプロセスが特定の環境に依存することなく、汎用的なヘッダーファイル名で参照できるようになります。
これらの変更は全体として、GoランタイムのビルドプロセスをMakefile.auto
に集約し、Makefile
の役割を簡素化することで、ビルドシステムの複雑性を軽減し、循環依存性の問題を解消しようとする意図が見られます。
コアとなるコードの変更箇所
diff --git a/src/pkg/runtime/Makefile b/src/pkg/runtime/Makefile
index 75443324da..4d81def5a8 100644
--- a/src/pkg/runtime/Makefile
+++ b/src/pkg/runtime/Makefile
@@ -4,6 +4,8 @@
include ../../Make.inc
+x:=$(shell gomake -f Makefile.auto)
+
TARG=runtime
GOFILES=\
@@ -106,7 +108,6 @@ AUTOHFILES=\
\tos_GOOS.h\\\
\tsignals_GOOS.h\\\
\tdefs_GOOS_GOARCH.h\\\
-\tzasm_GOOS_GOARCH.h\\\
HFILES=\
\tcgocall.h\\\
@@ -114,7 +115,6 @@ HFILES=\
\thashmap.h\\\
\tmalloc.h\\\
\tstack.h\\\
-\tasm_$(GOARCH).h\\\
\t$(AUTOHFILES)\\\
GOFILES+=$(GOFILES_$(GOOS))\
@@ -155,3 +155,5 @@ signals_GOOS.h: signals_GOOS.h
zasm_GOOS_GOARCH.h: zasm_$(GOOS)_$(GOARCH).h
\tcp $^ $@
+\
+%.$(O): zasm_GOOS_GOARCH.h
diff --git a/src/pkg/runtime/Makefile.auto b/src/pkg/runtime/Makefile.auto
index b3b31c8cca..7c9ceb0fa7 100644
--- a/src/pkg/runtime/Makefile.auto
+++ b/src/pkg/runtime/Makefile.auto
@@ -2,6 +2,8 @@
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.
+include ../../Make.inc
+
GOARCHES=\
\t386\\\
\tamd64\\\
@@ -48,6 +50,13 @@ AUTO=\
\tzsyscall_windows_amd64.c\\\
\tzversion.go\\\
+HFILES=\
+\tarch_GOARCH.h\\\
+\tos_GOOS.h\\\
+\tsignals_GOOS.h\\\
+\tdefs_GOOS_GOARCH.h\\\
+\tzasm_GOOS_GOARCH.h\\\
+\
all: auto
auto: $(AUTO)\
@@ -86,9 +95,24 @@ zruntime_defs_%.go: proc.c iface.c hashmap.c chan.c $(HFILES) mkgodefs.sh
\tmv -f $@.tmp $@
# struct field offsets #defined for assembly
-zasm_%.h: mkasmh.sh proc.c defs.h
+zasm_%.h: mkasmh.sh proc.c $(HFILES)
\t./mkasmh.sh $* >$@.tmp
\tmv -f $@.tmp $@
clean:\
\trm -f goc2c mkversion $(AUTO)\
+\
+arch_GOARCH.h: arch_$(GOARCH).h
+\tcp $^ $@
+\
+defs_GOOS_GOARCH.h: defs_$(GOOS)_$(GOARCH).h
+\tcp $^ $@
+\
+os_GOOS.h: os_$(GOOS).h
+\tcp $^ $@
+\
+signals_GOOS.h: signals_$(GOOS).h
+\tcp $^ $@
+\
+zasm_GOOS_GOARCH.h: zasm_$(GOOS)_$(GOARCH).h
+\tcp $^ $@
コアとなるコードの解説
src/pkg/runtime/Makefile
x:=$(shell gomake -f Makefile.auto)
: この行は、Makefile
が実行される際に、Makefile.auto
をgomake
で実行することを強制します。これにより、Makefile.auto
で定義されたビルドステップが、メインのビルドプロセスの一部として組み込まれます。これは、ビルドの制御をMakefile.auto
に委譲し、Makefile
の役割を簡素化する重要なステップです。AUTOHFILES
とHFILES
からのヘッダーファイル削除:zasm_GOOS_GOARCH.h
とasm_$(GOARCH).h
がこれらのリストから削除されました。これは、これらのヘッダーファイルの生成と依存関係の管理がMakefile.auto
に移管されたためです。%.$(O): zasm_GOOS_GOARCH.h
: この新しい規則は、すべてのオブジェクトファイル(.o
または.obj
)がzasm_GOOS_GOARCH.h
に依存することを宣言しています。これは、アセンブリコードのビルドに必要な定義がこのヘッダーファイルに含まれているためです。
src/pkg/runtime/Makefile.auto
include ../../Make.inc
:Makefile.auto
も共通のビルド設定をインクルードするようになり、ビルドシステム全体の一貫性が向上しました。HFILES
変数の定義:Makefile.auto
内で、ランタイムビルドに必要なすべてのヘッダーファイル(arch_GOARCH.h
,os_GOOS.h
,signals_GOOS.h
,defs_GOOS_GOARCH.h
,zasm_GOOS_GOARCH.h
)がHFILES
として明示的に定義されました。これにより、これらのファイルの生成と依存関係がMakefile.auto
によって一元的に管理されるようになります。zasm_%.h
ターゲットの依存関係の変更:zasm_%.h
の生成が、defs.h
だけでなく、Makefile.auto
で定義されたすべての$(HFILES)
に依存するようになりました。これは、アセンブリヘッダーの生成に必要なすべての依存関係を網羅するための変更です。- ヘッダーファイルのコピー規則の追加:
arch_GOARCH.h
,defs_GOOS_GOARCH.h
,os_GOOS.h
,signals_GOOS.h
,zasm_GOOS_GOARCH.h
といった汎用的なヘッダーファイル名が、それぞれOSやアーキテクチャ固有のファイルからコピーされる規則が追加されました。これにより、ビルドプロセスは特定の環境に依存せず、一貫したヘッダーファイル名で参照できるようになり、ビルドの柔軟性と移植性が向上します。
これらの変更は、Goランタイムのビルドプロセスをよりモジュール化し、Makefile.auto
にヘッダーファイルの生成と依存関係の管理を集約することで、従来のMakefile
が抱えていた複雑性や循環依存性の問題を解消しようとするものです。
関連リンク
- Go Change-Id: https://golang.org/cl/5496058
参考にした情報源リンク
make
コマンドとMakefile
の一般的なドキュメント- Go言語の初期のビルドシステムに関する議論やドキュメント(当時の情報源は現在アクセスできない可能性がありますが、一般的な知識として参照しました)
- 循環依存性に関する一般的なソフトウェアエンジニアリングの概念
- Go言語のソースコードリポジトリ(変更履歴とファイル構造の確認)
gomake
に関する情報(Goプロジェクトの文脈での使用法)