[インデックス 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/dist
と cmd/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/5261
と golang.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.c
と src/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のビルドプロセスにおけるコンパイラ出力の一貫性と可読性を向上させるための、小さなしかし重要な改善です。
関連リンク
- Go言語の公式ウェブサイト: https://golang.org/
- Go言語のIssueトラッカー: https://github.com/golang/go/issues
- GCCのドキュメント (fmessage-length): https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html (このオプションは診断メッセージのセクションに記載されています)
- Clangのドキュメント (fmessage-length, fno-caret-diagnostics, Qunused-arguments): https://clang.llvm.org/docs/ClangCommandLineReference.html
参考にした情報源リンク
- GitHubのコミットページ: https://github.com/golang/go/commit/65a643ba47726b690ab03e940ec7811979c8f377
- Go CL (Change List) 36300044: https://golang.org/cl/36300044
- Go Issue 5261: https://golang.org/issue/5261
- Go Issue 3253: https://golang.org/issue/3253
- GCCおよびClangの公式ドキュメント (上記「関連リンク」に記載のURL)
- 一般的なC/C++コンパイラのオプションに関する知識
- Go言語のビルドシステムに関する一般的な知識```markdown
[インデックス 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/dist
と cmd/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/5261
と golang.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.c
と src/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のビルドプロセスにおけるコンパイラ出力の一貫性と可読性を向上させるための、小さなしかし重要な改善です。
関連リンク
- Go言語の公式ウェブサイト: https://golang.org/
- Go言語のIssueトラッカー: https://github.com/golang/go/issues
- GCCのドキュメント (fmessage-length): https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html (このオプションは診断メッセージのセクションに記載されています)
- Clangのドキュメント (fmessage-length, fno-caret-diagnostics, Qunused-arguments): https://clang.llvm.org/docs/ClangCommandLineReference.html
参考にした情報源リンク
- GitHubのコミットページ: https://github.com/golang/go/commit/65a643ba47726b690ab03e940ec7811979c8f377
- Go CL (Change List) 36300044: https://golang.org/cl/36300044
- Go Issue 5261: https://golang.org/issue/5261
- Go Issue 3253: https://golang.org/issue/3253
- GCCおよびClangの公式ドキュメント (上記「関連リンク」に記載のURL)
- 一般的なC/C++コンパイラのオプションに関する知識
- Go言語のビルドシステムに関する一般的な知識