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

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

このコミットは、Go言語のビルドシステムにおけるgo tool distコマンドの出力の冗長性を低減することを目的としています。特に、開発者がmakeコマンドを実行した際のデフォルトの出力をより静かにし、必要な場合にのみ詳細なログが表示されるように調整しています。これにより、開発体験の向上と、ビルドログの視認性改善が図られています。

コミット

cmd/dist: make 'make' quieter for developers

R=golang-dev, gri
CC=golang-dev
https://golang.org/cl/5646055

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

https://github.com/golang/go/commit/596840a905bf0dfd79ce4ce7583a3f22f7b38d13

元コミット内容

commit 596840a905bf0dfd79ce4ce7583a3f22f7b38d13
Author: Russ Cox <rsc@golang.org>
Date:   Wed Feb 8 15:26:47 2012 -0500

    cmd/dist: make 'make' quieter for developers
    
    R=golang-dev, gri
    CC=golang-dev
    https://golang.org/cl/5646055
---
 src/Make.dist        |  4 ++++\n src/cmd/dist/build.c | 12 +++++-------\n src/cmd/dist/unix.c  |  6 +++---\n 3 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/src/Make.dist b/src/Make.dist
index 78e6edf04e..cae892de9c 100644
--- a/src/Make.dist
+++ b/src/Make.dist
@@ -3,12 +3,16 @@
 # license that can be found in the LICENSE file.\n \n # Run go tool dist to install a command.\n+# The -v causes dist to print the name of each directory as it runs.\n # The -vv causes dist to print each build command as it runs.\n # go tool dist clean cleans all directories, not just this one,\n # but it\'s as close as we can get.\n \n # Default target (first).\n install:\n+\tgo tool dist install -v\n+\n+verbose:\n \tgo tool dist install -vv\n \n clean:\ndiff --git a/src/cmd/dist/build.c b/src/cmd/dist/build.c
