[インデックス 12442] ファイルの概要
このコミットは、Go言語プロジェクトのビルドシステムにおける重要な移行の一環として、Make.inc
や Make.pkg
といった従来の make
ベースのビルド設定ファイルへの参照を削除することを目的としています。これは、Go言語が自身の go
コマンド(go build
など)を主要なビルドツールとして確立していく過程でのクリーンアップ作業です。
コミット
commit 905cb4881b9604d2f69c2c5bc9c5c5e44d6ea3d9
Author: Rob Pike <r@golang.org>
Date: Wed Mar 7 13:51:49 2012 +1100
all: remove some references to Make.inc etc.
There are a few more but these are the easiest ones.
R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/5756067
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/905cb4881b9604d2f69c2c5bc9c5c5e44d6ea3d9
元コミット内容
このコミットは、Goプロジェクト全体から Make.inc
などへの参照をいくつか削除するものです。コミットメッセージには「まだいくつか残っているが、これらは最も簡単なものだ」とあり、これはビルドシステムの移行が段階的に行われていることを示唆しています。
変更の背景
Go言語の初期のビルドシステムは、Unix系のプロジェクトで一般的な make
ユーティリティと、Goプロジェクト固有の Make.inc
や Make.pkg
といったインクルードファイルに大きく依存していました。これらのファイルは、コンパイラやリンカのパス、ビルドフラグ、パッケージの依存関係などを定義していました。
しかし、Go言語の設計思想の一つに「シンプルさ」と「自己完結性」があります。外部ツールへの依存を減らし、Go言語自身が提供するツールチェーンで完結することを目指していました。その結果、go build
や go install
といった go
コマンドが開発され、Goプロジェクトのビルド、テスト、インストール、フォーマットなどを一元的に管理できるようになりました。
このコミットは、まさにその移行期に行われたもので、従来の make
ベースのビルドシステムから go
コマンドへの完全な移行を進めるためのクリーンアップ作業の一環です。不要になった Make.inc
などへの参照をコードベースから削除することで、ビルドシステムの複雑性を軽減し、go
コマンドによるビルドプロセスをより明確にすることを目的としています。
前提知識の解説
make
と Makefile
make
は、プログラムのコンパイルやその他のタスクを自動化するためのユーティリティです。Makefile
というファイルに、ターゲット(生成されるファイル)と、それを生成するために必要な依存関係、そして実行するコマンドを記述します。Go言語の初期には、Goプログラムのビルドもこの make
を使って行われていました。
Make.inc
と Make.pkg
これらはGoプロジェクト内で使われていた、Makefile
からインクルードされる共通の定義ファイルです。
Make.inc
: Goのビルド環境に関する共通設定(例:GOROOT
、コンパイラやリンカのパス、共通フラグなど)を定義していました。Make.pkg
: Goパッケージをビルドするための共通ルールを定義していました。
これらのファイルを使うことで、各パッケージの Makefile
は簡潔に記述できましたが、make
ユーティリティへの依存と、Go独自のビルドロジックが Makefile
に分散するという問題がありました。
go command
(go build
, go install
など)
Go言語のバージョン1から導入された、Goプロジェクトを管理するための公式ツールです。
go build
: ソースコードをコンパイルして実行可能ファイルを生成します。依存関係の解決やコンパイルオプションの決定を自動的に行います。go install
: パッケージをコンパイルし、実行可能ファイルを$GOPATH/bin
または$GOBIN
に、ライブラリを$GOPATH/pkg
にインストールします。
go command
は、Goのモジュールシステムと密接に連携し、Goプロジェクトのビルドプロセスを劇的に簡素化しました。これにより、開発者は Makefile
の詳細を気にすることなく、Go言語のコードに集中できるようになりました。
cgo
cgo
は、GoプログラムからC言語のコードを呼び出すためのツールです。Goのソースファイル内にCのコードを記述し、cgo
がそれをGoとCの間のバインディングコードに変換します。cgo
を使用するプロジェクトも、Goのビルドシステムの一部として扱われます。
技術的詳細
このコミットの技術的な詳細は、主にGoのビルドシステムが make
ベースから go command
ベースへと移行する過程で、古い参照を削除している点にあります。
具体的には、以下のファイルが変更されています。
-
src/cmd/cgo/doc.go
:- 変更前: 「
cgo
を使用するプロセスは、Make.pkg
の標準パッケージmakefile
ルールによって自動化される」と記述されていました。 - 変更後: 「
cgo
を使用するプロセスは、go command
の標準パッケージ構築ルールによって自動化される」と修正されています。 - これは、
cgo
のビルドがmake
ではなくgo command
によって管理されるようになったことをドキュメントレベルで明確にしています。
- 変更前: 「
-
src/cmd/cgo/main.go
:- 変更前:
cgo -dynimport
の機能説明で、「Make.pkg
のルールが適切な実行可能ファイルを準備する」と記述されていました。 - 変更後: 「
'go build'
のルールが適切な実行可能ファイルを準備する」と修正されています。 - これも
doc.go
と同様に、ビルドの主体がMake.pkg
からgo build
へと移行したことをコード内のコメントで示しています。
- 変更前:
-
src/lib9/utf/Makefile
:- この
Makefile
はmkrunetype
というユーティリティをビルドするためのものです。 - 変更前:
include ../../Make.inc
とinclude ../../Make.ccmd
が含まれていました。これらはGoの共通ビルド設定やCコマンドのビルドルールをインクルードするためのものでした。 - 変更後: これらの
include
行が削除されています。代わりに、GOROOT
,GOOS
,GOARCH
が明示的に設定される必要がある旨のコメントが追加され、mkrunetype
のビルドコマンドが直接cc
(Cコンパイラ) を呼び出す形に変更されています。また、clean
ターゲットも追加されています。 - これは、この特定のユーティリティのビルドが、Goの共通
Makefile
システムから独立し、よりシンプルなCコンパイルコマンドに移行したことを示しています。
- この
-
test/bench/garbage/Makefile
:- この
Makefile
はベンチマークテスト用のプログラムをビルドするためのものです。 - 変更前:
include ../../../src/Make.inc
が含まれており、Goプログラムのビルドに$(GC)
(Goコンパイラ) や$(LD)
(Goリンカ) といったMake.inc
で定義された変数を使用していました。 - 変更後:
Make.inc
のインクルードが削除され、Goプログラムのビルドに直接go build
コマンドを使用するように変更されています。例えば、%.out: %.$O
のようなGoコンパイラとリンカを直接呼び出すルールが削除され、%: %.go
のようにgo build
を使うシンプルなルールに置き換えられています。 - これは、ベンチマークプログラムのビルドも
go command
に一本化されたことを示しています。
- この
-
test/bench/go1/Makefile
:- この
Makefile
もベンチマークテスト用のものです。 - 変更前:
include $(GOROOT)/src/Make.inc
とinclude $(GOROOT)/src/Make.pkg
が含まれていました。 - 変更後: これらの
include
行が完全に削除されています。 - このファイルは元々
test
ターゲットしか持っておらず、Goプログラムのビルド自体は行っていなかったため、これらのインクルードは不要と判断されたようです。
- この
これらの変更は、Goプロジェクト全体で make
ベースのビルドシステムへの依存を減らし、go command
を中心とした現代的なGoのビルドプロセスへの移行を推進する明確な意図を示しています。
コアとなるコードの変更箇所
src/cmd/cgo/doc.go
--- a/src/cmd/cgo/doc.go
+++ b/src/cmd/cgo/doc.go
@@ -111,9 +111,9 @@ Not all Go types can be mapped to C types in a useful way.
Cgo transforms the input file into four output files: two Go source
files, a C file for 6c (or 8c or 5c), and a C file for gcc.
-The standard package makefile rules in Make.pkg automate the
-process of using cgo. See $GOROOT/misc/cgo/stdio and
-$GOROOT/misc/cgo/gmp for examples.
+The standard package construction rules of the go command
+automate the process of using cgo. See $GOROOT/misc/cgo/stdio
+and $GOROOT/misc/cgo/gmp for examples.
src/cmd/cgo/main.go
--- a/src/cmd/cgo/main.go
+++ b/src/cmd/cgo/main.go
@@ -147,7 +147,7 @@ func main() {
// cgo -dynimport is essentially a separate helper command
// built into the cgo binary. It scans a gcc-produced executable
// and dumps information about the imported symbols and the
- // imported libraries. The Make.pkg rules for cgo prepare an
+ // imported libraries. The 'go build' rules for cgo prepare an
// appropriate executable and then use its import information
// instead of needing to make the linkers duplicate all the
// specialized knowledge gcc has about where to look for imported
src/lib9/utf/Makefile
--- a/src/lib9/utf/Makefile
+++ b/src/lib9/utf/Makefile
@@ -4,21 +4,17 @@
# The library is built by the Makefile in the parent directory.
# This Makefile only builds mkrunetype.
-\
-include ../../Make.inc
-O:=$(HOST_O)
+# GOROOT, GOOS, and GOARCH must be set explicitly.
TARG=mkrunetype
-OFILES=\
-\tmkrunetype.$O\
-\
-include ../../Make.ccmd
-\
UnicodeData-%.txt:
curl http://www.unicode.org/Public/$*/ucd/UnicodeData.txt >_$@
mv _$@ $@
+mkrunetype: mkrunetype.c
+ cc -I../../../include -o mkrunetype -L$(GOROOT)/pkg/obj/$(GOOS)_$(GOARCH)/ mkrunetype.c -l9
+
runetypebody-%.c: mkrunetype UnicodeData-%.txt
mkrunetype -p UnicodeData-$*.txt >_$@
mv _$@ $@
@@ -30,3 +26,5 @@ UNICODE_VERSION=6.0.0
test: mkrunetype UnicodeData-$(UNICODE_VERSION).txt
mkrunetype -c UnicodeData-$(UNICODE_VERSION).txt
+clean:
+ rm -f UnicodeData.txt mkrunetype
\ No newline at end of file
test/bench/garbage/Makefile
--- a/test/bench/garbage/Makefile
+++ b/test/bench/garbage/Makefile
@@ -2,27 +2,22 @@
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.\
\
-include ../../../src/Make.inc
-\
ALL=\
parser\
peano\
tree\
tree2\
\
-all: $(addsuffix .out, $(ALL))\
-\
-%.$O: %.go stats.go\
-\t$(GC) $(GCFLAGS) $(GCIMPORTS) $*.go stats.go\
+all: $(ALL)\
\
-%.out: %.$O\
-\t$(LD) -o $@ $*.$O\
+%: %.go\
+\tgo build $*.go stats.go\
\
-%.bench: %.out\
-\ttime ./$*.out\
+%.bench: %\
+\ttime ./$*\
\
bench: $(addsuffix .bench, $(ALL))\
\
clean:\
-\trm -f *.[$(OS)] $(addsuffix .out, $(ALL))\
+\trm -f $(ALL)\
test/bench/go1/Makefile
--- a/test/bench/go1/Makefile
+++ b/test/bench/go1/Makefile
@@ -1,10 +1,5 @@
-include $(GOROOT)/src/Make.inc
\
TARG=go1
-GOFILES=\
-\tdummy.go\\\
-\
-include $(GOROOT)/src/Make.pkg
\
test:\
\techo go1: tests disabled for now TODO
コアとなるコードの解説
このコミットのコアとなる変更は、Goプロジェクトのビルドシステムが make
ベースから go command
ベースへと移行していることを反映しています。
-
ドキュメントとコメントの更新 (
src/cmd/cgo/doc.go
,src/cmd/cgo/main.go
):- これらの変更は、
cgo
のビルドプロセスがMake.pkg
のルールではなく、go command
のルールによって管理されるようになったことを明示しています。これは、Goのビルドシステムがgo command
を中心に再構築されたことを示す重要なシグナルです。開発者がcgo
を使う際に、もはやMakefile
の詳細を意識する必要がなく、go build
を使うだけで良いというメッセージを伝えています。
- これらの変更は、
-
Makefile
からのMake.inc
/Make.pkg
参照の削除 (src/lib9/utf/Makefile
,test/bench/garbage/Makefile
,test/bench/go1/Makefile
):- これは最も直接的な変更であり、従来の
make
ベースのビルドシステムへの依存を断ち切るものです。 src/lib9/utf/Makefile
では、Make.inc
とMake.ccmd
のインクルードが削除され、mkrunetype
のビルドが直接cc
コマンドを呼び出す形に変更されました。これは、このC言語ユーティリティのビルドがGoのビルドシステムから独立し、標準的なCコンパイルプロセスに回帰したことを意味します。また、clean
ターゲットの追加は、このMakefile
が自己完結的にクリーンアップを行えるようにするためのものです。test/bench/garbage/Makefile
では、Make.inc
のインクルードが削除され、Goプログラムのビルドがgo build
コマンドに置き換えられました。これにより、ベンチマークプログラムのビルドもGoの標準的なビルドプロセスに統合され、make
の複雑なルールを維持する必要がなくなりました。test/bench/go1/Makefile
からもMake.inc
とMake.pkg
のインクルードが削除されました。このMakefile
は元々Goプログラムを直接ビルドする役割を持っていなかったため、これらのインクルードは冗長であり、削除することでコードベースがクリーンになりました。
- これは最も直接的な変更であり、従来の
これらの変更は、Go言語がそのツールチェーンを成熟させ、外部のビルドツールへの依存を減らし、Go言語自身が提供する go command
を中心としたシンプルで効率的なビルドエコシステムを確立していく過程における、具体的なステップを示しています。
関連リンク
- Go CL 5756067: https://golang.org/cl/5756067
参考にした情報源リンク
- Go言語の公式ドキュメント (go commandについて): https://go.dev/doc/
- Go言語の初期のビルドシステムに関する議論や歴史的資料 (GitHubリポジトリのコミット履歴やメーリングリストなど)
make
ユーティリティに関する一般的な情報: https://www.gnu.org/software/make/manual/cgo
のドキュメント: https://go.dev/blog/cgo