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

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

このコミットは、Go言語のツールチェインにおけるCgo関連のフラグ(CFLAGS, CPPFLAGSなど)の順序を統一し、関連するドキュメントや内部データ構造における表記の整合性を向上させることを目的としています。また、タイプミスも修正されています。

コミット

commit f032eefdb0fb63555b4b7c83aaad5ae74550559c
Author: Russ Cox <rsc@golang.org>
Date:   Wed Jun 5 07:14:05 2013 -0400

    cmd/cgo, cmd/go, go/build: sort flag lists
    
    CFLAGS comes before CPPFLAGS.
    Also fix one typo CPPCFLAGS.
    
    Cleanup for CL 8248043.
    
    R=golang-dev, iant, alberto.garcia.hierro
    CC=golang-dev
    https://golang.org/cl/9965045

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

https://github.com/golang/go/commit/f032eefdb0fb63555b4b7c83aaad5ae74550559c

元コミット内容

cmd/cgo, cmd/go, go/build: sort flag lists

CFLAGS comes before CPPFLAGS.
Also fix one typo CPPCFLAGS.

Cleanup for CL 8248043.

変更の背景

このコミットの主な背景は、Go言語のビルドシステム、特にCgo(GoからCコードを呼び出すためのツール)に関連するフラグのリストにおける一貫性の欠如を解消することにあります。具体的には、CFLAGSCPPFLAGSの順序がドキュメントや内部コードで統一されていなかったため、これをCFLAGSCPPFLAGSの前に来るように整理しています。

また、src/pkg/go/build/build.go内のコメントに存在したCPPCFLAGSというタイプミスも修正されています。これはおそらくCPPFLAGSの誤記であり、正確な表記に修正することでコードの可読性と正確性を向上させています。

これらの変更は、機能的な影響はほとんどなく、主にコードベースの保守性、可読性、および内部的な整合性を高めるための「クリーンアップ」作業の一環として行われました。コミットメッセージにあるCleanup for CL 8248043は、以前の変更(CL 8248043)に関連する整理作業であることを示唆しています。

前提知識の解説

このコミットを理解するためには、以下の概念について知っておく必要があります。

  • Cgo: Go言語のプログラムからC言語のコードを呼び出すためのGoの機能です。Cgoを使用することで、既存のCライブラリをGoプロジェクトに統合したり、パフォーマンスが重要な部分をCで記述したりすることが可能になります。Cgoは、Goのソースファイル内に特別なimport "C"ブロックと#cgoディレクティブを使用します。
  • #cgo ディレクティブ: Goのソースコード内のコメントとして記述される特別なディレクティブで、CgoがCコンパイラやリンカに渡すフラグを指定するために使用されます。例えば、#cgo CFLAGS: -I/path/to/includeのように記述します。
  • コンパイラ/リンカフラグ:
    • CFLAGS: Cコンパイラ(通常はGCCやClang)に渡されるフラグです。Cソースファイルのコンパイル時に使用され、最適化レベル、警告設定、特定の標準の有効化などを指定します。
    • CPPFLAGS: Cプリプロセッサに渡されるフラグです。主にインクルードパス(-I)やマクロ定義(-D)を指定するために使用されます。Cコンパイラがソースファイルを処理する前にプリプロセッサが実行されます。
    • CXXFLAGS: C++コンパイラに渡されるフラグです。CFLAGSのC++版です。
    • LDFLAGS: リンカに渡されるフラグです。ライブラリの検索パス(-L)やリンクするライブラリ名(-l)などを指定します。
  • go/build パッケージ: Goの標準ライブラリの一部で、GoのビルドシステムがGoパッケージの情報を解析し、ビルドに必要なファイルや依存関係を特定するために使用されます。このパッケージは、Goソースファイルの解析、#cgoディレクティブの処理、ビルドタグの解釈などを行います。
  • cmd/go: Goコマンド(go build, go run, go testなど)の実装が含まれるディレクトリです。Go言語のビルド、テスト、実行など、主要な開発ワークフローを管理します。
  • cmd/cgo: Cgoツール自体の実装が含まれるディレクトリです。GoとCの間のバインディングコードを生成する役割を担います。
  • .syso ファイル: システムオブジェクトファイル(System Object files)の略です。これらは、Goのビルドプロセスに含めることができる、プラットフォーム固有のコンパイル済みオブジェクトファイルです。通常、Cgoを使用せずにC/C++コードをGoプログラムにリンクする場合や、特定のシステムライブラリを静的にリンクする場合に利用されます。

技術的詳細

