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

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

このコミットは、Go言語のビルドスクリプトの構成に関する変更を扱っています。具体的には、Goプロジェクトのビルドプロセスで使用される様々なプラットフォーム固有のビルドスクリプトを、srcディレクトリ直下からsrc/buildscriptという専用のサブディレクトリに移動させるものです。これにより、プロジェクトのファイル構造が整理され、ビルド関連のファイルが一箇所に集約されることで、管理が容易になり、コードベースの可読性が向上します。

コミット

commit c5f843326100ae925529ed330e280bcc159d4776
Author: Shenghou Ma <minux.ma@gmail.com>
Date:   Tue Jan 17 11:18:15 2012 -0500

    buildscripts: move to buildscript directory
            Fixes #2717.
    
    R=r, rsc, dsymonds
    CC=golang-dev
    https://golang.org/cl/5545069

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

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

元コミット内容

このコミットの元のメッセージは以下の通りです。

buildscripts: move to buildscript directory
        Fixes #2717.

R=r, rsc, dsymonds
CC=golang-dev
https://golang.org/cl/5545069

これは、ビルドスクリプトをbuildscriptディレクトリに移動させることを目的とし、Issue #2717を修正するものであることを示しています。

変更の背景

Go言語のプロジェクトは、様々なオペレーティングシステム(OS)とアーキテクチャ(CPU)の組み合わせ(例: Linux/amd64, Windows/386, Darwin/armなど)に対応するために、それぞれの環境に特化したビルドスクリプトを必要とします。コミット前の状態では、これらのビルドスクリプトがsrcディレクトリの直下に散在していました。

このような配置は、ファイル数が増えるにつれてsrcディレクトリのルートが肥大化し、関連性の高いファイルが分散してしまうという問題を引き起こします。これにより、開発者がビルド関連のファイルを見つけにくくなったり、プロジェクト全体の構造を把握しにくくなったりする可能性があります。

このコミットは、これらのビルドスクリプトをsrc/buildscriptという専用のサブディレクトリに移動させることで、ファイル構造を整理し、ビルド関連のファイルを一元管理することを目的としています。これは、コードベースの保守性と可読性を向上させるための一般的なリファクタリングの一環です。Fixes #2717という記述から、この変更が特定の課題(おそらくビルドスクリプトの管理性に関するもの)を解決するために行われたことが示唆されます。

前提知識の解説

このコミットを理解するためには、以下の概念について基本的な知識があると役立ちます。

  • Go言語のビルドシステム: Go言語は、go buildコマンドを使用してソースコードをコンパイルし、実行可能ファイルを生成します。しかし、Go自身のコンパイラやツールチェインをビルドする際には、より低レベルなシェルスクリプト(make.bashなど)が使用されることがあります。これらのスクリプトは、クロスコンパイル環境のセットアップや、特定のOS/アーキテクチャ向けのビルド設定を管理します。
  • シェルスクリプト: buildscript_*.shmake.bashといったファイルは、Bashなどのシェルで実行されるスクリプトです。これらは、ファイルの操作、環境変数の設定、他のコマンドの実行など、ビルドプロセスを自動化するために使用されます。
  • 環境変数 GOOSGOARCH: Go言語では、GOOS環境変数でターゲットのオペレーティングシステム(例: linux, windows, darwin)を、GOARCH環境変数でターゲットのCPUアーキテクチャ(例: amd64, 386, arm)を指定します。これらの変数は、クロスコンパイルを行う際に非常に重要です。
  • ファイルパスの相対参照と絶対参照: ファイルやディレクトリを参照する際に、現在の作業ディレクトリからの相対パス(例: buildscript/darwin_386.sh)と、ファイルシステムのルートからの絶対パス(例: /home/user/project/src/buildscript/darwin_386.sh)があります。このコミットでは、スクリプト内で生成されるファイルパスの相対参照が変更されています。
  • sedコマンド: sedはStream EDitorの略で、テキストの変換を行うUNIXコマンドです。このコミットでは、GOOSGOARCHの値を抽出するために使用されています。例えば、echo $sys | sed 's/_.*//'sys変数から最初の_までの部分(OS名)を抽出します。
  • rm -fコマンド: ファイルを強制的に削除するコマンドです。このコミットでは、新しいビルドスクリプトを生成する前に、古いファイルを削除するために使用されています。
  • exportコマンド: シェルスクリプト内で環境変数を設定し、その変数を子プロセスにも引き継ぐために使用されます。

技術的詳細

このコミットの主要な技術的変更点は、Go言語のビルドシステムにおけるファイルパスの管理方法の変更です。

  1. ディレクトリ構造の変更:

    • コミット前: src/buildscript_darwin_386.sh, src/buildscript_linux_amd64.sh のように、OSとアーキテクチャごとのビルドスクリプトがsrcディレクトリ直下に配置されていました。
    • コミット後: これらのスクリプトはsrc/buildscript/darwin_386.sh, src/buildscript/linux_amd64.sh のように、src/buildscriptサブディレクトリ内に移動されました。これは、Gitのrename操作として記録されています。
  2. src/buildscript.sh の変更:

    • このスクリプトは、様々なOS/アーキテクチャ向けのビルドスクリプトを動的に生成する役割を担っています。
    • 変更前は、生成されるスクリプトのターゲットパスをtarg=buildscript_${GOOS}_$GOARCH.shとしていました。これはsrcディレクトリ直下にファイルが生成されることを意味します。
    • 変更後、ターゲットパスはtarg=buildscript/${GOOS}_$GOARCH.shに変更されました。これにより、生成されるスクリプトがsrc/buildscriptディレクトリ内に配置されるようになります。
    • この変更は、sedコマンドで抽出したGOOSGOARCHの値を使用して、新しいディレクトリ構造に合わせたファイル名を構築している箇所に反映されています。
  3. src/make.bash の変更:

    • make.bashはGoプロジェクトの主要なビルドスクリプトであり、buildscript_*.shスクリプトを呼び出してGoツールチェインをビルドする役割を担っています。
    • 変更前は、./buildscript_${GOOS}_$GOARCH.shという相対パスでビルドスクリプトを呼び出していました。
    • 変更後、呼び出しパスは./buildscript/${GOOS}_$GOARCH.shに変更されました。これは、ビルドスクリプトが新しいbuildscriptサブディレクトリに移動したことに対応するものです。

