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

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

このコミットは、Go言語のビルドシステムから、特定のシェルスクリプト群を削除するものです。これには、OSやアーキテクチャごとのビルドスクリプト、およびランタイム関連のスクリプトが含まれます。これは、Goのビルドプロセスがより統合されたGoネイティブのツールに移行する過程の一部を示しています。

コミット

commit 961f96b5d273647c02247d8d20fda4199dd134d9
Author: Russ Cox <rsc@golang.org>
Date:   Sat Feb 4 00:54:26 2012 -0500

    build: delete buildscripts, runtime scripts
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/5620059

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

https://github.com/golang/go/commit/961f96b5d273647c02247d8d20fda4199dd134d9

元コミット内容

Go言語のビルドシステムから、src/buildscript.sh および src/buildscript/ ディレクトリ内のOS/アーキテクチャ固有のビルドスクリプト、さらに src/pkg/runtime/autogen.shsrc/pkg/runtime/mkgodefs.sh といったランタイム関連のスクリプトを削除します。合計17ファイル、7166行の削除が行われています。

変更の背景

このコミットは、Go言語のビルドシステムが初期のシェルスクリプトベースのアプローチから、より堅牢でGo言語自体で書かれたツール (distツールなど) へと移行する過渡期に位置しています。2012年3月のGo 1.0リリースに合わせて、ビルドプロセスは外部スクリプトへの依存を減らし、gcツールチェインのビルドとgoツール自体のブートストラップを管理するための新しいdistツールが導入されました。この変更は、ビルドプロセスの合理化と、Goエコシステム内での自己完結性を高めることを目的としています。

初期のGoのビルドは、様々なプラットフォームとアーキテクチャに対応するために、多くのシェルスクリプトに依存していました。しかし、これらのスクリプトはメンテナンスが複雑になりがちで、Go言語の進化とともに、より統一された、Go言語の哲学に沿ったビルドシステムが求められるようになりました。このコミットは、その移行の一環として、役割を終えた古いビルドスクリプト群を削除するものです。

前提知識の解説

  • Go言語のビルドプロセス: Go言語のビルドは、通常、go buildコマンドによって行われます。しかし、Goコンパイラやツールチェイン自体をビルドする際には、より低レベルなブートストラッププロセスが必要です。初期のGoでは、このブートストラッププロセスはシェルスクリプトによって管理されていました。
  • ブートストラップ (Bootstrap): コンパイラやツールチェインが、それ自身をコンパイルできる状態になるまでの初期ビルドプロセスのこと。Goの場合、初期のコンパイラはC言語などで書かれていましたが、Go言語が成熟するにつれて、Go言語自身で書かれたコンパイラがGo言語のコードをコンパイルできるようになりました。
  • クロスコンパイル (Cross-compilation): あるプラットフォーム(OS/アーキテクチャ)上で、別のプラットフォーム向けの実行ファイルを生成するプロセス。Goは設計当初からクロスコンパイルを強力にサポートしており、初期のビルドスクリプトもこの機能を実現するためにプラットフォーム固有のロジックを含んでいました。
  • buildscript.sh: このスクリプトは、Goのビルドシステムにおいて、各OS/アーキテクチャ(例: darwin_386.sh, linux_amd64.shなど)に対応する具体的なビルドスクリプトを自動生成する役割を担っていました。これらの生成されたスクリプトは、Goのツールチェイン(コンパイラ、アセンブラ、リンカなど)と標準ライブラリを特定のターゲット向けにビルドするための詳細なコマンドを含んでいました。
  • mkgodefs.sh: src/pkg/runtime/mkgodefs.sh は、Goのランタイムパッケージで使用されるC言語のヘッダファイルから、Go言語の定義(構造体、定数など)を自動生成するためのスクリプトです。これは、GoランタイムがC言語で書かれた部分とGo言語で書かれた部分との間でデータをやり取りするために必要でした。
  • autogen.sh: src/pkg/runtime/autogen.sh は、ランタイムパッケージ内の自動生成されるファイルを管理するためのスクリプトです。

技術的詳細

このコミットは、Goのビルドシステムがシェルスクリプトの集合体から、Go言語で書かれた単一のgoコマンド(およびその内部で利用されるdistツール)による統合されたビルドシステムへと移行する大きな一歩を示しています。

