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

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

このコミットは、Go言語のビルドスクリプトから相対パス指定の ./ を削除する変更です。これにより、ビルドシステムの堅牢性と移植性が向上し、将来的なパス解決の問題を未然に防ぐことを目的としています。

コミット

commit 6aa6fdcf71c9efa4c61e2db1eaf6a84cc720a855
Author: Russ Cox <rsc@golang.org>
Date:   Tue Jan 31 16:53:43 2012 -0500

    build: remove ./ from buildscripts
    
    Fixes #2753.
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/5609043

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

https://github.com/golang/go/commit/6aa6fdcf71c9efa4c61e2db1eaf6a84cc720a855

元コミット内容

Go言語のビルドスクリプトにおいて、ファイルパスの指定に ./ (カレントディレクトリを示す相対パス) が含まれている箇所を削除する。

変更の背景

この変更は、Go言語のIssue #2753 に対応するものです。当時のGoのビルドシステムでは、./ を含む相対パスが使用されていましたが、これは特定の環境や将来的なビルドツールの変更において問題を引き起こす可能性がありました。

具体的には、./ を明示的に含めることで、パス解決の際に予期せぬ挙動を招いたり、ビルドスクリプトの可読性を低下させたりするリスクがありました。例えば、./ が含まれていることで、シェルがパスを解釈する際に余分な処理が発生したり、異なるOS環境でのパスの正規化に影響を与えたりする可能性が考えられます。

このコミットの目的は、ビルドスクリプト内のファイルパス指定をよりシンプルかつ標準的な形式に統一し、ビルドプロセスの堅牢性と移植性を高めることにありました。./ を削除することで、パス解決がより直接的になり、潜在的な互換性の問題を回避できます。

前提知識の解説

  • ビルドスクリプト: ソフトウェアのコンパイル、リンク、パッケージングなどの一連のビルドプロセスを自動化するためのスクリプトです。シェルスクリプト(Bashなど)で記述されることが多く、Go言語のビルドにおいても、src/buildscript.sh や各OS・アーキテクチャごとのスクリプトが使用されていました。
  • 相対パスと絶対パス:
    • 絶対パス: ファイルやディレクトリの場所をルートディレクトリ(/C:\)から完全に指定するパスです。例: /home/user/documents/file.txt
    • 相対パス: 現在の作業ディレクトリを基準にしてファイルやディレクトリの場所を指定するパスです。./ はカレントディレクトリを、../ は親ディレクトリを示します。例: ./file.txt (カレントディレクトリの file.txt)
  • sed コマンド: Unix系OSで利用されるストリームエディタです。テキストの置換、削除、挿入などの操作を非対話的に行うことができます。このコミットでは、s; \\./; ;g のように正規表現を用いた置換処理に使用されています。
    • s: 置換コマンド
    • ;: デリミタ(通常は / が使われるが、置換対象に / が含まれる場合に別の文字を使う)
    • \\./: 置換対象のパターン。\ はエスケープ文字で、. は任意の1文字ではなくリテラルのドットを意味します。つまり、./ を探します。
    • : 置換後の文字列(空文字列なので削除を意味します)
    • g: グローバル置換(行内の全てのマッチを置換)
  • Go言語のビルドツールチェーン: Go言語のソースコードをコンパイルし、実行可能ファイルを生成するための一連のツール群です。
    • 8g, 6g: Go言語のコンパイラ(それぞれ386アーキテクチャ、amd64アーキテクチャ向け)。
    • 8c, 6c: C言語のコンパイラ(Goのランタイムや一部の標準ライブラリはCで書かれているため)。
    • 8a, 6a: アセンブラ(アセンブリ言語で書かれたコードをコンパイルするため)。
    • pack: アーカイブファイル(ライブラリ)を作成するツール。 これらのツールは、$GOROOT/bin/go-tool/ 以下に配置され、ビルドスクリプトから呼び出されます。

技術的詳細

このコミットの主要な変更は、Go言語のビルドスクリプト内でファイルパスを指定する際に使用されていた ./ プレフィックスを削除することです。これは、主に以下の2つの側面で実現されています。

  1. src/buildscript.sh における sed コマンドの追加: src/buildscript.sh は、Goのビルドプロセス全体を調整する上位レベルのスクリプトです。このスクリプトに、生成されるビルドコマンドから ./ を取り除く sed コマンドが追加されました。 具体的には、s; \\./; ;g という sed 式が追加されています。これは、スペースに続く ./ のパターンを空文字列に置換するものです。これにより、ビルドスクリプトが生成するコマンドライン引数から、不要な ./ が自動的に除去されるようになります。 この変更は、ビルドスクリプトが動的に生成するコマンドライン引数に対して適用されるため、広範囲にわたる影響を持ちます。

  2. 各OS・アーキテクチャ固有のビルドスクリプトの直接的な修正: src/buildscript/ ディレクトリ以下の、darwin_386.sh, linux_amd64.sh など、各OSとアーキテクチャに特化したビルドスクリプトが直接修正されています。これらのスクリプトでは、$GOROOT/bin/go-tool/ にあるコンパイラ (8g, 6g, 8c, 6c) やアセンブラ (8a, 6a)、アーカイブツール (pack) などのコマンドを呼び出す際に、引数として渡されるソースファイルやオブジェクトファイルのパスから明示的に ./ が削除されています。

    例えば、変更前は以下のような記述がありました。 "$GOROOT"/bin/go-tool/8g -o "$WORK"/runtime/_obj/_go_.8 -p runtime -+ -I "$WORK" ./debug.go ./error.go ...

    これが変更後には以下のようになります。 "$GOROOT"/bin/go-tool/8g -o "$WORK"/runtime/_obj/_go_.8 -p runtime -+ -I "$WORK" debug.go error.go ...

    この変更は、ビルドツールがファイルパスを解釈する際に、./ が存在しない方がより標準的で、かつ潜在的な問題(例えば、一部のツールが ./ を含むパスを正しく扱えない、あるいは余分な正規化処理を必要とするなど)を回避できるという思想に基づいています。ファイル名のみを指定することで、ツールは現在の作業ディレクトリを基準にファイルを探索するため、./ は冗長であり、場合によっては誤解を招く可能性がありました。

