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

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

このコミットは、Go言語のビルドシステムにおけるパスの変更に関するものです。具体的には、Goツールが配置されるディレクトリの名称が $GOROOT/bin/go-tool から $GOROOT/bin/tool へと変更されました。この変更は、ツールが $GOROOT 内に存在することが前提となるため、「go-」というプレフィックスが冗長であるという認識に基づいています。

コミット

commit b3750ff52d7da7d35c590451ba50833149ac3fc1
Author: Russ Cox <rsc@golang.org>
Date:   Thu Feb 2 23:32:41 2012 -0500

    build: rename $GOROOT/bin/go-tool to $GOROOT/bin/tool.
    
    The go- is redundant now that the directory is required
    to be inside $GOROOT.  Rob LGTMed the idea.
    
    R=golang-dev, gri
    CC=golang-dev
    https://golang.org/cl/5618044

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

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

元コミット内容

build: rename $GOROOT/bin/go-tool to $GOROOT/bin/tool.

The go- is redundant now that the directory is required
to be inside $GOROOT.  Rob LGTMed the idea.

変更の背景

この変更の背景には、Go言語のビルドシステムにおけるパスの簡素化と一貫性の向上が挙げられます。以前はGo言語のコンパイラやアセンブラなどのツール群が $GOROOT/bin/go-tool というディレクトリに配置されていました。しかし、これらのツールがGoのインストールルートディレクトリである $GOROOT の中に存在することが明確になったため、「go-」というプレフィックスが冗長であると判断されました。

Goのツール群はGo言語のビルドプロセスにおいて不可欠な要素であり、そのパスはビルドスクリプトやMakefileなど、多くの場所で参照されます。この冗長なプレフィックスを削除することで、パスの記述が短くなり、コードの可読性が向上し、将来的なメンテナンスが容易になるというメリットがあります。また、Goプロジェクト全体での命名規則の統一にも寄与します。

前提知識の解説

このコミットを理解するためには、以下のGo言語のビルドシステムに関する基本的な知識が必要です。

  • $GOROOT: Go言語のインストールルートディレクトリを指す環境変数です。Goの標準ライブラリ、ツール、ソースコードなどがこのディレクトリ以下に配置されます。
  • Goツールチェーン: Go言語のプログラムをビルド、テスト、実行するために使用される一連のツール群を指します。これには、コンパイラ (go tool compile の内部で使われる 8g/6g など)、アセンブラ (8a/6a など)、リンカ (8l/6l など)、パッケージアーカイブツール (pack) などが含まれます。
  • go tool コマンド: Go 1.0以降、Goツールチェーンの個々のツールは go tool <toolname> の形式で実行されるようになりました。例えば、コンパイラは go tool compile のように呼び出されます。このコミットが行われた2012年2月時点では、まだ go tool コマンドが導入されたばかりか、あるいはその過渡期であったため、ビルドスクリプト内では直接 $GOROOT/bin/go-tool/<toolname> のようなパスでツールが参照されていました。
  • Makefile: ソフトウェアのビルドプロセスを自動化するためのツールである make が使用する設定ファイルです。Goのビルドシステムでは、様々なコンポーネントのビルド手順がMakefileに記述されています。
  • ビルドスクリプト (buildscript.sh など): Goのクロスコンパイルや特定の環境向けのビルドを行うためのシェルスクリプトです。これらのスクリプト内でGoツールチェーンのパスが直接指定されることがあります。
  • 8g, 6g, 8c, 6c, 8a, 6a, 8l, 6l: これらはGo言語の初期のコンパイラ、アセンブラ、リンカの実行ファイル名です。数字はターゲットアーキテクチャのビット数を表し、8 は386 (32-bit x86)、6 はamd64 (64-bit x86) を指します。g はGoコンパイラ、c はCコンパイラ、a はアセンブラ、l はリンカを意味します。
  • pack: Goのパッケージアーカイブを作成・操作するためのツールです。

技術的詳細

