[インデックス 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-clean
を make.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
に渡すオプションを動的に変更しています。
具体的には、以下のロジックが追加されています。
set buildall=-a
:buildall
という環境変数にデフォルトで-a
を設定します。これは、通常時のクリーンビルド動作を維持するためです。if x%1==x--no-clean set buildall=
: コマンドライン引数の最初の引数 (%1
) が--no-clean
と完全に一致するかどうかをチェックします。x%1==x--no-clean
のようにx
をプレフィックスとして使用しているのは、引数が空文字列の場合に構文エラーになるのを防ぐための一般的なバッチスクリプトのテクニックです。- もし一致した場合、
buildall
変数を空文字列に設定します。これにより、-a
オプションがdist bootstrap
コマンドに渡されなくなります。
.\\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
-
set buildall=-a
buildall
という名前の環境変数(またはローカル変数)を定義し、その初期値として文字列-a
を設定しています。- この
-a
は、dist bootstrap
コマンドに渡されるオプションの一部であり、通常は「すべてをビルドする」または「クリーンアップしてからビルドする」といった意味合いを持つと考えられます。
-
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
コマンドに渡されなくなります。
-
.\\cmd\\dist\\dist bootstrap %buildall% -v
- この行が、実際にGoのブートストラップツールを呼び出すコマンドです。
.\cmd\dist\dist
は、Goのビルドツールであるdist
コマンドのパスを示しています。bootstrap
はdist
コマンドのサブコマンドで、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上で見つけることができませんでした。
参考にした情報源リンク
この解説は、主に提供されたコミット情報(コミットメッセージと差分)に基づいて作成されました。外部の具体的な情報源は使用していません。