index fff4d62eac..c84a7ec7f6 100644
--- a/src/cmd/dist/build.c
+++ b/cmd/dist/build.c
@@ -501,6 +501,9 @@ install(char *dir)\n \tTime ttarg, t;\n \tint i, j, k, n, doclean;\n \n+\tif(vflag)\n+\t\txprintf("%s\\n", dir);\n+\n \tbinit(&b);\n \tbinit(&b1);\n \tbinit(&path);\n@@ -1242,7 +1245,6 @@ cmdbootstrap(int argc, char **argv)\n {\n \tint i;\n \tBuf b;\n-\tchar *p;\n \n \tARGBEGIN{\n \tcase \'v\':\n@@ -1259,12 +1261,8 @@ cmdbootstrap(int argc, char **argv)\n \tsetup();\n \t\n \tbinit(&b);\n-\tfor(i=0; i<nelem(buildorder); i++) {\n-\t\tp = bprintf(&b, buildorder[i], gochar);\n-\t\tif(vflag > 0)\n-\t\t\txprintf("%s\\n", p);\n-\t\tinstall(p);\n-\t}\n+\tfor(i=0; i<nelem(buildorder); i++)\n+\t\tinstall(bprintf(&b, buildorder[i], gochar));\n \tbfree(&b);\n }\n \ndiff --git a/src/cmd/dist/unix.c b/src/cmd/dist/unix.c
index 348b01e08b..e687142e90 100644
--- a/src/cmd/dist/unix.c
+++ b/src/cmd/dist/unix.c
@@ -386,7 +386,7 @@ xmkdirall(char *p)\n void\n xremove(char *p)\n {\n-\tif(vflag > 1)\n+\tif(vflag > 2)\n \t\txprintf("rm %s\\n", p);\n \tunlink(p);\n }\n@@ -408,11 +408,11 @@ xremoveall(char *p)\n \t\t\tbprintf(&b, "%s/%s", p, dir.p[i]);\n \t\t\txremoveall(bstr(&b));\n \t\t}\n-\t\tif(vflag > 1)\n+\t\tif(vflag > 2)\n \t\t\txprintf("rm %s\\n", p);\n \t\trmdir(p);\n \t} else {\n-\t\tif(vflag > 1)\n+\t\tif(vflag > 2)\n \t\t\txprintf("rm %s\\n", p);\n \t\tunlink(p);\n \t}\n```

## 変更の背景

Go言語のビルドシステムは、`make`コマンドを通じて`go tool dist`という内部ツールを呼び出して、Goのツールチェインや標準ライブラリのビルド、インストールを行います。このプロセスは、特に大規模なプロジェクトや頻繁なビルドを行う開発者にとって、大量のログ出力を生成することがありました。

以前のバージョンでは、`make install`を実行すると、`go tool dist install -vv`が内部的に呼び出されていました。`-vv`フラグは非常に詳細な(verbose)出力を意味し、ビルド中の各コマンドやディレクトリの処理状況が逐一表示されていました。これはデバッグ時には有用ですが、通常の開発フローでは過剰な情報となり、重要な警告やエラーメッセージを見落としやすくする原因となっていました。

このコミットは、デフォルトのビルド体験を改善し、開発者がよりクリーンな出力で作業できるようにすることを目的としています。具体的には、デフォルトの`make install`の冗長性を低減し、より詳細な出力が必要な場合にのみ、明示的なオプションを通じてそれを得られるように変更されました。

## 前提知識の解説

*   **Go言語のビルドシステム**: Go言語は、自身のコンパイラやツールチェインをGo自身で記述しており、そのビルドプロセスはブートストラップ(自己コンパイル)によって行われます。`src/Make.dist`は、このビルドプロセスを制御するMakefileの一部であり、`go tool dist`コマンドを呼び出します。
*   **`go tool dist`**: これはGo言語の内部ツールであり、GoのソースコードからGoのツールチェイン(コンパイラ、リンカなど)や標準ライブラリをビルド・インストールするために使用されます。Goの自己ホスト型コンパイラのビルドにおいて中心的な役割を担います。
*   **Makefile**: `make`コマンドによって解釈されるファイルで、ソフトウェアのビルドプロセスを自動化するためのルールと依存関係を定義します。`install`や`clean`といったターゲット(目標)が定義され、それぞれに対応するコマンドが実行されます。
*   **冗長性(Verbosity)フラグ**: コマンドラインツールにおいて、出力の詳細度を制御するためのオプションです。
    *   `-v` (verbose): 通常、より多くの情報(例えば、処理中のファイル名やディレクトリ名)を出力します。
    *   `-vv` (very verbose): `-v`よりもさらに詳細な情報(例えば、実行される各サブコマンド)を出力します。
*   **`xprintf`**: Goの内部ビルドツールで使用される、標準出力へのフォーマット済み出力関数。デバッグ情報や進捗状況の表示に用いられます。
*   **`vflag`**: `go tool dist`コマンド内で使用される内部変数で、冗長性フラグ(`-v`, `-vv`など)の状態を保持します。この変数の値に基づいて、どの程度の詳細な情報を出力するかが決定されます。

## 技術的詳細

このコミットは、主に以下の3つのファイルに対する変更を通じて、ビルド出力の冗長性を調整しています。

1.  **`src/Make.dist`**:
    *   以前の`install`ターゲットは`go tool dist install -vv`を実行していました。これは、デフォルトで非常に詳細なビルドログを生成することを意味します。
    *   変更後、`install`ターゲットは`go tool dist install -v`を実行するように変更されました。これにより、デフォルトのビルド出力が静かになります(ディレクトリ名のみが表示され、個々のビルドコマンドは表示されません)。
    *   同時に、新しい`verbose`ターゲットが追加され、これは以前の`install`ターゲットと同じく`go tool dist install -vv`を実行します。これにより、開発者は明示的に`make verbose`を実行することで、詳細なビルドログを得られるようになります。

2.  **`src/cmd/dist/build.c`**:
    *   `install(char *dir)`関数は、特定のディレクトリをインストールする際に呼び出されます。この関数内に`if(vflag)\txprintf("%s\\n", dir);`という行が追加されました。これは、`vflag`が設定されている(つまり、`-v`または`-vv`が指定されている)場合にのみ、現在処理しているディレクトリ名を出力するようにします。
    *   `cmdbootstrap`関数は、Goのブートストラップビルドプロセスを管理します。以前のコードでは、`buildorder`(ビルドするコンポーネントのリスト)をループ処理する際に、`vflag > 0`の場合に常にディレクトリ名を出力していました。この変更により、その`xprintf`呼び出しが削除され、ディレクトリ名の出力は`install`関数内の新しいロジックに委ねられるようになりました。これにより、`vflag`が1(`-v`)の場合にのみディレクトリ名が出力され、`vflag`が0(デフォルト)の場合は出力されなくなります。

3.  **`src/cmd/dist/unix.c`**:
    *   `xremove(char *p)`(ファイル削除)および`xremoveall(char *p)`(ディレクトリ削除)関数内で、削除コマンド(`rm %s`)の出力条件が`if(vflag > 1)`から`if(vflag > 2)`に変更されました。
    *   これは、ファイルやディレクトリの削除に関するメッセージが、以前は`-vv`(`vflag`が2)で表示されていたのに対し、変更後は`vflag`が3以上(つまり、`-vvv`のような、さらに高い冗長性レベルが指定された場合)でなければ表示されないことを意味します。これにより、通常の`-v`や`-vv`の出力からこれらのメッセージが除外され、さらに出力が静かになります。

これらの変更により、`go tool dist`の冗長性レベルがより細かく制御され、デフォルトのビルド出力が大幅に削減されました。

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

*   **`src/Make.dist`**:
    ```diff
    --- a/src/Make.dist
    +++ b/src/Make.dist
    @@ -3,12 +3,16 @@
     # license that can be found in the LICENSE file.\n \n # Run go tool dist to install a command.\n+# The -v causes dist to print the name of each directory as it runs.\n # The -vv causes dist to print each build command as it runs.\n # go tool dist clean cleans all directories, not just this one,\n # but it\'s as close as we can get.\n \n # Default target (first).\n install:\n+\tgo tool dist install -v\n+\n+verbose:\n \tgo tool dist install -vv
     ```

*   **`src/cmd/dist/build.c`**:
    ```diff
    --- a/src/cmd/dist/build.c
    +++ b/src/cmd/dist/build.c
    @@ -501,6 +501,9 @@ install(char *dir)\n \tTime ttarg, t;\n \tint i, j, k, n, doclean;\n \n+\tif(vflag)\n+\t\txprintf("%s\\n", dir);\n+\n \tbinit(&b);\n \tbinit(&b1);\n \tbinit(&path);\n@@ -1242,7 +1245,6 @@ cmdbootstrap(int argc, char **argv)\n {\n \tint i;\n \tBuf b;\n-\tchar *p;\n \n \tARGBEGIN{\n \tcase \'v\':\n@@ -1259,12 +1261,8 @@ cmdbootstrap(int argc, char **argv)\n \tsetup();\n \t\n \tbinit(&b);\n-\tfor(i=0; i<nelem(buildorder); i++) {\n-\t\tp = bprintf(&b, buildorder[i], gochar);\n-\t\tif(vflag > 0)\n-\t\t\txprintf("%s\\n", p);\n-\t\tinstall(p);\n-\t}\n+\tfor(i=0; i<nelem(buildorder); i++)\n+\t\tinstall(bprintf(&b, buildorder[i], gochar));\n \tbfree(&b);\n }\n    ```

*   **`src/cmd/dist/unix.c`**:
    ```diff
    --- a/src/cmd/dist/unix.c
    +++ b/src/cmd/dist/unix.c
    @@ -386,7 +386,7 @@ xmkdirall(char *p)\n void\n xremove(char *p)\n {\n-\tif(vflag > 1)\n+\tif(vflag > 2)\n \t\txprintf("rm %s\\n", p);\n \tunlink(p);\n }\n@@ -408,11 +408,11 @@ xremoveall(char *p)\n \t\t\tbprintf(&b, "%s/%s", p, dir.p[i]);\n \t\t\txremoveall(bstr(&b));\n \t\t}\n-\t\tif(vflag > 1)\n+\t\tif(vflag > 2)\n \t\t\txprintf("rm %s\\n", p);\n \t\trmdir(p);\n \t} else {\n-\t\tif(vflag > 1)\n+\t\tif(vflag > 2)\n \t\t\txprintf("rm %s\\n", p);\n \t\tunlink(p);\n \t}\n    ```

## コアとなるコードの解説

*   **`src/Make.dist`の変更**:
    *   `install:`ターゲットのコマンドを`go tool dist install -vv`から`go tool dist install -v`に変更しました。これにより、`make install`のデフォルトの出力が、各ビルドコマンドの詳細ではなく、処理中のディレクトリ名のみを表示するようになります。
    *   `verbose:`という新しいターゲットを追加し、これに`go tool dist install -vv`を割り当てました。これにより、開発者は明示的に`make verbose`を実行することで、以前の`-vv`による詳細なビルドログを引き続き利用できます。これは、デフォルトの動作を静かにしつつ、詳細な情報が必要な場合の柔軟性を維持するための変更です。

*   **`src/cmd/dist/build.c`の変更**:
    *   `install`関数内に`if(vflag)\txprintf("%s\\n", dir);`を追加しました。これは、`go tool dist`が`-v`または`-vv`フラグ付きで実行された場合に、現在インストールしているディレクトリの名前を出力するようにします。これにより、ビルドの進行状況をディレクトリ単位で把握できるようになります。
    *   `cmdbootstrap`関数内の`buildorder`ループから、以前の`if(vflag > 0) xprintf("%s\\n", p);`という行を削除しました。この変更は、ディレクトリ名の出力ロジックを`install`関数に一元化し、`vflag`の値に応じて適切に制御されるようにするためのものです。これにより、デフォルトのビルド(`vflag`が0)ではディレクトリ名が出力されなくなり、より静かな出力が実現されます。

*   **`src/cmd/dist/unix.c`の変更**:
    *   `xremove`および`xremoveall`関数内の`rm %s`メッセージの出力条件を`if(vflag > 1)`から`if(vflag > 2)`に変更しました。これは、ファイルやディレクトリの削除に関するメッセージが、以前は`-vv`(`vflag`が2)で表示されていたのに対し、変更後は`vflag`が3以上の場合にのみ表示されるようにします。これにより、`-v`や`-vv`といった一般的な冗長性レベルではこれらのメッセージが表示されなくなり、ビルドログのノイズがさらに削減されます。

これらの変更は、Goのビルドシステムにおけるログ出力の粒度を調整し、開発者にとってより使いやすいデフォルトのビルド体験を提供することを目的としています。

## 関連リンク

*   Go Gerrit Change: [https://golang.org/cl/5646055](https://golang.org/cl/5646055)

## 参考にした情報源リンク

*   Go言語の公式ドキュメント (Goのビルドプロセスに関する一般的な情報)
*   `make`コマンドのドキュメント (Makefileの構文とターゲットに関する一般的な情報)
*   Goのソースコード (特に`src/cmd/dist`ディレクトリ内の他のファイルや、`vflag`の使用箇所)