このコミットの技術的詳細は、Goビルドシステム内の様々なファイルで $GOROOT/bin/go-tool という文字列が $GOROOT/bin/tool に置換されている点に集約されます。影響を受けるファイルは主に以下のカテゴリに分類されます。

  1. Makefile (src/Make.ctool, src/Make.inc, src/cmd/cov/Makefile, src/cmd/prof/Makefile):

    • src/Make.ctool: C言語で書かれたツールをビルドするためのMakefileです。ツールのインストール先ディレクトリが $(GOROOT)/bin/go-tool から $(GOROOT)/bin/tool に変更されています。
    • src/Make.inc: Goのビルドシステム全体でインクルードされる共通のMakefileです。ここで定義されている AS (アセンブラ), CC (Cコンパイラ), GC (Goコンパイラ), LD (リンカ) などのツールへのパスが $(QUOTED_GOROOT)/bin/go-tool/ から $(QUOTED_GOROOT)/bin/tool/ に変更されています。
    • src/cmd/cov/Makefile, src/cmd/prof/Makefile: 特定のコマンドのMakefileでも、ツールへのパスが同様に更新されています。
  2. ビルドスクリプト (src/buildscript.sh, src/buildscript/*.sh):

    • src/buildscript.sh: メインのビルドスクリプトで、パスの置換ロジックが含まれています。go_bootstrap-toolgo-tool に、そして $GOBIN/go-tool$GOROOT/bin/go-tool に置換される部分が削除され、代わりに $GOBIN/tool$GOROOT/bin/tool に置換されるように変更されています。これは、ビルドプロセス中に一時的に使用されるパスの正規化に関する変更です。
    • src/buildscript/darwin_386.sh, src/buildscript/darwin_amd64.sh, src/buildscript/freebsd_386.sh, src/buildscript/freebsd_amd64.sh, src/buildscript/linux_386.sh, src/buildscript/linux_amd64.sh, src/buildscript/linux_arm.sh, src/buildscript/netbsd_386.sh, src/buildscript/netbsd_amd64.sh, src/buildscript/openbsd_386.sh, src/buildscript/openbsd_amd64.sh, src/buildscript/plan9_386.sh, src/buildscript/windows_386.sh, src/buildscript/windows_amd64.sh: これらの各OSおよびアーキテクチャ固有のビルドスクリプトでは、Goツールチェーンの各ツール(例: 8g, 8c, 8a, pack など)を呼び出す際の絶対パスが、すべて $GOROOT/bin/go-tool/ から $GOROOT/bin/tool/ に変更されています。これは、Goの標準ライブラリパッケージ(runtime, errors, sync/atomic, sync, io, unicode, unicode/utf8, bytes, math, strings, strconv, bufio, sort, container/heap, encoding/base64, syscall, time, os, reflect, fmt, unicode/utf16, encoding/json, flag, encoding/gob, go/token, path/filepath, go/scanner, go/ast, io/ioutil, go/parser, log, path, go/build, os/exec, regexp/syntax, regexp, net/url, text/template/parse, text/template, cmd/go)のコンパイルおよびアーカイブ化のコマンドに影響を与えています。
  3. その他のスクリプト (src/make.bash, src/pkg/runtime/autogen.sh, src/pkg/runtime/mkasmh.sh, src/pkg/runtime/mkgodefs.sh, test/run):

    • src/make.bash: Goのビルドプロセスを制御するシェルスクリプトです。ここでもパスの置換が行われています。
    • src/pkg/runtime/autogen.sh, src/pkg/runtime/mkasmh.sh, src/pkg/runtime/mkgodefs.sh: ランタイム関連の自動生成スクリプトでも、Goツールへのパスが更新されています。
    • test/run: テスト実行スクリプトでも、ツールへのパスが変更されています。

この変更は、Goのビルドシステム全体にわたる広範なパスの更新であり、Goツールチェーンの配置に関する標準化と簡素化を目的としています。

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

このコミットにおけるコアとなるコードの変更は、Goのビルドシステム全体で $GOROOT/bin/go-tool という文字列を $GOROOT/bin/tool に置換する作業です。具体的な変更箇所は以下のファイル群にわたります。

  • src/Make.ctool
  • src/Make.inc
  • src/buildscript.sh
  • src/buildscript/darwin_386.sh
  • src/buildscript/darwin_amd64.sh
  • src/buildscript/freebsd_386.sh
  • src/buildscript/freebsd_amd64.sh
  • src/buildscript/linux_386.sh
  • src/buildscript/linux_amd64.sh
  • src/buildscript/linux_arm.sh
  • src/buildscript/netbsd_386.sh
  • src/buildscript/netbsd_amd64.sh
  • src/buildscript/openbsd_386.sh
  • src/buildscript/openbsd_amd64.sh
  • src/buildscript/plan9_386.sh
  • src/buildscript/windows_386.sh
  • src/buildscript/windows_amd64.sh
  • src/cmd/cov/Makefile
  • src/cmd/go/pkg.go
  • src/cmd/go/tool.go
  • src/cmd/prof/Makefile
  • src/make.bash
  • src/pkg/exp/types/gcimporter_test.go
  • src/pkg/runtime/autogen.sh
  • src/pkg/runtime/mkasmh.sh
  • src/pkg/runtime/mkgodefs.sh
  • test/fixedbugs/bug302.go
  • test/run

これらのファイルでは、Goツールチェーンの実行ファイルへのパス指定が、一貫して新しいディレクトリ名に更新されています。

コアとなるコードの解説

変更の核心は、GoのビルドシステムがGoツール(コンパイラ、アセンブラ、リンカなど)を見つけるためのパスの定義と使用方法の変更です。

例えば、src/Make.inc では、Goツールチェーンの各ツールへのパスが以下のように変更されています。

変更前:

AS=$(QUOTED_GOROOT)/bin/go-tool/$(O)a
CC=$(QUOTED_GOROOT)/bin/go-tool/$(O)c
GC=$(QUOTED_GOROOT)/bin/go-tool/$(O)g
LD=$(QUOTED_GOROOT)/bin/go-tool/$(O)l
HOST_CC=$(QUOTED_GOROOT)/bin/go-tool/quietgcc
HOST_LD=$(QUOTED_GOROOT)/bin/go-tool/quietgcc

変更後:

AS=$(QUOTED_GOROOT)/bin/tool/$(O)a
CC=$(QUOTED_GOROOT)/bin/tool/$(O)c
GC=$(QUOTED_GOROOT)/bin/tool/$(O)g
LD=$(QUOTED_GOROOT)/bin/tool/$(O)l
HOST_CC=$(QUOTED_GOROOT)/bin/tool/quietgcc
HOST_LD=$(QUOTED_GOROOT)/bin/tool/quietgcc

ここで、$(O)a はアセンブラ (8a6a など)、$(O)c はCコンパイラ (8c6c など)、$(O)g はGoコンパイラ (8g6g など)、$(O)l はリンカ (8l6l など) を指します。$(QUOTED_GOROOT)$GOROOT 環境変数の値が引用符で囲まれたものです。

また、各OS/アーキテクチャごとのビルドスクリプト(例: src/buildscript/darwin_386.sh)では、Goパッケージをビルドする際のコマンドライン引数として、明示的にGoツールへのパスが指定されていました。

変更前 (例: darwin_386.sh の一部):

"$GOROOT"/bin/go-tool/8g -o "$WORK"/runtime/_obj/_go_.8 -p runtime -+ -I "$WORK" debug.go error.go extern.go mem.go sig.go softfloat64.go type.go zgoarch_386.go zgoos_darwin.go zruntime_defs_darwin_386.go zversion.go
"$GOROOT"/bin/go-tool/8c -FVw -I "$WORK"/runtime/_obj/ -I "$GOROOT"/pkg/darwin_386 -o "$WORK"/runtime/_obj/alg.8 -DGOOS_darwin -DGOARCH_386 alg.c

変更後 (例: darwin_386.sh の一部):

"$GOROOT"/bin/tool/8g -o "$WORK"/runtime/_obj/_go_.8 -p runtime -+ -I "$WORK" debug.go error.go extern.go mem.go sig.go softfloat64.go type.go zgoarch_386.go zgoos_darwin.go zruntime_defs_darwin_386.go zversion.go
"$GOROOT"/bin/tool/8c -FVw -I "$WORK"/runtime/_obj/ -I "$GOROOT"/pkg/darwin_386 -o "$WORK\"/runtime/_obj/alg.8 -DGOOS_darwin -DGOARCH_386 alg.c

これらの変更は、GoのビルドシステムがGoツールを見つけるための内部的な参照パスを統一し、より簡潔な命名規則に移行したことを示しています。これにより、ビルドスクリプトやMakefileの記述が整理され、Goのビルド環境の管理がより効率的になります。

関連リンク

参考にした情報源リンク

  • Go言語のGitリポジトリ: https://github.com/golang/go
  • Go Code Review (CL 5618044): https://golang.org/cl/5618044 (コミットメッセージに記載されているCLリンク)
  • Go言語のビルドプロセスに関する一般的な情報源 (例: Goのソースコード、Goのメーリングリストアーカイブなど)