この二重のアプローチにより、ビルドシステム全体で ./ の使用が排除され、よりクリーンで予測可能なパス解決が実現されています。

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

このコミットでは、以下のファイルが変更されています。

  • 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

これらのファイルは、Go言語のビルドシステムの中核をなすシェルスクリプトであり、様々なOSとアーキテクチャに対応するためのビルド手順が記述されています。

コアとなるコードの解説

src/buildscript.sh の変更

--- a/src/buildscript.sh
+++ b/src/buildscript.sh
@@ -38,6 +38,7 @@ set -e
 		s;"\$GOBIN"/go;&_bootstrap;g
 		s/go_bootstrap-tool/go-tool/g
 		s;"\$GOBIN"/go-tool;"$GOROOT"/bin/go-tool;g
+		s; \./; ;g
 	')>$targ
 	chmod +x $targ

この変更は、src/buildscript.sh 内で、ビルドスクリプトのテンプレートを処理する sed コマンドに新しい置換ルールを追加しています。 追加された s; \\./; ;g は、スペースの後に続く ./ のパターンを空文字列に置換します。これにより、ビルドスクリプトが生成するコマンドライン引数から、明示的な ./ が自動的に取り除かれるようになります。これは、ビルドプロセス全体にわたってパスの正規化を行うための汎用的なメカニズムとして機能します。

各OS・アーキテクチャ固有のビルドスクリプトの変更例 (src/buildscript/darwin_386.sh の一部)

--- a/src/buildscript/darwin_386.sh
+++ b/src/buildscript/darwin_386.sh
@@ -17,53 +17,53 @@ set -e
 
 mkdir -p "$WORK"/runtime/_obj/
 cd "$GOROOT"/src/pkg/runtime
-"$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/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
 cp "$GOROOT"/src/pkg/runtime/arch_386.h "$WORK"/runtime/_obj/arch_GOARCH.h
 cp "$GOROOT"/src/pkg/runtime/defs_darwin_386.h "$WORK"/runtime/_obj/defs_GOOS_GOARCH.h
 cp "$GOROOT"/src/pkg/runtime/os_darwin.h "$WORK"/runtime/_obj/os_GOOS.h
 cp "$GOROOT"/src/pkg/runtime/signals_darwin.h "$WORK"/runtime/_obj/signals_GOOS.h
 cp "$GOROOT"/src/pkg/runtime/zasm_darwin_386.h "$WORK"/runtime/_obj/zasm_GOOS_GOARCH.h
-"$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
-"$GOROOT"/bin/go-tool/8c -FVw -I "$WORK"/runtime/_obj/ -I "$GOROOT"/pkg/darwin_386 -o "$WORK"/runtime/_obj/atomic_386.8 -DGOOS_darwin -DGOARCH_386 ./atomic_386.c
...
-"$GOROOT"/bin/go-tool/8a -I "$WORK"/runtime/_obj/ -o "$WORK"/runtime/_obj/rt0_darwin_386.8 -DGOOS_darwin -DGOARCH_386 ./rt0_darwin_386.s
+"$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
+"$GOROOT"/bin/go-tool/8c -FVw -I "$WORK"/runtime/_obj/ -I "$GOROOT\"/pkg/darwin_386 -o \"$WORK\"/runtime/_obj/atomic_386.8 -DGOOS_darwin -DGOARCH_386 atomic_386.c
...
+"$GOROOT"/bin/go-tool/8a -I "$WORK"/runtime/_obj/ -o "$WORK"/runtime/_obj/rt0_darwin_386.8 -DGOOS_darwin -DGOARCH_386 rt0_darwin_386.s

この例は、darwin_386.sh における変更を示しています。8g (Goコンパイラ)、8c (Cコンパイラ)、8a (アセンブラ) などのコマンド呼び出しにおいて、引数として渡されるソースファイル (.go, .c, .s ファイル) のパスから、明示的に記述されていた ./ が削除されています。

これは、各ビルドスクリプトが直接的にファイルパスの指定を修正することで、ビルドツールがより簡潔なファイル名で操作できるようにするためです。これにより、ビルドコマンドの冗長性が排除され、パス解決のロジックが簡素化されます。

これらの変更は、Go言語のビルドシステムが、ファイルパスの指定に関してよりクリーンで標準的なアプローチを採用したことを示しています。これは、ビルドの信頼性と将来的なメンテナンス性を向上させる上で重要なステップでした。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント (ビルドシステムに関する一般的な情報)
  • sed コマンドのmanページまたはオンラインリファレンス
  • Go言語のIssueトラッカー (GitHub)
  • Go言語のコードレビューシステム (Gerrit)