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

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

このコミットは、Go言語のビルドシステムにおける重要な変更を示しています。従来のMakefileに依存したビルドプロセスから、Go自身のgo tool distコマンドを利用した、よりGoネイティブなビルドシステムへの移行の一環として、不要になったMakefile関連のファイルを削除しています。

コミット

  • コミットハッシュ: fec7fa8b9deb5f0c08c546ad2ba121d78e104163
  • 作者: Russ Cox rsc@golang.org
  • コミット日時: Mon Feb 6 13:34:25 2012 -0500

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/fec7fa8b9deb5f0c08c546ad2ba121d78e104163

元コミット内容

    build: delete make paraphernalia
    
    As a convenience to people working on the tools,
    leave Makefiles that invoke the go dist tool appropriately.
    They are not used during the build.
    
    R=golang-dev, bradfitz, n13m3y3r, gustavo
    CC=golang-dev
    https://golang.org/cl/5636050

変更の背景

Go言語の初期のビルドシステムは、C言語で書かれたコンパイラやリンカなどのツール群(5c, 6c, 8cなど)をビルドするためにmakeユーティリティと多数のMakefileを使用していました。しかし、Go言語自体が成熟し、そのエコシステムが拡大するにつれて、Go自身のツール(go toolコマンド群)がビルドプロセス全体を管理する方が効率的かつ一貫性があるという方針に転換しました。

このコミットは、その移行プロセスにおける重要なステップです。go tool distコマンドがGoのビルドとインストールを完全に担当するようになったため、従来のMakefile群は不要になりました。これらのMakefileは、ビルドプロセス中に使用されなくなったため、コードベースのクリーンアップと簡素化のために削除されました。ただし、ツール開発者の便宜のために、go tool distを適切に呼び出すMakefileは一部残されています。これは、Goのビルドシステムが完全にGo自身で完結することを目指すという長期的なビジョンに基づいています。

前提知識の解説

MakefileとMakeユーティリティ

Makefileは、プログラムのコンパイルやインストールなどのタスクを自動化するためのルールを記述するファイルです。makeユーティリティは、このMakefileを読み込み、依存関係に基づいてコマンドを実行します。C/C++プロジェクトなどで広く利用されており、複雑なビルドプロセスを管理するのに役立ちます。Go言語の初期バージョンでは、C言語で書かれたコンパイラツールチェーンのビルドにmakeが活用されていました。

Go言語のビルドシステムとgo tool dist

Go言語は、その設計思想として「シンプルさ」と「自己完結性」を重視しています。ビルドシステムも例外ではなく、最終的にはGo自身でGoをビルドできる(ブートストラップ)ように設計されています。

go tool distは、GoのソースコードからGoのツールチェーン全体(コンパイラ、リンカ、アセンブラなど)をビルドし、インストールするための内部コマンドです。これは、Goのソースツリーのルートにあるsrc/make.bash(またはsrc/make.bat)スクリプトによって呼び出され、Goのビルドプロセス全体をオーケストレーションします。go tool distは、Goのクロスコンパイル能力を最大限に活用し、異なるアーキテクチャやOS向けのバイナリを効率的に生成します。

このコマンドの導入により、Goのビルドは外部のmakeユーティリティに依存することなく、Go自身のツールによって完結するようになりました。これにより、ビルド環境のセットアップが簡素化され、Goのビルドプロセスがよりポータブルで予測可能になりました。

技術的詳細

このコミットの技術的な核心は、Goのビルドシステムがmakeベースの外部依存から、go tool distを中心としたGoネイティブな内部依存へと移行した点にあります。

従来のGoのビルドプロセスでは、src/Make.incのような共通のMakefileインクルードファイルが存在し、各ツール(例: src/cmd/5a/Makefile)がこれをインクルードしてビルドルールを定義していました。これらのMakefileは、Cコンパイラ(HOST_CC)、リンカ(HOST_LD)、アセンブラ(AS)などのツールを呼び出し、オブジェクトファイル(.o)や実行可能ファイル(.exe)を生成していました。また、bisonなどの外部ツールも利用していました。

go tool distの導入により、これらの低レベルなビルドステップはgo tool distの内部ロジックにカプセル化されました。go tool distは、Goのソースコードを解析し、必要な依存関係を解決し、適切なコンパイラやリンカを呼び出して最終的なバイナリを生成します。これにより、個々のMakefileで定義されていた複雑なビルドロジックが不要になりました。

