[インデックス 12445] ファイルの概要
このコミットは、Go言語のビルドシステムにおけるgo/build
パッケージからMakefile
を削除し、これまでMakefile
によって自動生成されていたsyslist.go
ファイルを直接手動で管理するように変更するものです。これにより、ビルドプロセスの依存関係が簡素化され、外部ツールであるmake
への依存が一つ削減されます。
コミット
commit 8f61631c74a46d148690cc84c21f0a0366895eed
Author: Rob Pike <r@golang.org>
Date: Wed Mar 7 14:10:49 2012 +1100
go/build: delete Makefile
We can write syslist.go by hand.
R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/5757057
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/8f61631c74a46d148690cc84c21f0a0366895eed
元コミット内容
diff --git a/src/pkg/go/build/Makefile b/src/pkg/go/build/Makefile
deleted file mode 100644
index 3bb3912cbb..0000000000
--- a/src/pkg/go/build/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-# Copyright 2009 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.\n-\n-syslist.go: ../../../Make.inc Makefile\n-\techo '// Generated automatically by make.' >$@\n-\techo >>$@\n-\techo 'package build' >>$@\n-\techo >>$@\n-\techo 'const goosList = "$(GOOS_LIST)"' >>$@\n-\techo 'const goarchList = "$(GOARCH_LIST)"' >>$@
diff --git a/src/pkg/go/build/syslist.go b/src/pkg/go/build/syslist.go
index 8a2db8fa33..ea21f3c74b 100644
--- a/src/pkg/go/build/syslist.go
+++ b/src/pkg/go/build/syslist.go
@@ -1,4 +1,6 @@
-// Generated automatically by make.
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
package build
変更の背景
この変更の主な背景は、Go言語のビルドプロセスを簡素化し、外部ツールへの依存を減らすことにあります。以前は、src/pkg/go/build/syslist.go
ファイルがMakefile
によって自動生成されていました。このMakefile
は、Goのビルド環境変数であるGOOS_LIST
とGOARCH_LIST
(それぞれサポートされているオペレーティングシステムとアーキテクチャのリスト)を読み込み、それらをGoの定数としてsyslist.go
に書き出す役割を担っていました。
しかし、このような単純なファイル生成のためにmake
のようなビルドツールを介在させることは、ビルドシステムの複雑性を増し、潜在的な問題を招く可能性がありました。例えば、make
がシステムにインストールされていない環境ではビルドが困難になる、あるいはMakefile
の構文や依存関係の管理が煩雑になる、といった点が挙げられます。
コミットメッセージにある「We can write syslist.go by hand.(syslist.goは手動で書ける)」という記述は、syslist.go
の内容が静的であり、頻繁に更新されるものではないため、自動生成の必要性が低いと判断されたことを示唆しています。手動で管理することで、ビルドプロセスからmake
への依存を取り除き、Goのビルドシステム自体をより自己完結型でポータブルなものにすることが目的です。
前提知識の解説
Go言語のビルドシステムとクロスコンパイル
Go言語は、その設計思想として「シンプルさ」と「高速なビルド」を重視しています。特に、Goのツールチェインはクロスコンパイル(異なるOSやアーキテクチャ向けのバイナリを生成すること)を非常に容易に行えるように設計されています。これは、GOOS
(ターゲットOS)とGOARCH
(ターゲットアーキテクチャ)という環境変数を設定するだけで、その環境向けのバイナリを生成できるという形で実現されています。
go/build
パッケージ
go/build
パッケージは、Goのソースコードを解析し、パッケージの依存関係を解決し、ビルド可能なGoパッケージを特定するための機能を提供します。これは、go build
やgo install
といったコマンドの内部で利用される、Goのビルドシステムの中核をなすパッケージの一つです。このパッケージは、どのOSやアーキテクチャがサポートされているかといった情報も内部的に持っています。
Makefile
Makefile
は、主にUnix系システムでプログラムのコンパイルやビルドプロセスを自動化するために使用されるファイルです。make
コマンドによって解釈され、ファイル間の依存関係を定義し、それらを解決するためのコマンドシーケンスを実行します。大規模なプロジェクトでは、コンパイル、リンク、テスト、デプロイなど、様々なタスクを自動化するために広く利用されます。しかし、Goのような言語では、言語自体が強力なビルドツール(go build
など)を提供しているため、Makefile
の必要性は限定的になる傾向があります。
GOOS_LIST
とGOARCH_LIST
これらは、Goのビルドシステムがサポートするオペレーティングシステムとアーキテクチャのリストを定義する内部的な変数です。例えば、GOOS_LIST
にはlinux darwin windows
などが、GOARCH_LIST
にはamd64 arm arm64
などが含まれます。これらのリストは、クロスコンパイルの際にどのターゲットが有効であるかを判断するために使用されます。
技術的詳細
このコミットの技術的な詳細としては、主に以下の点が挙げられます。
-
Makefile
の削除:src/pkg/go/build/Makefile
が完全に削除されました。このMakefile
は、syslist.go
を生成するための非常にシンプルなスクリプトでした。具体的には、echo
コマンドを使ってGoのソースコードの文字列を生成し、GOOS_LIST
とGOARCH_LIST
の値を埋め込んでいました。syslist.go: ../../../Make.inc Makefile echo '// Generated automatically by make.' >$@ echo >>$@ echo 'package build' >>$@ echo >>$@ echo 'const goosList = "$(GOOS_LIST)"' >>$@ echo 'const goarchList = "$(GOARCH_LIST)"' >>$@
この
Makefile
が削除されたことで、go/build
パッケージのビルドにおいてmake
コマンドへの依存がなくなりました。 -
syslist.go
の手動管理への移行:syslist.go
は、もはやMakefile
によって自動生成されるファイルではなくなりました。コミットの差分を見ると、syslist.go
の変更は非常に軽微で、コメントの更新(著作権表示の年号変更と、自動生成された旨のコメント削除)のみです。これは、syslist.go
の内容が静的であり、GOOS_LIST
やGOARCH_LIST
の実際の値がGoのソースコード内に直接ハードコードされるか、あるいは別のメカニズムで提供されるようになったことを示唆しています。Goのビルドシステムは、これらのリストを内部的に管理する別の方法を持っているため、このファイルが自動生成される必要がなくなったと考えられます。 -
ビルドプロセスの簡素化とポータビリティの向上: この変更により、Goのビルドシステムはより自己完結型になりました。
make
のような外部ツールに依存しないことで、Goのソースコードをビルドする際に必要な前提条件が減り、様々な環境でのビルドがより容易になります。これは、Goが目指す「どこでも動く」という哲学にも合致しています。特に、Goのツールチェイン自体がGoで書かれているため、GoのビルドプロセスをGo自身で完結させることは、エコシステム全体の整合性を高める上でも重要です。
コアとなるコードの変更箇所
src/pkg/go/build/Makefile
このファイルは完全に削除されました。
--- a/src/pkg/go/build/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-# Copyright 2009 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-syslist.go: ../../../Make.inc Makefile
- echo '// Generated automatically by make.' >$@
- echo >>$@
- echo 'package build' >>$@
- echo >>$@
- echo 'const goosList = "$(GOOS_LIST)"' >>$@
- echo 'const goarchList = "$(GOARCH_LIST)"' >>$@
src/pkg/go/build/syslist.go
このファイルは、以下の2行が変更されました。
--- a/src/pkg/go/build/syslist.go
+++ b/src/pkg/go/build/syslist.go
@@ -1,4 +1,6 @@
-// Generated automatically by make.
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
具体的には、
- // Generated automatically by make.
の行が削除されました。+ // Copyright 2011 The Go Authors. All rights reserved.
の行が追加され、著作権表示の年号が更新されました。+ // Use of this source code is governed by a BSD-style
の行が追加され、ライセンスに関するコメントが追加されました。
コアとなるコードの解説
src/pkg/go/build/Makefile
の削除
このMakefile
は、syslist.go
というGoのソースファイルを生成するためだけに存在していました。その内容は、GOOS_LIST
とGOARCH_LIST
というシェル変数(Make.inc
で定義されている可能性が高い)の値をGoの文字列定数としてsyslist.go
に書き出すというものでした。
Makefile
が削除されたということは、この自動生成プロセスが不要になったことを意味します。これは、syslist.go
の内容が非常に安定しており、手動で管理しても問題ないほど変更頻度が低いか、あるいはGOOS_LIST
やGOARCH_LIST
といった情報が、Goのビルドシステム内の別の場所(例えば、Goのソースコード内の別の定数や、コンパイル時に埋め込まれる情報など)から取得されるようになったことを示唆しています。Goのビルドシステムは、Goのソースコードから直接ビルドされるため、このような静的な情報を生成するために外部のmake
ツールに依存する必要がなくなったと考えられます。
src/pkg/go/build/syslist.go
の変更
syslist.go
の変更は、主にコメントの更新です。
// Generated automatically by make.
というコメントが削除されたのは、もはやmake
によって生成されるファイルではないことを明確にするためです。- 著作権表示の年号が2009年から2011年に更新され、ライセンスに関するコメントが追加されました。これは、ファイルが手動で管理されるようになったことに伴い、メタデータが適切に更新されたことを示しています。
この変更は、syslist.go
がGoのビルドシステムの一部として、手動で保守される通常のGoソースファイルになったことを意味します。これにより、ビルドプロセスから不要な依存関係が取り除かれ、Goのビルドシステム全体のシンプルさと堅牢性が向上しました。
関連リンク
- Go言語公式ドキュメント: https://go.dev/doc/
- Go言語のビルドコマンド (
go build
): https://go.dev/cmd/go/#hdr-Compile_packages_and_dependencies go/build
パッケージのドキュメント: https://pkg.go.dev/go/build
参考にした情報源リンク
- Go言語のソースコード (GitHub): https://github.com/golang/go
- Go言語のコミット履歴: https://github.com/golang/go/commits/master
- GNU Make マニュアル: https://www.gnu.org/software/make/manual/
- Goのクロスコンパイルに関する情報 (例: Go Wiki): https://go.dev/doc/install/source#environment (一般的なGoの環境変数に関する情報)