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

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

このコミットは、Go言語のビルドスクリプトである make.bat--no-clean オプションを追加するものです。これにより、dist bootstrap コマンド実行時にクリーンアップ処理をスキップできるようになります。これは、開発者がビルド時間を短縮したい場合や、既存のビルド成果物を保持したい場合に有用です。

コミット

  • コミットハッシュ: fa0100cf26336053f9c072c3cb1081a09df41449
  • Author: Alex Brainman alex.brainman@gmail.com
  • Date: Thu Feb 16 11:34:41 2012 +1100

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

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

元コミット内容

    make.bat: implement --no-clean
    
    R=golang-dev, r
    CC=golang-dev
    https://golang.org/cl/5656070

変更の背景

Go言語のビルドプロセスでは、通常、dist bootstrap コマンドが実行される際に、以前のビルド成果物や一時ファイルをクリーンアップする処理が含まれています。これは、クリーンな状態からビルドを開始し、予期せぬ問題を避けるためには重要です。しかし、開発のサイクルにおいては、毎回完全にクリーンな状態からビルドを開始する必要がない場合があります。例えば、小さな変更を加えてすぐに再ビルドしたい場合や、デバッグのために特定のビルド成果物を保持したい場合などです。

このようなシナリオでは、クリーンアップ処理がビルド時間を不必要に長くする要因となります。このコミットは、このような開発者のニーズに応えるため、クリーンアップ処理をスキップするオプション --no-cleanmake.bat に追加することを目的としています。これにより、開発者はビルドの柔軟性を高め、特定の状況下でのビルド時間を短縮できるようになります。

前提知識の解説

make.bat

make.bat は、Windows環境におけるGo言語のビルドスクリプトです。Unix/Linux環境における make コマンドと同様に、プロジェクトのコンパイル、テスト、インストールなどのビルドプロセスを自動化するために使用されます。バッチファイル形式で記述されており、コマンドプロンプトから実行されます。

dist bootstrap

dist bootstrap は、Go言語のツールチェイン自体をビルドするためのコマンドです。Go言語は自己ホスト型(self-hosting)言語であり、Goコンパイラやその他のツールはGo言語自身で書かれています。そのため、GoのソースコードからGoのツールチェインを初めてビルドする際や、新しいバージョンに更新する際にこの bootstrap コマンドが使用されます。このプロセスには、通常、既存のツールチェイン(または事前にビルドされたバイナリ)を使用して新しいツールチェインをビルドする「ブートストラップ」フェーズが含まれます。

クリーンビルドとインクリメンタルビルド

  • クリーンビルド (Clean Build): ビルドを開始する前に、以前のビルドによって生成されたすべての成果物(コンパイル済みファイル、オブジェクトファイル、実行可能ファイルなど)を削除し、完全にクリーンな状態からビルドをやり直すプロセスです。これにより、古いファイルが原因で発生する可能性のある問題を排除し、一貫性のあるビルド結果を保証します。
  • インクリメンタルビルド (Incremental Build): 変更されたファイルや、その変更に依存するファイルのみを再コンパイルするビルドプロセスです。クリーンビルドと比較して、ビルド時間を大幅に短縮できます。しかし、依存関係の解決が複雑になる場合や、古い成果物が残ることで予期せぬ問題が発生する可能性もあります。

このコミットで追加される --no-clean オプションは、実質的にインクリメンタルビルドに近い動作を可能にし、開発者がクリーンアップ処理をスキップしてビルド時間を短縮できるようにします。

技術的詳細

このコミットは、src/make.bat ファイル内の dist bootstrap コマンドの呼び出し方法を変更することで、--no-clean オプションの機能を実現しています。

変更前は、dist bootstrap コマンドは常に -a -v オプション(おそらく -a は "all" または "clean and build all"、-v は "verbose" を意味する)を付けて実行されていました。

変更後は、--no-clean オプションがコマンドライン引数として渡されたかどうかをチェックし、それに応じて dist bootstrap に渡すオプションを動的に変更しています。

