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

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

このコミットは、Go言語のsyscallパッケージ内のtypes_linux.goファイルにおけるビルドディレクティブの記述方法に関する修正です。具体的には、ビルドディレクティブの前にブロックコメント(/* */)が存在すると、Goツールチェーンがそれを正しく認識できないという問題に対処しています。Goのビルドディレクティブは、空白行と行コメント(//)のみが先行することを許容するという厳格なルールに従う必要があります。このコミットは、そのルールに準拠するためにブロックコメントを行コメントに変換しています。

コミット

commit 5cc07af675901380a62eb23a2cb643db41dd4f7e
Author: Russ Cox <rsc@golang.org>
Date:   Wed Feb 1 18:25:51 2012 -0500

    syscall: fix build directive in types_linux.go
    
    The rule is that build directives can be preceded only
    by blank lines and other line comments, not /* */ comments.
    
    R=golang-dev, adg, bradfitz
    CC=golang-dev
    https://golang.org/cl/5619045

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

https://github.com/golang/go/commit/5cc07af675901380a62eb23a2cb643db41dd4f7e

元コミット内容

syscall: fix build directive in types_linux.go

このコミットは、types_linux.goファイル内のビルドディレクティブの記述を修正します。ビルドディレクティブは、空白行と他の行コメントのみが先行することを許容し、ブロックコメント(/* */)は許容されないというルールがあるため、そのルールに準拠するように変更されました。

変更の背景

Go言語のビルドシステムでは、特定のファイルがビルドプロセスに含まれるべきかどうかを制御するために「ビルドディレクティブ」(またはビルド制約、ビルドタグ)を使用します。これらのディレクティブは、ソースファイルの先頭近くに特別なコメント形式で記述されます。しかし、Goツールチェーンには、これらのビルドディレクティブが認識されるための厳格な構文規則が存在します。

このコミットが行われた当時(2012年2月)、src/pkg/syscall/types_linux.goファイルには、// +build ignoreというビルドディレクティブの直前にブロックコメント(/* ... */)が存在していました。Goのビルドディレクティブのルールでは、「ビルドディレクティブは、空白行と他の行コメントのみが先行することを許容し、ブロックコメントは許容されない」と定められています。このルールに違反していると、Goツールチェーンは// +build ignoreディレクティブを正しく解釈できず、意図しないビルド動作を引き起こす可能性がありました。

このコミットは、この構文規則の違反を修正し、types_linux.goファイルがGoのビルドシステムによって正しく処理されるようにするために行われました。

前提知識の解説

Go言語のビルドディレクティブ(Build Constraints / Build Tags)

Go言語では、ソースコードの条件付きコンパイルを可能にするために「ビルドディレクティブ」を使用します。これらは、特定のオペレーティングシステム、アーキテクチャ、Goのバージョン、またはカスタムタグに基づいて、ファイルがビルドに含まれるべきかどうかを決定します。

  • 構文:

    • Go 1.17以降では、//go:build構文が推奨されます(例: //go:build linux && amd64)。
    • Go 1.16以前では、// +build構文が使用されていました(例: // +build linux,amd64)。このコミットは古い構文を使用しています。
    • ディレクティブは行コメントとして記述され、//の直後にgo:または+buildが続きます(間にスペースはありません)。
  • 配置ルール:

    • ビルドディレクティブは、ファイルの先頭近くに配置されなければなりません。
    • 最も重要なルールは、ビルドディレクティブの前に、空白行と他の行コメント(//で始まるコメント)のみが先行することを許容する点です。ブロックコメント(/* */)や通常のコード行が先行すると、ディレクティブは無視されるか、正しく解釈されません。
    • Goファイルの場合、ビルドディレクティブはpackage句の前に記述する必要があります。
    • パッケージドキュメントと区別するために、一連のビルドディレクティブの後には空白行を置く必要があります。

Go言語のコメントの種類

Go言語には主に2種類のコメントがあります。

  1. 行コメント (Line Comments): //で始まり、行の終わりまでがコメントになります。
    // これは行コメントです
    
  2. ブロックコメント (Block Comments): /*で始まり、*/で終わる複数行にわたるコメントです。
    /*
    これは
    ブロックコメントです
    */
    

このコミットの背景にある問題は、Goツールチェーンがビルドディレクティブを解析する際に、行コメントとブロックコメントを異なる方法で扱うという点にあります。ビルドディレクティブは、その性質上、Goコンパイラやツールがソースファイルを読み込む初期段階で処理されるため、非常に厳格な構文解析ルールが適用されます。

技術的詳細

問題のファイルsrc/pkg/syscall/types_linux.goは、cgo -godefsへの入力として使用される型定義を含んでいました。このファイルには、以下のような構造がありました。

// Copyright ...
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

/*
Input to cgo -godefs.  See also mkerrors.sh and mkall.sh
*/
// +build ignore

// ... 実際の型定義 ...

ここで、// +build ignoreというビルドディレクティブの直前に、/* ... */というブロックコメントが存在しています。Goのビルドディレクティブの解析ロジックは、ファイルの先頭から読み込みを開始し、空白行や行コメントをスキップしながら最初のビルドディレクティブを探します。しかし、ブロックコメントに遭遇すると、それを「通常のコードの一部」または「ビルドディレクティブではない何か」とみなし、その後の行をビルドディレクティブとして認識しない可能性があります。

このコミットは、この問題を解決するために、ブロックコメントを同等の行コメントに変換しました。

// Copyright ...
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Input to cgo -godefs.  See also mkerrors.sh and mkall.sh
// +build ignore

// ... 実際の型定義 ...

これにより、// +build ignoreディレクティブの前に存在するコメントはすべて行コメントとなり、Goツールチェーンのビルドディレクティブの解析ルールに完全に準拠するようになりました。結果として、types_linux.goファイルは意図通りにビルドプロセスから除外される(ignoreタグのため)ようになります。

この修正は、Goのビルドシステムがどのようにコメントを解釈し、ビルドディレクティブを認識するかの厳密さを示しています。特に、Goの初期バージョンでは、このような細かな構文規則が重要でした。

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

--- a/src/pkg/syscall/types_linux.go
+++ b/src/pkg/syscall/types_linux.go
@@ -2,9 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-/*
-Input to cgo -godefs.  See also mkerrors.sh and mkall.sh
-*/
+// Input to cgo -godefs.  See also mkerrors.sh and mkall.sh
 
 // +build ignore
 

コアとなるコードの解説

変更はsrc/pkg/syscall/types_linux.goファイルにあります。

  • 削除された行:

    -/*
    -Input to cgo -godefs.  See also mkerrors.sh and mkall.sh
    -*/
    

    この3行のブロックコメントが削除されました。このブロックコメントが// +build ignoreディレクティブの直前に存在していたことが問題の原因でした。

  • 追加された行:

    +// Input to cgo -godefs.  See also mkerrors.sh and mkall.sh
    

    削除されたブロックコメントの内容が、単一行の行コメントとして追加されました。これにより、コメントの内容は保持されつつ、Goのビルドディレクティブの解析ルールに準拠する形式になりました。

この変更により、// +build ignoreディレクティブは、その前に空白行と行コメントのみが存在する状態となり、Goツールチェーンによって正しく認識されるようになります。ignoreタグは、このファイルが通常のビルドプロセスから除外されることを意味するため、この修正によって、types_linux.goが意図通りに無視されることが保証されます。

関連リンク

参考にした情報源リンク