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

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

このコミットは、Go言語のビルドシステムにおいて、コンパイラ(GCC/Clang)に渡すオプションである -fmessage-length=0 の適用方法を変更するものです。具体的には、このオプションが常に渡されるように修正されています。これにより、コンパイラの出力するエラーメッセージや警告メッセージの行折り返しが無効化され、メッセージが一行で表示されるようになります。

コミット

commit 65a643ba47726b690ab03e940ec7811979c8f377
Author: Russ Cox <rsc@golang.org>
Date:   Mon Dec 9 12:56:23 2013 -0500

    cmd/dist, cmd/go: pass -fmessage-length always

    R=golang-dev, iant
    CC=golang-dev
    https://golang.org/cl/36300044

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

https://github.com/golang/go/commit/65a643ba47726b690ab03e940ec7811979c8f377

元コミット内容

cmd/dist, cmd/go: pass -fmessage-length always

このコミットは、cmd/distcmd/go の両方で、コンパイラに -fmessage-length オプションを常に渡すように変更します。

変更の背景

Go言語のビルドプロセスでは、C言語で書かれた部分(例えば、Goランタイムの一部や、cmd/dist のようなツール)をコンパイルするために、GCCやClangといったCコンパイラを使用します。これらのコンパイラは、エラーメッセージや警告メッセージを出力する際に、デフォルトで行を折り返す(ワードラップする)ことがあります。

開発者にとって、特に自動化されたビルドシステムやログ解析の文脈では、メッセージが一行で表示される方が都合が良い場合があります。行が折り返されると、メッセージのパースが困難になったり、ログの可読性が低下したりする可能性があります。

以前のコードでは、-fmessage-length=0 オプションは特定の条件下(例えば、Clangを使用している場合)でのみ追加されていました。このコミットの背景には、このオプションを常に適用することで、コンパイラの出力形式を一貫させ、開発体験を向上させるという意図があります。

前提知識の解説

GCC/Clangコンパイラオプション

  • -fmessage-length=0: このコンパイラオプションは、GCCおよびClangにおいて、診断メッセージ(エラーや警告)の行の長さを制御します。=0 を指定すると、メッセージの行折り返しが無効になり、可能な限り一行で出力されるようになります。これは、CI/CD環境でのログ解析や、特定のIDE/エディタでの表示において有用です。
  • -fno-caret-diagnostics: このオプションは、Clangコンパイラで使用され、診断メッセージの下に表示される「キャレット」(^)によるエラー箇所の強調表示を無効にします。これは、ターミナル環境によっては表示が崩れる場合があるため、特定の環境での表示を改善するために使用されることがあります。
  • -Qunused-arguments: このオプションはClangコンパイラで使用され、未使用のコマンドライン引数に関する警告を抑制します。Clangは、認識できない、または使用されない引数に対して警告を出すことがありますが、これはクロスコンパイラ環境や、複数のコンパイラで共通のビルドスクリプトを使用する場合に問題となることがあります。このオプションを使用することで、そのような警告を無視できます。

Go言語のビルドシステム (cmd/dist, cmd/go)

  • cmd/dist: Go言語のソースコードからGoツールチェイン自体をビルドするためのコマンドです。ブートストラッププロセスにおいて重要な役割を果たします。C言語で書かれた部分のコンパイルも担当します。
  • cmd/go: Go言語のユーザーが日常的に使用するコマンド(go build, go run, go test など)を提供するツールです。Goプログラムのビルド、テスト、実行、パッケージ管理などを行います。内部的には、必要に応じてCコンパイラを呼び出すことがあります。

golang.org/issue/5261golang.org/issue/3253

これらのリンクは、Go言語のIssueトラッカーにおける特定のバグ報告や議論を指します。

  • golang.org/issue/5261: このIssueは、macOS (Darwin) 環境におけるGoのビルドに関する問題、特に clang のバージョンと MACOSX_DEPLOYMENT_TARGET の設定に関連するものです。このコミットでは、-mmacosx-version-min=10.6 オプションが追加されており、これは古いmacOSバージョンとの互換性を確保するためのものです。
  • golang.org/issue/3253: このIssueは、macOS環境でのリンカの挙動に関するもので、特に -fno-common オプションとMach-Oリンカの相互作用について議論されています。Goのリンカ(6l/8l)が、Cコンパイラが -fno-common を常に設定しているかのように振る舞うことを前提としているため、この問題が発生していました。