コミットメッセージにある「As a convenience to people working on the tools, leave Makefiles that invoke the go dist tool appropriately. They are not used during the build.」という記述は、この移行の過渡期における配慮を示しています。完全にMakefileを排除するのではなく、開発者が慣れ親しんだmakeコマンドを使ってgo tool distを呼び出せるように、一部のMakefile(例えば、src/Make.dist)を残すことで、開発体験の急激な変化を避けています。しかし、これらの残されたMakefileは、もはやビルドの「主役」ではなく、単なるラッパーとしての役割しか持っていません。

この変更は、Goプロジェクトのビルドシステムをより堅牢で、保守しやすく、そしてGoの哲学に沿ったものにするための重要な一歩でした。

コアとなるコードの変更箇所

このコミットでは、主に以下のファイルが削除され、src/Make.distが新規追加されています。

削除されたファイル(一部抜粋):

  • src/Make.ccmd: C言語で書かれたコマンドのビルド用Makefileインクルード。
  • src/Make.clib: C言語で書かれたライブラリのビルド用Makefileインクルード。
  • src/Make.cmd: Go言語で書かれたコマンドのビルド用Makefileインクルード。
  • src/Make.common: 共通のMakefileルール。
  • src/Make.ctool: C言語で書かれたツールのビルド用Makefileインクルード。
  • src/Make.inc: 全てのGoのMakefileにインクルードされる共通設定ファイル。
  • src/all-qemu.bash: QEMU環境でのテスト実行スクリプト。
  • src/buildinfo.sh: ビルド情報(アーキテクチャ、OSなど)を定義するスクリプト。
  • src/cmd/*/Makefile: 各種Goツール(5a, 5c, 5g, 5l, 6a, 6c, 6g, 6l, 8a, 8c, 8g, 8l, cc, cov, gc, nm, pack, prof)のMakefile
  • src/lib9/Makefile: Plan 9互換ライブラリlib9Makefile
  • src/libbio/Makefile: I/OライブラリlibbioMakefile
  • src/libmach/Makefile: マシン依存ライブラリlibmachMakefile
  • src/quietgcc.bash: GCCの出力を抑制するラッパースクリプト。
  • src/version.bash: Goのバージョン情報を取得するスクリプト。

新規追加されたファイル:

  • src/Make.dist: go tool distを呼び出すための簡素化されたMakefile

コアとなるコードの解説

新規追加されたsrc/Make.distの内容は以下の通りです。

# Copyright 2012 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.

# Run go tool dist to install a command.
# The -vv causes dist to print each build command as it runs.
# go tool dist clean cleans all directories, not just this one,
# but it's as close as we can get.

# Default target (first).
install:
	go tool dist install -vv

clean:
	go tool dist clean

このMakefileは非常にシンプルで、installcleanという二つのターゲットのみを定義しています。

  • installターゲット: go tool dist install -vvコマンドを実行します。
    • go tool dist install: Goのツールチェーンをビルドし、インストールする主要なコマンドです。
    • -vv: 詳細な(verbose)出力を有効にし、ビルド中に実行される各コマンドを表示します。これにより、ビルドプロセスの透明性が向上します。
  • cleanターゲット: go tool dist cleanコマンドを実行します。
    • go tool dist clean: ビルドによって生成された一時ファイルやバイナリをクリーンアップします。コメントにもあるように、これは現在のディレクトリだけでなく、全てのビルドディレクトリをクリーンアップします。

このMake.distファイルは、従来の複雑なビルドロジックを全てgo tool distに委譲していることを明確に示しています。各src/cmd/*/Makefileファイルは、このMake.distをインクルードするように変更されており、これにより個別のツールのビルドがgo tool distによって一元的に管理されるようになりました。

例えば、src/cmd/5a/Makefileの変更は以下のようになっています。

変更前:

include ../../Make.inc
O:=$(HOST_O)

TARG=5a

HFILES=\
	a.h\
	y.tab.h\
	../5l/5.out.h\

OFILES=\
	y.tab.$O\
	lex.$O\
	../5l/enam.$O\

YFILES=\
	a.y\

include ../../Make.ctool

lex.$O:	../cc/macbody ../cc/lexbody

変更後:

# Copyright 2012 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.

include ../../Make.dist

install: y.tab.h

y.tab.h: a.y
	LANG=C LANGUAGE=en_US.UTF8 bison -v -y a.y

変更後を見ると、../../Make.inc../../Make.ctoolのインクルードが削除され、代わりに../../Make.distがインクルードされています。これにより、5aツールのビルドはgo tool distに任され、Makefile自体はy.tab.hの生成(bisonの実行)のような、Goツールチェーンの外部で処理する必要がある特定のタスクのみを扱うようになっています。

この変更は、GoのビルドシステムがGo自身によって管理されるという、Goプロジェクトの長期的な戦略を反映しています。

関連リンク

参考にした情報源リンク