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

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

このコミットは、Go言語のビルドシステムにおける重要な変更を示しています。具体的には、従来のmakeベースのビルドプロセスから、よりGoネイティブなgo buildコマンドを中心としたシステムへの移行を推進するものです。Make.pkgMake.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.pkgMake.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.pkgMake.toolの削除は、Goの標準ライブラリパッケージとGoツール群のビルド方法を根本的に変更するものであり、go buildコマンドがGoプロジェクトのビルドにおける主要なインターフェースとなる方向性を示しています。これにより、Goのビルドプロセス全体がより統一され、Goツールチェーン自体が自身のビルドを管理できるようになるという、自己ホスト型のビルドシステムへの重要な一歩となりました。

前提知識の解説

  • Makefileとmake: makeは、プログラムのソースコードから実行可能ファイルやライブラリをビルドするための依存関係を管理するユーティリティです。Makefileは、makeがビルドプロセスを実行するために読み込む設定ファイルで、ターゲット、依存関係、およびコマンドを定義します。C/C++プロジェクトでは非常に一般的です。
  • Go言語のビルドシステム: Go言語は、go buildgo installgo testなどの組み込みコマンドを提供しており、これらがGoソースコードのコンパイル、パッケージのインストール、テストの実行を自動的に処理します。これらのコマンドは、Goのモジュールシステムと連携し、依存関係の解決やクロスコンパイルなどを効率的に行います。
  • GOROOTGOPATH: Goの初期のバージョンでは、GOROOTはGoのインストールディレクトリを指し、GOPATHはユーザーのワークスペースディレクトリを指していました。go getなどで取得したパッケージはGOPATH内に配置され、ビルド時にはこれらのパスが参照されました。このコミットが行われた時期は、まだGo Modulesが導入される前であり、GOPATHベースのワークフローが主流でした。
  • ブートストラップビルド: Goコンパイラやツールチェーン自体をビルドするプロセスは、ブートストラップビルドと呼ばれます。これは、既存のGoコンパイラ(またはCコンパイラ)を使用して、新しいバージョンのGoコンパイラをビルドする自己ホスト型のプロセスです。このコミットでは、ブートストラップビルドスクリプト(buildscript/*.sh)も変更されています。
  • go tool: go toolコマンドは、Goツールチェーンに含まれる低レベルのツール(例: アセンブラ、リンカ、コンパイラなど)を実行するためのインターフェースです。このコミットでgomakego tool makeに置き換えられたことは、makeの機能がGoツールチェーンの一部として統合されたことを意味します。

技術的詳細

このコミットの核心は、Goのビルドプロセスからmakeへの依存を大幅に削減し、goコマンド(特にgo build)をビルドの主役とすることです。

  1. Make.pkgMake.toolの削除:

    • src/Make.pkg: Goの標準ライブラリパッケージをビルドするための共通Makefileでした。各パッケージディレクトリには、このMake.pkgをインクルードする小さなMakefileが存在し、パッケージのソースファイルや依存関係を定義していました。
    • src/Make.tool: Goのコマンドラインツール(gogofmtgodocなど)をビルドするための共通Makefileでした。
    • これらの共通Makefileが削除されたことで、各パッケージやツールのビルドロジックがgo buildコマンドに委譲されることになります。
  2. 個別のMakefileの削除と簡素化:

    • src/cmd/cgo/Makefilesrc/cmd/fix/Makefilesrc/cmd/go/Makefilesrc/cmd/godoc/Makefilesrc/cmd/gofmt/Makefileなど、多くのcmdディレクトリ下のMakefileが削除されています。これは、これらのツールがgo buildによって直接ビルドされるようになったことを示唆しています。
    • src/pkg以下のほぼ全てのパッケージのMakefile(例: src/pkg/archive/tar/Makefilesrc/pkg/bufio/Makefileなど)も削除されています。これは、Goパッケージのビルドがgo buildのデフォルトの動作に完全に依存するようになったことを意味します。
    • 残された少数のMakefile(例: misc/dashboard/builder/Makefilemisc/goplay/Makefile)は、go buildコマンドを直接呼び出すように簡素化されています。これは、makeがGoのビルドシステムから完全に排除されたわけではなく、特定のカスタムビルドステップや外部依存関係がある場合にのみ使用される、より補助的な役割になったことを示しています。
  3. buildscriptの変更:

    • src/buildscript/*.shファイルは、Goのブートストラップビルドプロセスを定義するシェルスクリプトです。これらのスクリプトは、Goコンパイラ(例: 8g6g5g)やリンカ(例: 8l6l5l)を直接呼び出して、goコマンドのブートストラップバージョンをビルドしていました。
    • このコミットでは、これらのスクリプト内でgo_bootstrapという名前でビルドされるgoコマンドのパスが、$GOBIN/go_bootstrapから$GOBIN/<os>_<arch>/goに変更されています。これは、GoのバイナリがOSとアーキテクチャ固有のサブディレクトリに配置されるようになったことを示しており、より整理されたインストールパスを提供します。
    • また、go_bootstrap install -a -v stdというコマンドが追加されており、これはブートストラップされたgoコマンドを使用して標準ライブラリ全体をビルド・インストールするプロセスを自動化しています。
  4. gomakeからgo tool makeへの移行:

    • src/env.bashからUSE_GO_TOOL=trueという変数が削除され、src/make.bashgomakego tool makeに置き換えられています。
    • これは、gomakeという独立したスクリプトが不要になり、makeの機能がgoコマンドのサブコマンドとして統合されたことを意味します。go tool makeは、Goのビルドシステムが内部的にmakeを呼び出す必要がある場合にのみ使用される、より低レベルなインターフェースとなります。
  5. テストフェーズの一時的な無効化:

    • 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 rungo 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.pkgsrc/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 makemakeコマンドのラッパーとして機能するようになりました。これは、Goのビルドプロセスが、必要に応じて従来のmakeの機能を利用しつつも、その制御をGoツールチェーン内部に統合したことを示しています。

全体として、このコミットはGoのビルドシステムをよりシンプルで、Goの設計思想に沿ったものにするための重要なリファクタリングであり、Go言語の自己完結性と移植性を高める上で不可欠なステップでした。

関連リンク

参考にした情報源リンク

  • 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.bashsrc/buildscriptディレクトリのコメントなど)
  • Goの歴史に関する記事やブログポスト (Goのビルドシステム進化の文脈を理解するため)# [インデックス 11497] ファイルの概要

このコミットは、Go言語のビルドシステムにおける重要な変更を示しています。具体的には、従来のmakeベースのビルドプロセスから、よりGoネイティブなgo buildコマンドを中心としたシステムへの移行を推進するものです。Make.pkgMake.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.pkgMake.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.pkgMake.toolの削除は、Goの標準ライブラリパッケージとGoツール群のビルド方法を根本的に変更するものであり、go buildコマンドがGoプロジェクトのビルドにおける主要なインターフェースとなる方向性を示しています。これにより、Goのビルドプロセス全体がより統一され、Goツールチェーン自体が自身のビルドを管理できるようになるという、自己ホスト型のビルドシステムへの重要な一歩となりました。

前提知識の解説

  • Makefileとmake: makeは、プログラムのソースコードから実行可能ファイルやライブラリをビルドするための依存関係を管理するユーティリティです。Makefileは、makeがビルドプロセスを実行するために読み込む設定ファイルで、ターゲット、依存関係、およびコマンドを定義します。C/C++プロジェクトでは非常に一般的です。
  • Go言語のビルドシステム: Go言語は、go buildgo installgo testなどの組み込みコマンドを提供しており、これらがGoソースコードのコンパイル、パッケージのインストール、テストの実行を自動的に処理します。これらのコマンドは、Goのモジュールシステムと連携し、依存関係の解決やクロスコンパイルなどを効率的に行います。
  • GOROOTGOPATH: Goの初期のバージョンでは、GOROOTはGoのインストールディレクトリを指し、GOPATHはユーザーのワークスペースディレクトリを指していました。go getなどで取得したパッケージはGOPATH内に配置され、ビルド時にはこれらのパスが参照されました。このコミットが行われた時期は、まだGo Modulesが導入される前であり、GOPATHベースのワークフローが主流でした。
  • ブートストラップビルド: Goコンパイラやツールチェーン自体をビルドするプロセスは、ブートストラップビルドと呼ばれます。これは、既存のGoコンパイラ(またはCコンパイラ)を使用して、新しいバージョンのGoコンパイラをビルドする自己ホスト型のプロセスです。このコミットでは、ブートストラップビルドスクリプト(buildscript/*.sh)も変更されています。
  • go tool: go toolコマンドは、Goツールチェーンに含まれる低レベルのツール(例: アセンブラ、リンカ、コンパイラなど)を実行するためのインターフェースです。このコミットでgomakego tool makeに置き換えられたことは、makeの機能がGoツールチェーンの一部として統合されたことを意味します。

技術的詳細

このコミットの核心は、Goのビルドプロセスからmakeへの依存を大幅に削減し、goコマンド(特にgo build)をビルドの主役とすることです。

  1. Make.pkgMake.toolの削除:

    • src/Make.pkg: Goの標準ライブラリパッケージをビルドするための共通Makefileでした。各パッケージディレクトリには、このMake.pkgをインクルードする小さなMakefileが存在し、パッケージのソースファイルや依存関係を定義していました。
    • src/Make.tool: Goのコマンドラインツール(gogofmtgodocなど)をビルドするための共通Makefileでした。
    • これらの共通Makefileが削除されたことで、各パッケージやツールのビルドロジックがgo buildコマンドに委譲されることになります。
  2. 個別のMakefileの削除と簡素化:

    • src/cmd/cgo/Makefilesrc/cmd/fix/Makefilesrc/cmd/go/Makefilesrc/cmd/godoc/Makefilesrc/cmd/gofmt/Makefileなど、多くのcmdディレクトリ下のMakefileが削除されています。これは、これらのツールがgo buildによって直接ビルドされるようになったことを示唆しています。
    • src/pkg以下のほぼ全てのパッケージのMakefile(例: src/pkg/archive/tar/Makefilesrc/pkg/bufio/Makefileなど)も削除されています。これは、Goパッケージのビルドがgo buildのデフォルトの動作に完全に依存するようになったことを意味します。
    • 残された少数のMakefile(例: misc/dashboard/builder/Makefilemisc/goplay/Makefile)は、go buildコマンドを直接呼び出すように簡素化されています。これは、makeがGoのビルドシステムから完全に排除されたわけではなく、特定のカスタムビルドステップや外部依存関係がある場合にのみ使用される、より補助的な役割になったことを示しています。
  3. buildscriptの変更:

    • src/buildscript/*.shファイルは、Goのブートストラップビルドプロセスを定義するシェルスクリプトです。これらのスクリプトは、Goコンパイラ(例: 8g6g5g)やリンカ(例: 8l6l5l)を直接呼び出して、goコマンドのブートストラップバージョンをビルドしていました。
    • このコミットでは、これらのスクリプト内でgo_bootstrapという名前でビルドされるgoコマンドのパスが、$GOBIN/go_bootstrapから$GOBIN/<os>_<arch>/goに変更されています。これは、GoのバイナリがOSとアーキテクチャ固有のサブディレクトリに配置されるようになったことを示しており、より整理されたインストールパスを提供します。
    • また、go_bootstrap install -a -v stdというコマンドが追加されており、これはブートストラップされたgoコマンドを使用して標準ライブラリ全体をビルド・インストールするプロセスを自動化しています。
  4. gomakeからgo tool makeへの移行:

    • src/env.bashからUSE_GO_TOOL=trueという変数が削除され、src/make.bashgomakego tool makeに置き換えられています。
    • これは、gomakeという独立したスクリプトが不要になり、makeの機能がgoコマンドのサブコマンドとして統合されたことを意味します。go tool makeは、Goのビルドシステムが内部的にmakeを呼び出す必要がある場合にのみ使用される、より低レベルなインターフェースとなります。
  5. テストフェーズの一時的な無効化:

    • 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 rungo 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.pkgsrc/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 makemakeコマンドのラッパーとして機能するようになりました。これは、Goのビルドプロセスが、必要に応じて従来のmakeの機能を利用しつつも、その制御をGoツールチェーン内部に統合したことを示しています。

全体として、このコミットはGoのビルドシステムをよりシンプルで、Goの設計思想に沿ったものにするための重要なリファクタリングであり、Go言語の自己完結性と移植性を高める上で不可欠なステップでした。

関連リンク

参考にした情報源リンク

  • 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.bashsrc/buildscriptディレクトリのコメントなど)
  • Goの歴史に関する記事やブログポスト (Goのビルドシステム進化の文脈を理解するため)