技術的詳細

このコミットは、GoのビルドシステムがCコンパイラを呼び出す際に、-fmessage-length=0 オプションを渡すロジックを変更しています。

以前のコードでは、src/cmd/dist/build.csrc/cmd/go/build.go の両方で、このオプションの追加が条件付きでした。例えば、src/cmd/dist/build.c では、is_clang が真の場合にのみ -fmessage-length=0 が追加されていました。

// src/cmd/dist/build.c (変更前)
if(is_clang) {
    vadd(&gccargs, "-fno-caret-diagnostics");
    // clang is too smart about unused command-line arguments
    vadd(&gccargs, "-Qunused-arguments");
    // disable line wrapping in error messages
    vadd(&gccargs, "-fmessage-length=0");
}

このコミットでは、この条件を削除し、-fmessage-length=0 が常に gccargs (Cコンパイラに渡す引数リスト) に追加されるように変更されています。これにより、使用しているCコンパイラがGCCであろうとClangであろうと、診断メッセージの行折り返しが無効化されることが保証されます。

この変更は、Goのビルドプロセス全体でコンパイラの出力の一貫性を高めることを目的としています。特に、自動化された環境でのログ解析やエラー処理において、メッセージが常に一行で出力されることは大きな利点となります。

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

src/cmd/dist/build.c

--- a/src/cmd/dist/build.c
+++ b/src/cmd/dist/build.c
@@ -677,9 +677,9 @@ install(char *dir)
 			vadd(&gccargs, "-fno-caret-diagnostics");
 			// clang is too smart about unused command-line arguments
 			vadd(&gccargs, "-Qunused-arguments");
-\t\t\t// disable line wrapping in error messages
-\t\t\tvadd(&gccargs, "-fmessage-length=0");
 \t\t}\n