このコミットは、Goツールチェインの複数のコンポーネントにわたる、Cgo関連のフラグのリストの順序と表記の整合性を改善しています。

  1. フラグの順序の統一:

    • src/cmd/cgo/doc.go: Cgoのドキュメントにおいて、#cgoディレクティブで定義できるフラグのリスト(CPPFLAGS, CFLAGS, CXXFLAGS, LDFLAGS)がCFLAGS, CPPFLAGS, CXXFLAGS, LDFLAGSに修正されています。同様に、環境変数リストもCGO_CPPFLAGS, CGO_CFLAGSからCGO_CFLAGS, CGO_CPPFLAGSに修正されています。
    • src/cmd/go/doc.go, src/cmd/go/list.go, src/cmd/go/pkg.go: cmd/goツールが内部的に使用するPackage構造体(Goパッケージのメタデータを保持)において、CgoCPPFLAGSCgoCFLAGSのフィールドの宣言順序が入れ替えられ、CgoCFLAGSCgoCPPFLAGSの前に来るように変更されています。これは、go/buildパッケージのPackage構造体における順序と一致させるためです。
    • src/pkg/go/build/build.go: go/buildパッケージのPackage構造体でも、CgoCPPFLAGSCgoCFLAGSのフィールドの宣言順序が入れ替えられています。また、saveCgo関数のコメント内のフラグリストもCPPCFLAGS, CFLAGSからCFLAGS, CPPFLAGSに修正されています。
  2. タイプミスの修正:

    • src/pkg/go/build/build.gosaveCgo関数のコメント内で、CPPCFLAGSというタイプミスがCPPFLAGSに修正されています。これは、Cプリプロセッサフラグの正しい表記です。
  3. .sysoファイルの順序変更:

    • src/cmd/go/doc.go, src/cmd/go/list.go, src/cmd/go/pkg.go, src/pkg/go/build/build.go: Package構造体内のSysoFilesフィールドの宣言位置が、SwigCXXFilesの後に移動されています。これは、Cgo関連のフラグの順序変更と同様に、構造体フィールドのリストにおける一貫性と整理を目的とした変更と考えられます。

これらの変更は、Goツールチェインの内部的な整合性を高め、開発者がCgo関連のフラグやファイルタイプを扱う際の混乱を減らすことに貢献します。機能的な動作に直接的な影響を与えるものではなく、主にコードベースの品質向上と保守性の改善を目的としています。

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

このコミットでは、以下の5つのファイルが変更されています。

  1. src/cmd/cgo/doc.go
  2. src/cmd/go/doc.go
  3. src/cmd/go/list.go
  4. src/cmd/go/pkg.go
  5. src/pkg/go/build/build.go

これらのファイルにおける主な変更は、Cgo関連のフラグ(CFLAGS, CPPFLAGSなど)のリストの順序の入れ替えと、CPPCFLAGSというタイプミスの修正です。また、SysoFilesフィールドの順序も変更されています。

具体的な変更箇所は以下の通りです。

  • src/cmd/cgo/doc.go:
    • CPPFLAGS, CFLAGS, CXXFLAGS and LDFLAGS -> CFLAGS, CPPFLAGS, CXXFLAGS and LDFLAGS
    • CGO_CPPFLAGS, CGO_CFLAGS, CGO_CXXFLAGS and CGO_LDFLAGS -> CGO_CFLAGS, CGO_CPPFLAGS, CGO_CXXFLAGS and CGO_LDFLAGS
  • src/cmd/go/doc.go:
    • SysoFilesフィールドの宣言位置がSwigCXXFilesの後ろに移動。
    • CgoCPPFLAGSCgoCFLAGSの宣言順序が入れ替えられ、CgoCFLAGSが先に。
  • src/cmd/go/list.go:
    • SysoFilesフィールドの宣言位置がSwigCXXFilesの後ろに移動。
    • CgoCPPFLAGSCgoCFLAGSの宣言順序が入れ替えられ、CgoCFLAGSが先に。
  • src/cmd/go/pkg.go:
    • Package構造体内のSysoFilesフィールドの宣言位置がSwigCXXFilesの後ろに移動。
    • Package構造体内のCgoCPPFLAGSCgoCFLAGSの宣言順序が入れ替えられ、CgoCFLAGSが先に。
    • copyBuildメソッド内でのSysoFilesCgoCPPFLAGSCgoCFLAGSのコピー順序も、新しい宣言順序に合わせて変更。
  • src/pkg/go/build/build.go:
    • Package構造体内のSysoFilesフィールドの宣言位置がSwigCXXFilesの後ろに移動。
    • Package構造体内のCgoCPPFLAGSCgoCFLAGSの宣言順序が入れ替えられ、CgoCFLAGSが先に。
    • saveCgo関数のコメント内のCPPCFLAGS, CFLAGSCFLAGS, CPPFLAGSに修正(タイプミス修正)。

コアとなるコードの解説

