[インデックス 11497] ファイルの概要
このコミットは、Go言語のビルドシステムにおける重要な変更を示しています。具体的には、従来のmake
ベースのビルドプロセスから、よりGoネイティブなgo build
コマンドを中心としたシステムへの移行を推進するものです。Make.pkg
とMake.tool
という主要なMakefileが削除され、それに伴い多数のパッケージやツールのMakefileが削除または大幅に簡素化されています。
コミット
commit 2050a9e47865450299d50d1364744b0945546dce
Author: Russ Cox <rsc@golang.org>
Date: Mon Jan 30 23:43:46 2012 -0500
build: remove Make.pkg, Make.tool
Consequently, remove many package Makefiles,
and shorten the few that remain.
gomake becomes 'go tool make'.
Turn off test phases of run.bash that do not work,
flagged with $BROKEN. Future CLs will restore these,
but this seemed like a big enough CL already.
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/5601057
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/2050a9e47865450299d50d1364744b0945546dce
元コミット内容
このコミットの目的は、GoのビルドシステムからMake.pkg
とMake.tool
という2つの主要なMakefileを削除することです。これにより、多くのパッケージのMakefileが削除され、残りのMakefileも短縮されます。また、gomake
コマンドがgo tool make
に置き換えられることが明記されています。さらに、run.bash
スクリプト内で動作しないテストフェーズが一時的に無効化されていますが、これは将来の変更で元に戻される予定です。
変更の背景
Go言語は、その設計思想としてシンプルさと効率性を重視しています。初期のGoプロジェクトのビルドプロセスは、Unix系のシステムで広く使われているmake
ユーティリティに大きく依存していました。しかし、make
はC/C++などの言語のビルドには非常に強力ですが、Goのような独自のビルドツール(go build
など)を持つ言語にとっては、冗長であったり、Goのモジュールシステムやパッケージ管理の思想と完全に合致しない部分がありました。
このコミットが行われた2012年頃は、Go言語がまだ比較的新しく、そのエコシステムとツールチェーンが急速に進化していた時期です。Goチームは、Go言語のビルドプロセスをよりGoネイティブなものにし、外部ツールへの依存を減らすことで、ビルドの信頼性、移植性、そして開発者の体験を向上させようとしていました。make
ファイルが多数存在することは、ビルド設定の分散、重複、そして異なるプラットフォーム間での互換性の問題を引き起こす可能性がありました。
Make.pkg
とMake.tool
の削除は、Goの標準ライブラリパッケージとGoツール群のビルド方法を根本的に変更するものであり、go build
コマンドがGoプロジェクトのビルドにおける主要なインターフェースとなる方向性を示しています。これにより、Goのビルドプロセス全体がより統一され、Goツールチェーン自体が自身のビルドを管理できるようになるという、自己ホスト型のビルドシステムへの重要な一歩となりました。
前提知識の解説
- Makefileと
make
:make
は、プログラムのソースコードから実行可能ファイルやライブラリをビルドするための依存関係を管理するユーティリティです。Makefile
は、make
がビルドプロセスを実行するために読み込む設定ファイルで、ターゲット、依存関係、およびコマンドを定義します。C/C++プロジェクトでは非常に一般的です。 - Go言語のビルドシステム: Go言語は、
go build
、go install
、go test
などの組み込みコマンドを提供しており、これらがGoソースコードのコンパイル、パッケージのインストール、テストの実行を自動的に処理します。これらのコマンドは、Goのモジュールシステムと連携し、依存関係の解決やクロスコンパイルなどを効率的に行います。 GOROOT
とGOPATH
: Goの初期のバージョンでは、GOROOT
はGoのインストールディレクトリを指し、GOPATH
はユーザーのワークスペースディレクトリを指していました。go get
などで取得したパッケージはGOPATH
内に配置され、ビルド時にはこれらのパスが参照されました。このコミットが行われた時期は、まだGo Modulesが導入される前であり、GOPATH
ベースのワークフローが主流でした。- ブートストラップビルド: Goコンパイラやツールチェーン自体をビルドするプロセスは、ブートストラップビルドと呼ばれます。これは、既存のGoコンパイラ(またはCコンパイラ)を使用して、新しいバージョンのGoコンパイラをビルドする自己ホスト型のプロセスです。このコミットでは、ブートストラップビルドスクリプト(
buildscript/*.sh
)も変更されています。 go tool
:go tool
コマンドは、Goツールチェーンに含まれる低レベルのツール(例: アセンブラ、リンカ、コンパイラなど)を実行するためのインターフェースです。このコミットでgomake
がgo tool make
に置き換えられたことは、make
の機能がGoツールチェーンの一部として統合されたことを意味します。
技術的詳細
このコミットの核心は、Goのビルドプロセスからmake
への依存を大幅に削減し、go
コマンド(特にgo build
)をビルドの主役とすることです。
-
Make.pkg
とMake.tool
の削除:src/Make.pkg
: Goの標準ライブラリパッケージをビルドするための共通Makefileでした。各パッケージディレクトリには、このMake.pkg
をインクルードする小さなMakefileが存在し、パッケージのソースファイルや依存関係を定義していました。src/Make.tool
: Goのコマンドラインツール(go
、gofmt
、godoc
など)をビルドするための共通Makefileでした。- これらの共通Makefileが削除されたことで、各パッケージやツールのビルドロジックが
go build
コマンドに委譲されることになります。
-
個別のMakefileの削除と簡素化:
src/cmd/cgo/Makefile
、src/cmd/fix/Makefile
、src/cmd/go/Makefile
、src/cmd/godoc/Makefile
、src/cmd/gofmt/Makefile
など、多くのcmd
ディレクトリ下のMakefileが削除されています。これは、これらのツールがgo build
によって直接ビルドされるようになったことを示唆しています。src/pkg
以下のほぼ全てのパッケージのMakefile(例:src/pkg/archive/tar/Makefile
、src/pkg/bufio/Makefile
など)も削除されています。これは、Goパッケージのビルドがgo build
のデフォルトの動作に完全に依存するようになったことを意味します。- 残された少数のMakefile(例:
misc/dashboard/builder/Makefile
、misc/goplay/Makefile
)は、go build
コマンドを直接呼び出すように簡素化されています。これは、make
がGoのビルドシステムから完全に排除されたわけではなく、特定のカスタムビルドステップや外部依存関係がある場合にのみ使用される、より補助的な役割になったことを示しています。
-
buildscript
の変更:src/buildscript/*.sh
ファイルは、Goのブートストラップビルドプロセスを定義するシェルスクリプトです。これらのスクリプトは、Goコンパイラ(例:8g
、6g
、5g
)やリンカ(例:8l
、6l
、5l
)を直接呼び出して、go
コマンドのブートストラップバージョンをビルドしていました。- このコミットでは、これらのスクリプト内で
go_bootstrap
という名前でビルドされるgo
コマンドのパスが、$GOBIN/go_bootstrap
から$GOBIN/<os>_<arch>/go
に変更されています。これは、GoのバイナリがOSとアーキテクチャ固有のサブディレクトリに配置されるようになったことを示しており、より整理されたインストールパスを提供します。 - また、
go_bootstrap install -a -v std
というコマンドが追加されており、これはブートストラップされたgo
コマンドを使用して標準ライブラリ全体をビルド・インストールするプロセスを自動化しています。
-
gomake
からgo tool make
への移行:src/env.bash
からUSE_GO_TOOL=true
という変数が削除され、src/make.bash
でgomake
がgo tool make
に置き換えられています。- これは、
gomake
という独立したスクリプトが不要になり、make
の機能がgo
コマンドのサブコマンドとして統合されたことを意味します。go tool make
は、Goのビルドシステムが内部的にmake
を呼び出す必要がある場合にのみ使用される、より低レベルなインターフェースとなります。
-
テストフェーズの一時的な無効化:
run.bash
スクリプト内で、一部のテストフェーズが$BROKEN
フラグによって一時的に無効化されています。これは、ビルドシステムの大きな変更に伴い、一部のテストが一時的に動作しなくなったためと考えられます。この変更は、ビルドシステムの移行を優先し、テストの修正は後続のコミットで行うという現実的なアプローチを示しています。
この変更は、Goのビルドシステムが外部のmake
ユーティリティに依存するのではなく、Go自身のツールチェーンがビルドプロセス全体を管理するという、Goの自己完結性を高める方向への重要な一歩でした。これにより、Goプロジェクトのビルドはよりシンプルで、予測可能で、クロスプラットフォームでの一貫性が向上しました。
コアとなるコードの変更箇所
このコミットでは、主に以下のファイルが変更されています。
-
削除されたファイル:
src/Make.pkg
: Goパッケージの共通Makefile。src/Make.tool
: Goツールの共通Makefile。src/cmd/cgo/Makefile
src/cmd/fix/Makefile
src/cmd/go/Makefile
src/cmd/godoc/Makefile
src/cmd/gofmt/Makefile
src/pkg
以下の多数のパッケージのMakefile(例:src/pkg/archive/tar/Makefile
,src/pkg/bufio/Makefile
,src/pkg/bytes/Makefile
など、約150以上のファイル)。
-
変更されたファイル:
misc/dashboard/builder/Makefile
:go build
を直接呼び出すように簡素化。misc/goplay/Makefile
:go build
を直接呼び出すように簡素化。src/buildscript/*.sh
(例:src/buildscript/darwin_386.sh
,src/buildscript/linux_amd64.sh
,src/buildscript/windows_386.sh
など、各OS/アーキテクチャのスクリプト):go
コマンドのブートストラップビルド後のコピー先が$GOBIN/go_bootstrap
から$GOBIN/<os>_<arch>/go
に変更。./bootstrap.go
などのGoソースファイルのリストに./clean.go
や./root.go
が追加されている場合がある。
src/clean.bash
:gomake
の呼び出しをgo clean std
に置き換え、一部のディレクトリのクリーンアップ方法を変更。src/cmd/Makefile
:CLEANDIRS
リストから削除されたツールのエントリを削除。src/cmd/vet/Makefile
:go build
を直接呼び出すように簡素化。src/cmd/yacc/Makefile
:go run
とgo build
を直接呼び出すように簡素化。src/env.bash
:USE_GO_TOOL=true
の行を削除。src/make.bash
:gomake
の定義をgo tool make
を指すように変更。gomake -C $i install
の呼び出しを"$GOMAKE" -C $i install
に変更。go_bootstrap install -a -v std
の呼び出しを追加。rm -f "$GOBIN/go_bootstrap"
でブートストラップバイナリを削除。
src/run.bash
: 動作しないテストフェーズを$BROKEN
フラグで無効化。test/run
: 軽微な変更。
コアとなるコードの解説
このコミットの最も重要な変更は、src/Make.pkg
とsrc/Make.tool
の削除、そしてそれに伴う個別のパッケージ/ツールのMakefileの削除です。これにより、Goのビルドシステムは、各ディレクトリに存在するGoソースファイルを自動的に認識し、go build
コマンドによってコンパイル・リンクするようになりました。
例えば、以前はsrc/pkg/archive/tar/Makefile
のようなファイルが存在し、Make.pkg
をインクルードしてarchive/tar
パッケージのビルド方法を定義していました。
変更前 (src/pkg/archive/tar/Makefile
の例):
include ../../../Make.inc
TARG=archive/tar
GOFILES=\
common.go\
reader.go\
writer.go\
include ../../../Make.pkg
このコミットにより、このようなMakefileは完全に削除されました。Goのビルドシステムは、archive/tar
ディレクトリにGoソースファイルが存在することを知っており、go build archive/tar
(またはgo install archive/tar
)を実行するだけで、これらのファイルを自動的にコンパイルし、パッケージアーカイブ(.a
ファイル)を生成するようになりました。
また、src/make.bash
におけるgomake
の変更も重要です。
変更前 (src/make.bash
の一部):
# ...
) >"$GOBIN"/gomake
chmod +x "$GOBIN"/gomake
# ...
gomake -C $i install
# ...
変更後 (src/make.bash
の一部):
export GOMAKE="$GOROOT"/bin/go-tool/make
rm -f "$GOBIN"/gomake
rm -f "$GOMAKE"
(
echo '#!/bin/sh'
echo 'export GOROOT=${GOROOT:-'$GOROOT_FINAL'}'
echo 'exec '$MAKE' "$@"'
) >"$GOMAKE"
chmod +x "$GOMAKE"
# ...
"$GOMAKE" -C $i install
# ...
この変更により、gomake
というシンボリックリンクまたはスクリプトが$GOROOT/bin/go-tool/make
を指すようになり、実質的にgo tool make
がmake
コマンドのラッパーとして機能するようになりました。これは、Goのビルドプロセスが、必要に応じて従来のmake
の機能を利用しつつも、その制御をGoツールチェーン内部に統合したことを示しています。
全体として、このコミットはGoのビルドシステムをよりシンプルで、Goの設計思想に沿ったものにするための重要なリファクタリングであり、Go言語の自己完結性と移植性を高める上で不可欠なステップでした。
関連リンク
- Go言語の公式ドキュメント: https://golang.org/doc/
- Goコマンドのドキュメント: https://golang.org/cmd/go/
- Go Modules (このコミット時点では存在しないが、Goのビルドシステム進化の次の大きなステップ): https://go.dev/blog/using-go-modules
参考にした情報源リンク
- Goのコミット履歴 (GitHub): https://github.com/golang/go/commits/master
- GoのChange List (CL) 5601057: https://golang.org/cl/5601057 (コミットメッセージに記載されているリンク)
- Goのビルドシステムに関する議論やドキュメント (当時の情報源を特定するのは困難ですが、Goのメーリングリストや初期の設計ドキュメントに言及がある可能性があります)
make
ユーティリティに関する一般的な情報: https://www.gnu.org/software/make/manual/- Goのブートストラップビルドに関する情報 (Goのソースコード内の
src/make.bash
やsrc/buildscript
ディレクトリのコメントなど) - Goの歴史に関する記事やブログポスト (Goのビルドシステム進化の文脈を理解するため)# [インデックス 11497] ファイルの概要
このコミットは、Go言語のビルドシステムにおける重要な変更を示しています。具体的には、従来のmake
ベースのビルドプロセスから、よりGoネイティブなgo build
コマンドを中心としたシステムへの移行を推進するものです。Make.pkg
とMake.tool
という主要なMakefileが削除され、それに伴い多数のパッケージやツールのMakefileが削除または大幅に簡素化されています。
コミット
commit 2050a9e47865450299d50d1364744b0945546dce
Author: Russ Cox <rsc@golang.org>
Date: Mon Jan 30 23:43:46 2012 -0500
build: remove Make.pkg, Make.tool
Consequently, remove many package Makefiles,
and shorten the few that remain.
gomake becomes 'go tool make'.
Turn off test phases of run.bash that do not work,
flagged with $BROKEN. Future CLs will restore these,
but this seemed like a big enough CL already.
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/5601057
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/2050a9e47865450299d50d1364744b0945546dce
元コミット内容
このコミットの目的は、GoのビルドシステムからMake.pkg
とMake.tool
という2つの主要なMakefileを削除することです。これにより、多くのパッケージのMakefileが削除され、残りのMakefileも短縮されます。また、gomake
コマンドがgo tool make
に置き換えられることが明記されています。さらに、run.bash
スクリプト内で動作しないテストフェーズが一時的に無効化されていますが、これは将来の変更で元に戻される予定です。
変更の背景
Go言語は、その設計思想としてシンプルさと効率性を重視しています。初期のGoプロジェクトのビルドプロセスは、Unix系のシステムで広く使われているmake
ユーティリティに大きく依存していました。しかし、make
はC/C++などの言語のビルドには非常に強力ですが、Goのような独自のビルドツール(go build
など)を持つ言語にとっては、冗長であったり、Goのモジュールシステムやパッケージ管理の思想と完全に合致しない部分がありました。
このコミットが行われた2012年頃は、Go言語がまだ比較的新しく、そのエコシステムとツールチェーンが急速に進化していた時期です。Goチームは、Go言語のビルドプロセスをよりGoネイティブなものにし、外部ツールへの依存を減らすことで、ビルドの信頼性、移植性、そして開発者の体験を向上させようとしていました。make
ファイルが多数存在することは、ビルド設定の分散、重複、そして異なるプラットフォーム間での互換性の問題を引き起こす可能性がありました。
Make.pkg
とMake.tool
の削除は、Goの標準ライブラリパッケージとGoツール群のビルド方法を根本的に変更するものであり、go build
コマンドがGoプロジェクトのビルドにおける主要なインターフェースとなる方向性を示しています。これにより、Goのビルドプロセス全体がより統一され、Goツールチェーン自体が自身のビルドを管理できるようになるという、自己ホスト型のビルドシステムへの重要な一歩となりました。
前提知識の解説
- Makefileと
make
:make
は、プログラムのソースコードから実行可能ファイルやライブラリをビルドするための依存関係を管理するユーティリティです。Makefile
は、make
がビルドプロセスを実行するために読み込む設定ファイルで、ターゲット、依存関係、およびコマンドを定義します。C/C++プロジェクトでは非常に一般的です。 - Go言語のビルドシステム: Go言語は、
go build
、go install
、go test
などの組み込みコマンドを提供しており、これらがGoソースコードのコンパイル、パッケージのインストール、テストの実行を自動的に処理します。これらのコマンドは、Goのモジュールシステムと連携し、依存関係の解決やクロスコンパイルなどを効率的に行います。 GOROOT
とGOPATH
: Goの初期のバージョンでは、GOROOT
はGoのインストールディレクトリを指し、GOPATH
はユーザーのワークスペースディレクトリを指していました。go get
などで取得したパッケージはGOPATH
内に配置され、ビルド時にはこれらのパスが参照されました。このコミットが行われた時期は、まだGo Modulesが導入される前であり、GOPATH
ベースのワークフローが主流でした。- ブートストラップビルド: Goコンパイラやツールチェーン自体をビルドするプロセスは、ブートストラップビルドと呼ばれます。これは、既存のGoコンパイラ(またはCコンパイラ)を使用して、新しいバージョンのGoコンパイラをビルドする自己ホスト型のプロセスです。このコミットでは、ブートストラップビルドスクリプト(
buildscript/*.sh
)も変更されています。 go tool
:go tool
コマンドは、Goツールチェーンに含まれる低レベルのツール(例: アセンブラ、リンカ、コンパイラなど)を実行するためのインターフェースです。このコミットでgomake
がgo tool make
に置き換えられたことは、make
の機能がGoツールチェーンの一部として統合されたことを意味します。
技術的詳細
このコミットの核心は、Goのビルドプロセスからmake
への依存を大幅に削減し、go
コマンド(特にgo build
)をビルドの主役とすることです。
-
Make.pkg
とMake.tool
の削除:src/Make.pkg
: Goの標準ライブラリパッケージをビルドするための共通Makefileでした。各パッケージディレクトリには、このMake.pkg
をインクルードする小さなMakefileが存在し、パッケージのソースファイルや依存関係を定義していました。src/Make.tool
: Goのコマンドラインツール(go
、gofmt
、godoc
など)をビルドするための共通Makefileでした。- これらの共通Makefileが削除されたことで、各パッケージやツールのビルドロジックが
go build
コマンドに委譲されることになります。
-
個別のMakefileの削除と簡素化:
src/cmd/cgo/Makefile
、src/cmd/fix/Makefile
、src/cmd/go/Makefile
、src/cmd/godoc/Makefile
、src/cmd/gofmt/Makefile
など、多くのcmd
ディレクトリ下のMakefileが削除されています。これは、これらのツールがgo build
によって直接ビルドされるようになったことを示唆しています。src/pkg
以下のほぼ全てのパッケージのMakefile(例:src/pkg/archive/tar/Makefile
、src/pkg/bufio/Makefile
など)も削除されています。これは、Goパッケージのビルドがgo build
のデフォルトの動作に完全に依存するようになったことを意味します。- 残された少数のMakefile(例:
misc/dashboard/builder/Makefile
、misc/goplay/Makefile
)は、go build
コマンドを直接呼び出すように簡素化されています。これは、make
がGoのビルドシステムから完全に排除されたわけではなく、特定のカスタムビルドステップや外部依存関係がある場合にのみ使用される、より補助的な役割になったことを示しています。
-
buildscript
の変更:src/buildscript/*.sh
ファイルは、Goのブートストラップビルドプロセスを定義するシェルスクリプトです。これらのスクリプトは、Goコンパイラ(例:8g
、6g
、5g
)やリンカ(例:8l
、6l
、5l
)を直接呼び出して、go
コマンドのブートストラップバージョンをビルドしていました。- このコミットでは、これらのスクリプト内で
go_bootstrap
という名前でビルドされるgo
コマンドのパスが、$GOBIN/go_bootstrap
から$GOBIN/<os>_<arch>/go
に変更されています。これは、GoのバイナリがOSとアーキテクチャ固有のサブディレクトリに配置されるようになったことを示しており、より整理されたインストールパスを提供します。 - また、
go_bootstrap install -a -v std
というコマンドが追加されており、これはブートストラップされたgo
コマンドを使用して標準ライブラリ全体をビルド・インストールするプロセスを自動化しています。
-
gomake
からgo tool make
への移行:src/env.bash
からUSE_GO_TOOL=true
という変数が削除され、src/make.bash
でgomake
がgo tool make
に置き換えられています。- これは、
gomake
という独立したスクリプトが不要になり、make
の機能がgo
コマンドのサブコマンドとして統合されたことを意味します。go tool make
は、Goのビルドシステムが内部的にmake
を呼び出す必要がある場合にのみ使用される、より低レベルなインターフェースとなります。
-
テストフェーズの一時的な無効化:
run.bash
スクリプト内で、一部のテストフェーズが$BROKEN
フラグによって一時的に無効化されています。これは、ビルドシステムの大きな変更に伴い、一部のテストが一時的に動作しなくなったためと考えられます。この変更は、ビルドシステムの移行を優先し、テストの修正は後続のコミットで行うという現実的なアプローチを示しています。
この変更は、Goのビルドシステムが外部のmake
ユーティリティに依存するのではなく、Go自身のツールチェーンがビルドプロセス全体を管理するという、Goの自己完結性を高める方向への重要な一歩でした。これにより、Goプロジェクトのビルドはよりシンプルで、予測可能で、クロスプラットフォームでの一貫性が向上しました。
コアとなるコードの変更箇所
このコミットでは、主に以下のファイルが変更されています。
-
削除されたファイル:
src/Make.pkg
: Goパッケージの共通Makefile。src/Make.tool
: Goツールの共通Makefile。src/cmd/cgo/Makefile
src/cmd/fix/Makefile
src/cmd/go/Makefile
src/cmd/godoc/Makefile
src/cmd/gofmt/Makefile
src/pkg
以下の多数のパッケージのMakefile(例:src/pkg/archive/tar/Makefile
,src/pkg/bufio/Makefile
,src/pkg/bytes/Makefile
など、約150以上のファイル)。
-
変更されたファイル:
misc/dashboard/builder/Makefile
:go build
を直接呼び出すように簡素化。misc/goplay/Makefile
:go build
を直接呼び出すように簡素化。src/buildscript/*.sh
(例:src/buildscript/darwin_386.sh
,src/buildscript/linux_amd64.sh
,src/buildscript/windows_386.sh
など、各OS/アーキテクチャのスクリプト):go
コマンドのブートストラップビルド後のコピー先が$GOBIN/go_bootstrap
から$GOBIN/<os>_<arch>/go
に変更。./bootstrap.go
などのGoソースファイルのリストに./clean.go
や./root.go
が追加されている場合がある。
src/clean.bash
:gomake
の呼び出しをgo clean std
に置き換え、一部のディレクトリのクリーンアップ方法を変更。src/cmd/Makefile
:CLEANDIRS
リストから削除されたツールのエントリを削除。src/cmd/vet/Makefile
:go build
を直接呼び出すように簡素化。src/cmd/yacc/Makefile
:go run
とgo build
を直接呼び出すように簡素化。src/env.bash
:USE_GO_TOOL=true
の行を削除。src/make.bash
:gomake
の定義をgo tool make
を指すように変更。gomake -C $i install
の呼び出しを"$GOMAKE" -C $i install
に変更。go_bootstrap install -a -v std
の呼び出しを追加。rm -f "$GOBIN/go_bootstrap"
でブートストラップバイナリを削除。
src/run.bash
: 動作しないテストフェーズを$BROKEN
フラグで無効化。test/run
: 軽微な変更。
コアとなるコードの解説
このコミットの最も重要な変更は、src/Make.pkg
とsrc/Make.tool
の削除、そしてそれに伴う個別のパッケージ/ツールのMakefileの削除です。これにより、Goのビルドシステムは、各ディレクトリに存在するGoソースファイルを自動的に認識し、go build
コマンドによってコンパイル・リンクするようになりました。
例えば、以前はsrc/pkg/archive/tar/Makefile
のようなファイルが存在し、Make.pkg
をインクルードしてarchive/tar
パッケージのビルド方法を定義していました。
変更前 (src/pkg/archive/tar/Makefile
の例):
include ../../../Make.inc
TARG=archive/tar
GOFILES=\
common.go\
reader.go\
writer.go\
include ../../../Make.pkg
このコミットにより、このようなMakefileは完全に削除されました。Goのビルドシステムは、archive/tar
ディレクトリにGoソースファイルが存在することを知っており、go build archive/tar
(またはgo install archive/tar
)を実行するだけで、これらのファイルを自動的にコンパイルし、パッケージアーカイブ(.a
ファイル)を生成するようになりました。
また、src/make.bash
におけるgomake
の変更も重要です。
変更前 (src/make.bash
の一部):
# ...
) >"$GOBIN"/gomake
chmod +x "$GOBIN"/gomake
# ...
gomake -C $i install
# ...
変更後 (src/make.bash
の一部):
export GOMAKE="$GOROOT"/bin/go-tool/make
rm -f "$GOBIN"/gomake
rm -f "$GOMAKE"
(
echo '#!/bin/sh'
echo 'export GOROOT=${GOROOT:-'$GOROOT_FINAL'}'
echo 'exec '$MAKE' "$@"'
) >"$GOMAKE"
chmod +x "$GOMAKE"
# ...
"$GOMAKE" -C $i install
# ...
この変更により、gomake
というシンボリックリンクまたはスクリプトが$GOROOT/bin/go-tool/make
を指すようになり、実質的にgo tool make
がmake
コマンドのラッパーとして機能するようになりました。これは、Goのビルドプロセスが、必要に応じて従来のmake
の機能を利用しつつも、その制御をGoツールチェーン内部に統合したことを示しています。
全体として、このコミットはGoのビルドシステムをよりシンプルで、Goの設計思想に沿ったものにするための重要なリファクタリングであり、Go言語の自己完結性と移植性を高める上で不可欠なステップでした。
関連リンク
- Go言語の公式ドキュメント: https://golang.org/doc/
- Goコマンドのドキュメント: https://golang.org/cmd/go/
- Go Modules (このコミット時点では存在しないが、Goのビルドシステム進化の次の大きなステップ): https://go.dev/blog/using-go-modules
参考にした情報源リンク
- Goのコミット履歴 (GitHub): https://github.com/golang/go/commits/master
- GoのChange List (CL) 5601057: https://golang.org/cl/5601057 (コミットメッセージに記載されているリンク)
- Goのビルドシステムに関する議論やドキュメント (当時の情報源を特定するのは困難ですが、Goのメーリングリストや初期の設計ドキュメントに言及がある可能性があります)
make
ユーティリティに関する一般的な情報: https://www.gnu.org/software/make/manual/- Goのブートストラップビルドに関する情報 (Goのソースコード内の
src/make.bash
やsrc/buildscript
ディレクトリのコメントなど) - Goの歴史に関する記事やブログポスト (Goのビルドシステム進化の文脈を理解するため)