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

[インデックス 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コードスニペットのコンパイルとテストを実行するためのものです。Makefileclean ターゲットが削除されたため、その機能がこのスクリプトに直接移植されました。

--- 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の哲学を反映しています。

関連リンク

参考にした情報源リンク

  • GNU Make 公式ドキュメント: https://www.gnu.org/software/make/manual/
  • Bash プログラミング入門 (一般的なシェルスクリプトの概念理解のため): https://www.gnu.org/software/bash/manual/bash.html
  • Goのビルドシステムに関する議論 (一般的な情報源): Goの公式ブログやデザインドキュメント (特定の記事はコミット内容から直接特定できないため、一般的な情報源として記載)