+\t\t// disable word wrapping in error messages
+\t\tvadd(&gccargs, "-fmessage-length=0");
 \t\tif(streq(gohostos, "darwin")) {
 \t\t\t// golang.org/issue/5261
 \t\t\tvadd(&gccargs, "-mmacosx-version-min=10.6");

src/cmd/go/build.go

--- a/src/cmd/go/build.go
+++ b/src/cmd/go/build.go
@@ -1890,10 +1890,11 @@ func (b *builder) ccompilerCmd(envvar, defcmd, objdir string) []string {
 		a = append(a, "-fno-caret-diagnostics")
 		// clang is too smart about command-line arguments
 		a = append(a, "-Qunused-arguments")
-\t\t// disable word wrapping in error messages
-\t\ta = append(a, "-fmessage-length=0")
 \t}\n
 \n
+\t// disable word wrapping in error messages
+\ta = append(a, "-fmessage-length=0")
+\n
 	// On OS X, some of the compilers behave as if -fno-common
 	// is always set, and the Mach-O linker in 6l/8l assumes this.
 	// See http://golang.org/issue/3253.

コアとなるコードの解説

src/cmd/dist/build.c の変更

元のコードでは、is_clang という条件分岐の中に -fmessage-length=0 の追加が含まれていました。この変更では、is_clang の条件分岐の外にこの行を移動しています。これにより、gccargs (Cコンパイラに渡す引数) に -fmessage-length=0 が常に含まれるようになります。コメントも「disable line wrapping in error messages」から「disable word wrapping in error messages」に修正されていますが、これは意味的な変更ではなく、より正確な表現への修正です。

src/cmd/go/build.go の変更

同様に、ccompilerCmd 関数内で、Clang固有のオプション(-fno-caret-diagnostics, -Qunused-arguments)を追加する条件分岐の外に -fmessage-length=0 の追加を移動しています。これにより、a (Cコンパイラに渡す引数スライス) に -fmessage-length=0 が常に含まれるようになります。

これらの変更により、GoのビルドシステムがCコンパイラを呼び出す際には、常に診断メッセージの行折り返しが無効化されるようになります。これは、Goのビルドプロセスにおけるコンパイラ出力の一貫性と可読性を向上させるための、小さなしかし重要な改善です。

関連リンク

参考にした情報源リンク

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

このコミットは、Go言語のビルドシステムにおいて、コンパイラ(GCC/Clang)に渡すオプションである -fmessage-length=0 の適用方法を変更するものです。具体的には、このオプションが常に渡されるように修正されています。これにより、コンパイラの出力するエラーメッセージや警告メッセージの行折り返しが無効化され、メッセージが一行で表示されるようになります。

コミット

commit 65a643ba47726b690ab03e940ec7811979c8f377
Author: Russ Cox <rsc@golang.org>
Date:   Mon Dec 9 12:56:23 2013 -0500

    cmd/dist, cmd/go: pass -fmessage-length always

    R=golang-dev, iant
    CC=golang-dev
    https://golang.org/cl/36300044

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

https://github.com/golang/go/commit/65a643ba47726b690ab03e940ec7811979c8f377

元コミット内容

cmd/dist, cmd/go: pass -fmessage-length always

このコミットは、cmd/distcmd/go の両方で、コンパイラに -fmessage-length オプションを常に渡すように変更します。

変更の背景

Go言語のビルドプロセスでは、C言語で書かれた部分(例えば、Goランタイムの一部や、cmd/dist のようなツール)をコンパイルするために、GCCやClangといったCコンパイラを使用します。これらのコンパイラは、エラーメッセージや警告メッセージを出力する際に、デフォルトで行を折り返す(ワードラップする)ことがあります。

開発者にとって、特に自動化されたビルドシステムやログ解析の文脈では、メッセージが一行で表示される方が都合が良い場合があります。行が折り返されると、メッセージのパースが困難になったり、ログの可読性が低下したりする可能性があります。

以前のコードでは、-fmessage-length=0 オプションは特定の条件下(例えば、Clangを使用している場合)でのみ追加されていました。このコミットの背景には、このオプションを常に適用することで、コンパイラの出力形式を一貫させ、開発体験を向上させるという意図があります。

前提知識の解説

GCC/Clangコンパイラオプション

  • -fmessage-length=0: このコンパイラオプションは、GCCおよびClangにおいて、診断メッセージ(エラーや警告)の行の長さを制御します。=0 を指定すると、メッセージの行折り返しが無効になり、可能な限り一行で出力されるようになります。これは、CI/CD環境でのログ解析や、特定のIDE/エディタでの表示において有用です。
  • -fno-caret-diagnostics: このオプションは、Clangコンパイラで使用され、診断メッセージの下に表示される「キャレット」(^)によるエラー箇所の強調表示を無効にします。これは、ターミナル環境によっては表示が崩れる場合があるため、特定の環境での表示を改善するために使用されることがあります。
  • -Qunused-arguments: このオプションはClangコンパイラで使用され、未使用のコマンドライン引数に関する警告を抑制します。Clangは、認識できない、または使用されない引数に対して警告を出すことがありますが、これはクロスコンパイラ環境や、複数のコンパイラで共通のビルドスクリプトを使用する場合に問題となることがあります。このオプションを使用することで、そのような警告を無視できます。

Go言語のビルドシステム (cmd/dist, cmd/go)

  • cmd/dist: Go言語のソースコードからGoツールチェイン自体をビルドするためのコマンドです。ブートストラッププロセスにおいて重要な役割を果たします。C言語で書かれた部分のコンパイルも担当します。
  • cmd/go: Go言語のユーザーが日常的に使用するコマンド(go build, go run, go test など)を提供するツールです。Goプログラムのビルド、テスト、実行、パッケージ管理などを行います。内部的には、必要に応じてCコンパイラを呼び出すことがあります。

golang.org/issue/5261golang.org/issue/3253

これらのリンクは、Go言語のIssueトラッカーにおける特定のバグ報告や議論を指します。

  • golang.org/issue/5261: このIssueは、macOS (Darwin) 環境におけるGoのビルドに関する問題、特に clang のバージョンと MACOSX_DEPLOYMENT_TARGET の設定に関連するものです。このコミットでは、-mmacosx-version-min=10.6 オプションが追加されており、これは古いmacOSバージョンとの互換性を確保するためのものです。
  • golang.org/issue/3253: このIssueは、macOS環境でのリンカの挙動に関するもので、特に -fno-common オプションとMach-Oリンカの相互作用について議論されています。Goのリンカ(6l/8l)が、Cコンパイラが -fno-common を常に設定しているかのように振る舞うことを前提としているため、この問題が発生していました。

技術的詳細

このコミットは、GoのビルドシステムがCコンパイラを呼び出す際に、-fmessage-length=0 オプションを渡すロジックを変更しています。

以前のコードでは、src/cmd/dist/build.csrc/cmd/go/build.go の両方で、このオプションの追加が条件付きでした。例えば、src/cmd/dist/build.c では、is_clang が真の場合にのみ -fmessage-length=0 が追加されていました。

// src/cmd/dist/build.c (変更前)
if(is_clang) {
    vadd(&gccargs, "-fno-caret-diagnostics");
    // clang is too smart about unused command-line arguments
    vadd(&gccargs, "-Qunused-arguments");
    // disable line wrapping in error messages
    vadd(&gccargs, "-fmessage-length=0");
}

このコミットでは、この条件を削除し、-fmessage-length=0 が常に gccargs (Cコンパイラに渡す引数リスト) に追加されるように変更されています。これにより、使用しているCコンパイラがGCCであろうとClangであろうと、診断メッセージの行折り返しが無効化されることが保証されます。

この変更は、Goのビルドプロセス全体でコンパイラの出力の一貫性を高めることを目的としています。特に、自動化された環境でのログ解析やエラー処理において、メッセージが常に一行で出力されることは大きな利点となります。

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

src/cmd/dist/build.c

--- a/src/cmd/dist/build.c
+++ b/src/cmd/dist/build.c
@@ -677,9 +677,9 @@ install(char *dir)
 			vadd(&gccargs, "-fno-caret-diagnostics");
 			// clang is too smart about unused command-line arguments
 			vadd(&gccargs, "-Qunused-arguments");
-\t\t\t// disable line wrapping in error messages
-\t\t\tvadd(&gccargs, "-fmessage-length=0");
 \t\t}\n