以前のビルドシステムでは、buildscript.shが各ターゲットプラットフォーム(例: darwin_386, linux_amd64など)に対応する具体的なビルド手順を記述したシェルスクリプト(例: darwin_386.sh)を生成していました。これらの生成されたスクリプトは、Goのコンパイラ(8g, 6gなど)、アセンブラ(8a, 6aなど)、リンカ(8l, 6lなど)といったツールを呼び出し、Goの標準ライブラリやcmd/go(Goコマンド自体)をビルドしていました。各スクリプトは、特定のOSとアーキテクチャに特化したコンパイルフラグ、ライブラリのパス、オブジェクトファイルの配置などを細かく指定していました。

このコミットによってこれらのスクリプトが削除されたことは、これらのビルドロジックがGo言語で書かれた新しいビルドツール(具体的にはgoコマンドの内部ロジックやdistツール)に吸収されたことを意味します。これにより、ビルドの複雑性がシェルスクリプトの外部依存からGo言語のコード内部に移動し、より一貫性のある、プラットフォームに依存しない方法でビルドが管理されるようになりました。

また、src/pkg/runtime/autogen.shsrc/pkg/runtime/mkgodefs.shの削除は、ランタイム関連のコード生成プロセスもGoネイティブのツールに置き換えられたことを示唆しています。これにより、CgoやアセンブリコードとGoコード間のインターフェース定義の生成も、よりGoのツールチェインに統合された形で行われるようになりました。

この変更は、Go 1.0の安定性と移植性を高める上で重要な役割を果たしました。ビルドプロセスがGo言語自体で管理されることで、ビルドの信頼性が向上し、新しいプラットフォームへの対応やビルドシステムの改善が容易になりました。

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

このコミットは、以下のファイル群の削除のみで構成されています。

  • src/buildscript.sh: 各OS/アーキテクチャ固有のビルドスクリプトを生成するメインスクリプト。
  • 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とCPUアーキテクチャ向けのGoツールチェインと標準ライブラリをビルドするための詳細なシェルスクリプトです。各ファイルには、mkdir, cd, tool/8g (Goコンパイラ), tool/8c (Cコンパイラ), tool/8a (アセンブラ), tool/pack (アーカイバ), tool/8l (リンカ) などのコマンドが羅列されており、各パッケージのコンパイルとリンクの手順が記述されていました。
  • src/pkg/runtime/autogen.sh: ランタイムパッケージの自動生成ファイルを管理するスクリプト。
  • src/pkg/runtime/mkgodefs.sh: CヘッダからGo定義を生成するスクリプト。

これらのファイルはすべて削除されており、新しいビルドシステムがその機能を内部的に処理するようになったことを示しています。

コアとなるコードの解説

このコミットには、追加されたコードはありません。すべての変更はファイルの削除です。

削除された各src/buildscript/*.shファイルは、Goの初期のビルドシステムにおける「レシピ」のようなものでした。例えば、src/buildscript/darwin_386.shは、macOS (darwin) の32ビット (386) 環境向けにGoをビルドするための具体的なステップを定義していました。これには、runtimeerrorssync/atomiciounicodebytesmathstringsstrconvbufiosortcontainer/heapencoding/base64syscalltimeosreflectfmtunicode/utf16encoding/jsonflagencoding/gobgo/tokenpath/filepathgo/scannergo/astio/ioutilgo/parserlogpathgo/buildos/execregexp/syntaxregexpnet/urltext/template/parsetext/template、そしてcmd/goといったGoの標準ライブラリやツール群を、それぞれの依存関係に従ってコンパイルし、アーカイブし、最終的にリンクする手順が記述されていました。

これらのスクリプトは、Goのコンパイラ(例: 8g6g)、アセンブラ(例: 8a6a)、リンカ(例: 8l6l)といった低レベルのツールを直接呼び出していました。各パッケージのビルドは、mkdir -pでオブジェクトディレクトリを作成し、cdでそのパッケージのソースディレクトリに移動し、$GOROOT/bin/tool/<compiler>でGoソースをコンパイルし、$GOROOT/bin/tool/<assembler>でアセンブリソースをコンパイルし、$GOROOT/bin/tool/packでアーカイブを作成し、最後にcpで生成されたアーカイブを$GOROOT/pkg/<GOOS_GOARCH>/にコピーするという一連のプロセスで行われていました。

これらのスクリプトが削除されたのは、これらの複雑なビルドロジックが、Go言語自体で書かれた新しいビルドツール(主にcmd/goパッケージ内のロジックと、そのブートストラップを担うdistツール)に完全に統合されたためです。これにより、ビルドの定義がシェルスクリプトという外部の形式から、Go言語のコードという内部の形式に移行し、ビルドシステムの保守性、拡張性、そしてクロスプラットフォーム対応能力が大幅に向上しました。

関連リンク

参考にした情報源リンク