このコミットのコアとなる変更は、Goツールチェインの様々な部分でCgo関連のフラグのリストの順序を標準化し、タイプミスを修正することです。

例えば、src/cmd/cgo/doc.goでは、Cgoディレクティブで設定できるフラグのリストが以下のように変更されています。

--- a/src/cmd/cgo/doc.go
+++ b/src/cmd/cgo/doc.go
@@ -24,7 +24,7 @@ the C parts of the package.  For example:
  	// #include <errno.h>
  	import "C"
 
-CPPFLAGS, CFLAGS, CXXFLAGS and LDFLAGS may be defined with pseudo #cgo directives
+CFLAGS, CPPFLAGS, CXXFLAGS and LDFLAGS may be defined with pseudo #cgo directives
 within these comments to tweak the behavior of gcc.  Values defined
 in multiple directives are concatenated together.  Options prefixed
 by $GOOS, $GOARCH, or $GOOS/$GOARCH are only defined in matching
@@ -44,7 +44,7 @@ For example:
  	// #include <png.h>
  	import "C"
 
-The CGO_CPPFLAGS, CGO_CFLAGS, CGO_CXXFLAGS and CGO_LDFLAGS environment variables are added
+The CGO_CFLAGS, CGO_CPPFLAGS, CGO_CXXFLAGS and CGO_LDFLAGS environment variables are added
 to the flags derived from these directives.  Package-specific flags should
 be set using the directives, not the environment variables, so that builds
 work in unmodified environments.

この変更は、ドキュメントにおけるフラグの提示順序をCFLAGSCPPFLAGSの前に来るように統一しています。これは、Goの内部的な慣習や、コンパイラフラグの一般的な順序(CプリプロセッサフラグがCコンパイラフラグよりも先に処理されることが多いが、リストアップの際にはCFLAGSがより一般的であるため先に記述される)に合わせたものと考えられます。

また、src/cmd/go/pkg.gosrc/pkg/go/build/build.goなどのファイルでは、Goパッケージのメタデータを表すPackage構造体内のフィールドの順序が変更されています。

--- a/src/cmd/go/pkg.go
+++ b/src/cmd/go/pkg.go
@@ -43,13 +43,13 @@ type Package struct {
  	CXXFiles       []string `json:",omitempty"` // .cc, .cpp and .cxx source files
  	HFiles         []string `json:",omitempty"` // .h, .hh, .hpp and .hxx source files
  	SFiles         []string `json:",omitempty"` // .s source files
-	SysoFiles      []string `json:",omitempty"` // .syso system object files added to package
  	SwigFiles      []string `json:",omitempty"` // .swig files
  	SwigCXXFiles   []string `json:",omitempty"` // .swigcxx files
+	SysoFiles      []string `json:",omitempty"` // .syso system object files added to package
 
  	// Cgo directives
-	CgoCPPFLAGS  []string `json:",omitempty"` // cgo: flags for C preprocessor
  	CgoCFLAGS    []string `json:",omitempty"` // cgo: flags for C compiler
+	CgoCPPFLAGS  []string `json:",omitempty"` // cgo: flags for C preprocessor
  	CgoCXXFLAGS  []string `json:",omitempty"` // cgo: flags for C++ compiler
  	CgoLDFLAGS   []string `json:",omitempty"` // cgo: flags for linker
  	CgoPkgConfig []string `json:",omitempty"` // cgo: pkg-config names

この変更は、SysoFilesフィールドとCgoCPPFLAGS/CgoCFLAGSフィールドの順序を調整しています。これは、構造体の定義における一貫性を保ち、関連するフィールドが論理的な順序で並ぶようにするためのものです。機能的な影響はなく、コードの保守性と可読性を向上させるためのリファクタリングと見なせます。

最後に、src/pkg/go/build/build.goのコメント修正は、単なるタイプミス(CPPCFLAGSCPPFLAGSに)の修正であり、コードの正確性を高めるものです。

これらの変更は全体として、Goツールチェインの内部的な整合性を高め、開発者がCgo関連の情報をより明確に理解できるようにするための「クリーンアップ」作業の一環です。

関連リンク

参考にした情報源リンク

  • Go言語のソースコード (GitHub): https://github.com/golang/go
  • Go Code Review Comments (CL 9965045): https://golang.org/cl/9965045 (コミットメッセージに記載されているChangeListへのリンク)
  • Go Code Review Comments (CL 8248043): https://golang.org/cl/8248043 (コミットメッセージに記載されている関連するChangeListへのリンク)
  • Cgoの基本と使い方に関する一般的な情報源 (例: 各種ブログ記事、チュートリアルなど)
  • コンパイラ/リンカフラグに関する一般的な情報源 (例: GCC/Clangのドキュメントなど)