具体的には、以下のロジックが追加されています。

  1. set buildall=-a: buildall という環境変数にデフォルトで -a を設定します。これは、通常時のクリーンビルド動作を維持するためです。
  2. if x%1==x--no-clean set buildall=: コマンドライン引数の最初の引数 (%1) が --no-clean と完全に一致するかどうかをチェックします。
    • x%1==x--no-clean のように x をプレフィックスとして使用しているのは、引数が空文字列の場合に構文エラーになるのを防ぐための一般的なバッチスクリプトのテクニックです。
    • もし一致した場合、buildall 変数を空文字列に設定します。これにより、-a オプションが dist bootstrap コマンドに渡されなくなります。
  3. .\\cmd\\dist\\dist bootstrap %buildall% -v: 最後に、dist bootstrap コマンドを実行する際に、動的に設定された buildall 変数の内容をオプションとして渡します。

この変更により、make.bat --no-clean と実行された場合、dist bootstrap コマンドは -a オプションなしで実行され、クリーンアップ処理がスキップされるようになります。それ以外の場合は、従来通り -a オプションが渡され、クリーンビルドが実行されます。

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

--- a/src/make.bat
+++ b/src/make.bat
@@ -42,7 +42,9 @@ del env.bat
 echo .
 
 echo # Building compilers and Go bootstrap tool.
-.\\cmd\\dist\\dist bootstrap -a -v
+set buildall=-a
+if x%1==x--no-clean set buildall=\
+.\\cmd\\dist\\dist bootstrap %buildall% -v
 if errorlevel 1 goto fail
 :: Delay move of dist tool to now, because bootstrap cleared tool directory.
 move .\\cmd\\dist\\dist.exe %GOTOOLDIR%\\dist.exe

コアとなるコードの解説

変更されたのは src/make.bat ファイルの以下の部分です。

set buildall=-a
if x%1==x--no-clean set buildall=
.\\cmd\\dist\\dist bootstrap %buildall% -v
  1. set buildall=-a

    • buildall という名前の環境変数(またはローカル変数)を定義し、その初期値として文字列 -a を設定しています。
    • この -a は、dist bootstrap コマンドに渡されるオプションの一部であり、通常は「すべてをビルドする」または「クリーンアップしてからビルドする」といった意味合いを持つと考えられます。
  2. if x%1==x--no-clean set buildall=

    • これは条件分岐の行です。
    • %1 は、make.bat スクリプトが実行された際に渡された最初のコマンドライン引数を表します。
    • x%1==x--no-clean は、%1 の値が --no-clean と等しいかどうかを比較しています。前述の通り、x をプレフィックスとして付けるのは、引数が空の場合のバッチスクリプトの構文エラーを回避するための慣用的な手法です。
    • もし %1--no-clean であった場合、buildall 変数の値を空文字列に再設定します。これにより、-a オプションが dist bootstrap コマンドに渡されなくなります。
  3. .\\cmd\\dist\\dist bootstrap %buildall% -v

    • この行が、実際にGoのブートストラップツールを呼び出すコマンドです。
    • .\cmd\dist\dist は、Goのビルドツールである dist コマンドのパスを示しています。
    • bootstrapdist コマンドのサブコマンドで、Goツールチェインのブートストラップビルドを実行します。
    • %buildall% の部分には、直前の set コマンドによって設定された buildall 変数の値が展開されます。
      • もし --no-clean が指定されなかった場合、%buildall%-a となり、コマンドは .\cmd\dist\dist bootstrap -a -v のように実行されます。
      • もし --no-clean が指定された場合、%buildall% は空文字列となり、コマンドは .\cmd\dist\dist bootstrap -v のように実行されます。
    • -v は "verbose" の略で、ビルドの進行状況を詳細に表示するためのオプションです。

この変更により、make.bat はコマンドライン引数に応じて dist bootstrap の挙動を制御できるようになり、開発者はクリーンアップ処理をスキップするかどうかを選択できるようになりました。

関連リンク

  • Go言語のコードレビューシステム (Gerrit) のChange-ID: https://golang.org/cl/5656070
    • : このCL番号に関する情報は、現在のところWeb上で見つけることができませんでした。

参考にした情報源リンク

この解説は、主に提供されたコミット情報(コミットメッセージと差分)に基づいて作成されました。外部の具体的な情報源は使用していません。