これらの変更により、ビルドスクリプトの生成と呼び出しの両方が、新しいディレクトリ構造に適合するように更新されています。これにより、ビルドプロセス全体の整合性が保たれ、ファイルが期待される場所に配置されるようになります。

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

このコミットにおけるコアとなるコードの変更箇所は、主に以下の2つのファイルに集中しています。

  1. src/buildscript.sh:

    --- a/src/buildscript.sh
    +++ b/src/buildscript.sh
    @@ -9,7 +9,7 @@ for sys in $GOOSARCHES
     do
     	export GOOS=$(echo $sys | sed 's/_.*//')
     	export GOARCH=$(echo $sys | sed 's/.*_//')
    -	targ=buildscript_${GOOS}_$GOARCH.sh
    +	targ=buildscript/${GOOS}_$GOARCH.sh
     	rm -f $targ
     
     	(echo '#!/usr/bin/env bash
    
  2. src/make.bash:

    --- a/src/make.bash
    +++ b/src/make.bash
    @@ -93,7 +93,7 @@ echo; echo; echo %%%% making runtime generated files %%%%; echo
     if $USE_GO_TOOL; then
     	echo
     	echo '# Building go command from bootstrap script.'
    -	./buildscript_${GOOS}_$GOARCH.sh
    +	./buildscript/${GOOS}_$GOARCH.sh
     
     	echo '# Building Go code.'
     	go install -a -v std
    

また、以下のファイルがsrc/からsrc/buildscript/へリネームされています(similarity index 100%は内容が変更されていないことを示します)。

  • src/buildscript_darwin_386.sh -> src/buildscript/darwin_386.sh
  • src/buildscript_darwin_amd64.sh -> src/buildscript/darwin_amd64.sh
  • src/buildscript_freebsd_386.sh -> src/buildscript/freebsd_386.sh
  • src/buildscript_freebsd_amd64.sh -> src/buildscript/freebsd_amd64.sh
  • src/buildscript_linux_386.sh -> src/buildscript/linux_386.sh
  • src/buildscript_linux_amd64.sh -> src/buildscript/linux_amd64.sh
  • src/buildscript_linux_arm.sh -> src/buildscript/linux_arm.sh
  • src/buildscript_netbsd_386.sh -> src/buildscript/netbsd_386.sh
  • src/buildscript_netbsd_amd64.sh -> src/buildscript/netbsd_amd64.sh
  • src/buildscript_openbsd_386.sh -> src/buildscript/openbsd_386.sh
  • src/buildscript_openbsd_amd64.sh -> src/buildscript/openbsd_amd64.sh
  • src/buildscript_plan9_386.sh -> src/buildscript/plan9_386.sh
  • src/buildscript_windows_386.sh -> src/buildscript/windows_386.sh
  • src/buildscript_windows_amd64.sh -> src/buildscript/windows_amd64.sh

コアとなるコードの解説

src/buildscript.sh の変更

このスクリプトは、Goのビルドプロセスにおいて、各OSとアーキテクチャに対応する具体的なビルドスクリプト(例: buildscript_darwin_386.sh)を動的に生成する役割を担っています。

変更前:

targ=buildscript_${GOOS}_$GOARCH.sh

ここでは、GOOSGOARCHという環境変数(それぞれターゲットOSとアーキテクチャを示す)の値を使って、生成されるスクリプトのファイル名を構築しています。例えば、GOOS=darwinGOARCH=386の場合、targbuildscript_darwin_386.shとなります。このパスは、スクリプトが実行されているsrcディレクトリの直下を指していました。

変更後:

targ=buildscript/${GOOS}_$GOARCH.sh

変更点はこの一行のみで、ファイル名の前にbuildscript/というプレフィックスが追加されています。これにより、生成されるスクリプトのパスはbuildscript/darwin_386.shのようになり、srcディレクトリ内のbuildscriptサブディレクトリに配置されるようになります。この変更は、ファイルのリネームと同期しており、生成されるファイルが新しい場所に正しく書き込まれるようにします。

src/make.bash の変更

make.bashは、Goプロジェクト全体のビルドをオーケストレーションする主要なスクリプトです。このスクリプトは、Goのコンパイラや標準ライブラリをビルドするために、前述のbuildscript_*.shスクリプトを呼び出します。

変更前:

./buildscript_${GOOS}_$GOARCH.sh

ここでは、GOOSGOARCHに基づいて構築されたファイル名(例: buildscript_darwin_386.sh)を、現在のディレクトリ(src)からの相対パスとして直接実行していました。

変更後:

./buildscript/${GOOS}_$GOARCH.sh

この変更も、buildscript/というプレフィックスを追加することで、呼び出すスクリプトのパスを更新しています。これにより、make.bashは、srcディレクトリ内のbuildscriptサブディレクトリに移動したビルドスクリプトを正しく見つけて実行できるようになります。

これらの変更は、Goのビルドシステムにおけるファイルパスの参照を、新しいディレクトリ構造に合わせて調整するものであり、機能的な変更ではなく、主にコードベースの整理と保守性向上を目的としたリファクタリングです。

関連リンク

参考にした情報源リンク