[インデックス 19046] ファイルの概要
このコミットは、GoプロジェクトのビルドシステムからGNU Makeへの依存を削除することを目的としています。具体的には、doc/articles/wiki
ディレクトリ内のビルドおよびテストプロセスから Makefile
を排除し、そのクリーンアップ機能をシェルスクリプト (test.bash
) に直接移行することで、ビルドのポータビリティとシンプルさを向上させています。
コミット
commit 3929967156991f4bce4642a236e441f808243ce3
Author: Andrew Gerrand <adg@golang.org>
Date: Mon Apr 7 11:34:35 2014 +1000
build: remove depdenency on GNU make
LGTM=bradfitz
R=bradfitz
CC=golang-codereviews
https://golang.org/cl/84920043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/3929967156991f4bce4642a236e441f808243ce3
元コミット内容
build: remove depdenency on GNU make
このコミットは、GoのビルドプロセスからGNU Makeへの依存を取り除くことを目的としています。
変更の背景
Goプロジェクトは、そのビルドシステムにおいて、シンプルさとポータビリティを重視しています。外部ツール、特にGNU Makeのような特定のプラットフォームに強く依存するツールへの依存は、ビルドプロセスの複雑性を増し、異なるオペレーティングシステム(例えば、WindowsやmacOSなど)でのビルドの互換性を損なう可能性があります。
Goの設計哲学は、可能な限りGo言語自体でツールを構築するか、あるいは広く利用可能なシェルスクリプトのようなシンプルなメカニズムを使用することにあります。これにより、外部依存を最小限に抑え、プロジェクトの自己完結性を高めることができます。
このコミットは、doc/articles/wiki
ディレクトリ内の特定の Makefile
がGNU Makeに依存している状況を解消し、その機能をより汎用的なシェルスクリプトに移行することで、Goのビルドシステム全体の堅牢性とポータビリティを向上させることを目指しています。これにより、開発者はGNU Makeがインストールされていない環境でも、Goプロジェクトをより容易にビルド・テストできるようになります。
前提知識の解説
GNU Make
GNU Makeは、ソースコードから実行可能ファイルやライブラリを構築するためのビルド自動化ツールです。Makefile
と呼ばれる設定ファイルに基づいて動作し、ファイルの依存関係を管理し、必要なコマンドを自動的に実行します。例えば、C/C++プロジェクトでは、ソースファイルをコンパイルしてオブジェクトファイルを生成し、それらをリンクして最終的な実行可能ファイルを生成する一連のプロセスを自動化するのに広く使われます。
しかし、MakeはUnix系のシステムで広く使われている一方で、その構文や機能は環境によって微妙に異なることがあり、特にWindows環境では別途インストールが必要になるなど、クロスプラットフォームでの利用には課題が生じることがあります。
シェルスクリプト (Bash)
シェルスクリプトは、Unix系オペレーティングシステムのシェル(コマンドラインインタープリタ)によって実行されるスクリプト言語です。bash
(Bourne-Again SHell) は最も一般的なシェルの一つであり、多くのLinuxディストリビューションやmacOSでデフォルトのシェルとして採用されています。シェルスクリプトは、ファイルの操作、プログラムの実行、環境変数の設定など、システム管理や自動化タスクに広く利用されます。
Makeファイルと比較して、シンプルなタスクであればシェルスクリプトの方が直接的で、特定のビルドツールに依存しないため、より高いポータビリティを持つことがあります。
Goのビルドシステム
Go言語は、go build
コマンドという強力な組み込みビルドツールを提供しています。このコマンドは、ソースファイルのコンパイル、パッケージの依存関係解決、実行可能ファイルのリンクといった一連のビルドプロセスを自動的に処理します。Goのビルドシステムは、外部の複雑なビルドツールに依存することなく、Go言語自体で完結するように設計されています。これにより、Goプロジェクトは非常にシンプルで、クロスプラットフォームでのビルドが容易になっています。
Goプロジェクト内では、より複雑なビルドやテストの自動化が必要な場合でも、GNU Makeのような外部ツールに頼るのではなく、Go言語で書かれたカスタムツールや、シンプルなシェルスクリプトが好んで使用される傾向があります。これは、Goの自己完結性とポータビリティの哲学に合致するためです。
技術的詳細
このコミットの技術的な核心は、doc/articles/wiki/Makefile
が提供していたクリーンアップ機能を、同じディレクトリ内のシェルスクリプト doc/articles/wiki/test.bash
に移植することによって、GNU Makeへの依存を完全に排除した点にあります。
元々、doc/articles/wiki/Makefile
には clean
ターゲットが定義されており、これは get.bin
, final.bin
, a.out
といったビルド生成物を削除する役割を担っていました。この Makefile
を削除することで、GoプロジェクトはGNU Makeがシステムにインストールされていることを前提としなくなります。
Makefile
の削除に伴い、その clean
機能は doc/articles/wiki/test.bash
に直接組み込まれました。具体的には、test.bash
の冒頭部分に rm -f get.bin final.bin a.out
というコマンドが追加されました。これにより、test.bash
が実行されるたびに、以前 Makefile
が行っていたクリーンアップ処理が自動的に実行されるようになります。この変更は、クリーンアップロジックをビルドスクリプト自体に統合することで、外部ツールの必要性をなくします。
さらに、Goプロジェクト全体のテストを実行する src/run.bash
スクリプトも変更されました。以前のバージョンでは、doc/articles/wiki
ディレクトリのテストを実行する前に make clean
を明示的に呼び出していました。しかし、test.bash
が自身の実行時にクリーンアップを行うようになったため、src/run.bash
からの make clean
の呼び出しは冗長となり、削除されました。
これらの変更により、Goプロジェクトのビルドおよびテストプロセスは、GNU Makeという特定の外部ツールに依存することなく、よりシンプルでポータブルなシェルスクリプトベースのシステムへと移行しました。これは、Goの「自己完結型」という設計原則に沿った改善と言えます。
コアとなるコードの変更箇所
doc/articles/wiki/Makefile
: 削除doc/articles/wiki/test.bash
: 2行追加src/run.bash
: 1行削除
コアとなるコードの解説
doc/articles/wiki/Makefile
の削除
このファイルは、doc/articles/wiki
ディレクトリ内のGoのドキュメント記事に関連するビルドプロセスを管理するためのGNU Makeファイルでした。この Makefile
には、all
ターゲット(index.html
を生成)と clean
ターゲット(ビルドによって生成された一時ファイル get.bin
, final.bin
, a.out
を削除)が含まれていました。
--- a/doc/articles/wiki/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright 2010 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.
-
-all: index.html
-
-CLEANFILES=get.bin final.bin a.out
-
-clean:
-# rm -f $(CLEANFILES)
このファイルの削除は、Goプロジェクトがこの特定のビルドステップにおいてGNU Makeに依存しなくなることを意味します。これにより、GNU Makeがシステムにインストールされていない環境でも、関連するテストやビルドが実行可能になります。
doc/articles/wiki/test.bash
の変更
このシェルスクリプトは、doc/articles/wiki
ディレクトリ内のGoコードスニペットのコンパイルとテストを実行するためのものです。Makefile
の clean
ターゲットが削除されたため、その機能がこのスクリプトに直接移植されました。
--- a/doc/articles/wiki/test.bash
+++ b/doc/articles/wiki/test.bash
@@ -11,6 +11,8 @@ cleanup() {
}
trap cleanup 0 INT
+rm -f get.bin final.bin a.out
+\n # If called with -all, check that all code snippets compile.
if [ "$1" == "-all" ]; then
for fn in *.go; do
追加された rm -f get.bin final.bin a.out
の行は、test.bash
が実行されるたびに、以前 Makefile
が担当していたクリーンアップ処理(生成されたバイナリファイルの削除)を自動的に行います。これにより、テスト実行前にクリーンな状態が保証され、かつGNU Makeへの依存がなくなります。
src/run.bash
の変更
このスクリプトは、Goプロジェクト全体の様々なテストやビルドタスクを実行するための主要なシェルスクリプトです。以前のバージョンでは、doc/articles/wiki
ディレクトリのテストを実行する際に、明示的に make clean
コマンドを呼び出していました。
--- a/src/run.bash
+++ b/src/run.bash
@@ -166,7 +166,6 @@ time ./run || exit 1
[ "$GOARCH" == arm ] || # uses network, fails under QEMU
(xcd ../doc/articles/wiki
-make clean || exit 1
./test.bash || exit 1
) || exit $?\n
make clean || exit 1
の行が削除されたことで、src/run.bash
はもはやGNU Makeに依存しなくなりました。これは、doc/articles/wiki/test.bash
が自身の実行時にクリーンアップを行うようになったため、この呼び出しが冗長になったためです。この変更は、Goプロジェクトのビルドシステム全体からGNU Makeへの依存をさらに削減し、シンプルさを追求するGoの哲学を反映しています。
関連リンク
- Go言語公式ウェブサイト: https://golang.org/
- Goのビルドコマンド (
go build
): https://golang.org/cmd/go/#hdr-Compile_packages_and_dependencies - Goのコードレビューシステム (Gerrit): https://go-review.googlesource.com/
参考にした情報源リンク
- GNU Make 公式ドキュメント: https://www.gnu.org/software/make/manual/
- Bash プログラミング入門 (一般的なシェルスクリプトの概念理解のため): https://www.gnu.org/software/bash/manual/bash.html
- Goのビルドシステムに関する議論 (一般的な情報源): Goの公式ブログやデザインドキュメント (特定の記事はコミット内容から直接特定できないため、一般的な情報源として記載)