+\t\t// disable word wrapping in error messages
+\t\tvadd(&gccargs, "-fmessage-length=0");
 \t\tif(streq(gohostos, "darwin")) {
 \t\t\t// golang.org/issue/5261
 \t\t\tvadd(&gccargs, "-mmacosx-version-min=10.6");

src/cmd/go/build.go

--- a/src/cmd/go/build.go
+++ b/src/cmd/go/build.go
@@ -1890,10 +1890,11 @@ func (b *builder) ccompilerCmd(envvar, defcmd, objdir string) []string {
 		a = append(a, "-fno-caret-diagnostics")
 		// clang is too smart about command-line arguments
 		a = append(a, "-Qunused-arguments")
-\t\t// disable word wrapping in error messages
-\t\ta = append(a, "-fmessage-length=0")
 \t}\n
 \n
+\t// disable word wrapping in error messages
+\ta = append(a, "-fmessage-length=0")
+\n
 	// On OS X, some of the compilers behave as if -fno-common
 	// is always set, and the Mach-O linker in 6l/8l assumes this.
 	// See http://golang.org/issue/3253.

コアとなるコードの解説

src/cmd/dist/build.c の変更

元のコードでは、is_clang という条件分岐の中に -fmessage-length=0 の追加が含まれていました。この変更では、is_clang の条件分岐の外にこの行を移動しています。これにより、gccargs (Cコンパイラに渡す引数) に -fmessage-length=0 が常に含まれるようになります。コメントも「disable line wrapping in error messages」から「disable word wrapping in error messages」に修正されていますが、これは意味的な変更ではなく、より正確な表現への修正です。

src/cmd/go/build.go の変更

同様に、ccompilerCmd 関数内で、Clang固有のオプション(-fno-caret-diagnostics, -Qunused-arguments)を追加する条件分岐の外に -fmessage-length=0 の追加を移動しています。これにより、a (Cコンパイラに渡す引数スライス) に -fmessage-length=0 が常に含まれるようになります。

これらの変更により、GoのビルドシステムがCコンパイラを呼び出す際には、常に診断メッセージの行折り返しが無効化されるようになります。これは、Goのビルドプロセスにおけるコンパイラ出力の一貫性と可読性を向上させるための、小さなしかし重要な改善です。

関連リンク

参考にした情報源リンク