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

[インデックス 12442] ファイルの概要

このコミットは、Go言語プロジェクトのビルドシステムにおける重要な移行の一環として、Make.incMake.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.incMake.pkg といったインクルードファイルに大きく依存していました。これらのファイルは、コンパイラやリンカのパス、ビルドフラグ、パッケージの依存関係などを定義していました。

しかし、Go言語の設計思想の一つに「シンプルさ」と「自己完結性」があります。外部ツールへの依存を減らし、Go言語自身が提供するツールチェーンで完結することを目指していました。その結果、go buildgo install といった go コマンドが開発され、Goプロジェクトのビルド、テスト、インストール、フォーマットなどを一元的に管理できるようになりました。

このコミットは、まさにその移行期に行われたもので、従来の make ベースのビルドシステムから go コマンドへの完全な移行を進めるためのクリーンアップ作業の一環です。不要になった Make.inc などへの参照をコードベースから削除することで、ビルドシステムの複雑性を軽減し、go コマンドによるビルドプロセスをより明確にすることを目的としています。

前提知識の解説

makeMakefile

make は、プログラムのコンパイルやその他のタスクを自動化するためのユーティリティです。Makefile というファイルに、ターゲット(生成されるファイル)と、それを生成するために必要な依存関係、そして実行するコマンドを記述します。Go言語の初期には、Goプログラムのビルドもこの make を使って行われていました。

Make.incMake.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 ベースへと移行する過程で、古い参照を削除している点にあります。

具体的には、以下のファイルが変更されています。

  1. src/cmd/cgo/doc.go:

    • 変更前: 「cgo を使用するプロセスは、Make.pkg の標準パッケージ makefile ルールによって自動化される」と記述されていました。
    • 変更後: 「cgo を使用するプロセスは、go command の標準パッケージ構築ルールによって自動化される」と修正されています。
    • これは、cgo のビルドが make ではなく go command によって管理されるようになったことをドキュメントレベルで明確にしています。
  2. src/cmd/cgo/main.go:

    • 変更前: cgo -dynimport の機能説明で、「Make.pkg のルールが適切な実行可能ファイルを準備する」と記述されていました。
    • 変更後: 「'go build' のルールが適切な実行可能ファイルを準備する」と修正されています。
    • これも doc.go と同様に、ビルドの主体が Make.pkg から go build へと移行したことをコード内のコメントで示しています。
  3. src/lib9/utf/Makefile:

    • この Makefilemkrunetype というユーティリティをビルドするためのものです。
    • 変更前: include ../../Make.incinclude ../../Make.ccmd が含まれていました。これらはGoの共通ビルド設定やCコマンドのビルドルールをインクルードするためのものでした。
    • 変更後: これらの include 行が削除されています。代わりに、GOROOT, GOOS, GOARCH が明示的に設定される必要がある旨のコメントが追加され、mkrunetype のビルドコマンドが直接 cc (Cコンパイラ) を呼び出す形に変更されています。また、clean ターゲットも追加されています。
    • これは、この特定のユーティリティのビルドが、Goの共通 Makefile システムから独立し、よりシンプルなCコンパイルコマンドに移行したことを示しています。
  4. 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 に一本化されたことを示しています。
  5. test/bench/go1/Makefile:

    • この Makefile もベンチマークテスト用のものです。
    • 変更前: include $(GOROOT)/src/Make.incinclude $(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 ベースへと移行していることを反映しています。

  1. ドキュメントとコメントの更新 (src/cmd/cgo/doc.go, src/cmd/cgo/main.go):

    • これらの変更は、cgo のビルドプロセスが Make.pkg のルールではなく、go command のルールによって管理されるようになったことを明示しています。これは、Goのビルドシステムが go command を中心に再構築されたことを示す重要なシグナルです。開発者が cgo を使う際に、もはや Makefile の詳細を意識する必要がなく、go build を使うだけで良いというメッセージを伝えています。
  2. Makefile からの Make.inc/Make.pkg 参照の削除 (src/lib9/utf/Makefile, test/bench/garbage/Makefile, test/bench/go1/Makefile):

    • これは最も直接的な変更であり、従来の make ベースのビルドシステムへの依存を断ち切るものです。
    • src/lib9/utf/Makefile では、Make.incMake.ccmd のインクルードが削除され、mkrunetype のビルドが直接 cc コマンドを呼び出す形に変更されました。これは、このC言語ユーティリティのビルドがGoのビルドシステムから独立し、標準的なCコンパイルプロセスに回帰したことを意味します。また、clean ターゲットの追加は、この Makefile が自己完結的にクリーンアップを行えるようにするためのものです。
    • test/bench/garbage/Makefile では、Make.inc のインクルードが削除され、Goプログラムのビルドが go build コマンドに置き換えられました。これにより、ベンチマークプログラムのビルドもGoの標準的なビルドプロセスに統合され、make の複雑なルールを維持する必要がなくなりました。
    • test/bench/go1/Makefile からも Make.incMake.pkg のインクルードが削除されました。この Makefile は元々Goプログラムを直接ビルドする役割を持っていなかったため、これらのインクルードは冗長であり、削除することでコードベースがクリーンになりました。

これらの変更は、Go言語がそのツールチェーンを成熟させ、外部のビルドツールへの依存を減らし、Go言語自身が提供する go command を中心としたシンプルで効率的なビルドエコシステムを確立していく過程における、具体的なステップを示しています。

関連リンク

参考にした情報源リンク