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

[インデックス 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_LISTGOARCH_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 buildgo installといったコマンドの内部で利用される、Goのビルドシステムの中核をなすパッケージの一つです。このパッケージは、どのOSやアーキテクチャがサポートされているかといった情報も内部的に持っています。

Makefile

Makefileは、主にUnix系システムでプログラムのコンパイルやビルドプロセスを自動化するために使用されるファイルです。makeコマンドによって解釈され、ファイル間の依存関係を定義し、それらを解決するためのコマンドシーケンスを実行します。大規模なプロジェクトでは、コンパイル、リンク、テスト、デプロイなど、様々なタスクを自動化するために広く利用されます。しかし、Goのような言語では、言語自体が強力なビルドツール(go buildなど)を提供しているため、Makefileの必要性は限定的になる傾向があります。

GOOS_LISTGOARCH_LIST

これらは、Goのビルドシステムがサポートするオペレーティングシステムとアーキテクチャのリストを定義する内部的な変数です。例えば、GOOS_LISTにはlinux darwin windowsなどが、GOARCH_LISTにはamd64 arm arm64などが含まれます。これらのリストは、クロスコンパイルの際にどのターゲットが有効であるかを判断するために使用されます。

技術的詳細

このコミットの技術的な詳細としては、主に以下の点が挙げられます。

  1. Makefileの削除: src/pkg/go/build/Makefileが完全に削除されました。このMakefileは、syslist.goを生成するための非常にシンプルなスクリプトでした。具体的には、echoコマンドを使ってGoのソースコードの文字列を生成し、GOOS_LISTGOARCH_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コマンドへの依存がなくなりました。

  2. syslist.goの手動管理への移行: syslist.goは、もはやMakefileによって自動生成されるファイルではなくなりました。コミットの差分を見ると、syslist.goの変更は非常に軽微で、コメントの更新(著作権表示の年号変更と、自動生成された旨のコメント削除)のみです。これは、syslist.goの内容が静的であり、GOOS_LISTGOARCH_LISTの実際の値がGoのソースコード内に直接ハードコードされるか、あるいは別のメカニズムで提供されるようになったことを示唆しています。Goのビルドシステムは、これらのリストを内部的に管理する別の方法を持っているため、このファイルが自動生成される必要がなくなったと考えられます。

  3. ビルドプロセスの簡素化とポータビリティの向上: この変更により、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_LISTGOARCH_LISTというシェル変数(Make.incで定義されている可能性が高い)の値をGoの文字列定数としてsyslist.goに書き出すというものでした。

Makefileが削除されたということは、この自動生成プロセスが不要になったことを意味します。これは、syslist.goの内容が非常に安定しており、手動で管理しても問題ないほど変更頻度が低いか、あるいはGOOS_LISTGOARCH_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のビルドシステム全体のシンプルさと堅牢性が向上しました。

関連リンク

参考にした情報源リンク