[インデックス 16450] ファイルの概要
このコミットは、Go言語のcmd/go
ツールにC++ファイルのサポートを追加するものです。これにより、Goパッケージ内でC++ソースファイル(.cc, .cpp, .cxx)を直接含め、cgo
を通じてコンパイル・リンクできるようになります。また、C++ヘッダーファイル(.hh, .hpp, .hxx)の認識も強化され、cgo
ディレクティブにCPPFLAGS
とCXXFLAGS
が導入されました。
コミット
commit 84485361f94e2ea9eff9697105d71c9f53e44852
Author: Alberto García Hierro <alberto@garciahierro.com>
Date: Fri May 31 11:33:36 2013 -0700
cmd/go: Add support for including C++ files in packages
* Add a CXXFiles field to Package, which includes .cc, .cpp and .cxx files.
* CXXFiles are compiled using g++, which can be overridden using the CXX environment variable.
* Include .hh, .hpp and .hxx files in HFiles.
* Add support for CPPFLAGS (used for both C and C++) and CXXFLAGS (used only for C++) in cgo directive.
* Changed pkg-config cgo directive to modify CPPFLAGS rather than CFLAGS, so both C and C++ files get any flag returned by pkg-config --cflags.
Fixes #1476.
R=iant, r
CC=bradfitz, gobot, golang-dev, iant, minux.ma, remyoudompheng, seb.binet
https://golang.org/cl/8248043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/84485361f94e2ea9eff9697105d71c9f53e44852
元コミット内容
cmd/go: Add support for including C++ files in packages
* Add a CXXFiles field to Package, which includes .cc, .cpp and .cxx files.
* CXXFiles are compiled using g++, which can be overridden using the CXX environment variable.
* Include .hh, .hpp and .hxx files in HFiles.
* Add support for CPPFLAGS (used for both C and C++) and CXXFLAGS (used only for C++) in cgo directive.
* Changed pkg-config cgo directive to modify CPPFLAGS rather than CFLAGS, so both C and C++ files get any flag returned by pkg-config --cflags.
Fixes #1476.
変更の背景
Go言語は、C言語との相互運用を可能にするcgo
ツールを提供していますが、これまではC++ファイルの直接的なサポートが限定的でした。Goプログラムから既存のC++ライブラリを利用したり、パフォーマンスが重要な部分をC++で記述したりするニーズは存在します。
このコミット以前は、GoプロジェクトでC++コードを使用する場合、C++コードをC言語のインターフェースでラップし、そのCインターフェースをcgo
経由でGoから呼び出すという間接的な方法が一般的でした。この方法は手間がかかり、C++の機能を直接活用しにくいという課題がありました。
この変更は、GoのビルドシステムがC++ファイルをよりネイティブに扱えるようにすることで、C++との連携を簡素化し、開発者の利便性を向上させることを目的としています。特に、#cgo
ディレクティブにおけるC++固有のコンパイラフラグのサポートや、pkg-config
からのC++関連フラグの取得改善は、C++ライブラリとの連携をよりスムーズにするために不可欠でした。
前提知識の解説
Goのビルドプロセスとcgo
Go言語のビルドプロセスは、Goソースコードをコンパイルし、実行可能なバイナリを生成します。このプロセスにおいて、cgo
はGoプログラムがC言語のコードと相互運用するための重要なツールです。
import "C"
: Goのソースファイル内でimport "C"
と記述することで、そのファイルがcgo
を使用することを示します。この宣言の直前のコメントブロックには、C言語のコード(プリアンブル)を記述できます。cgo
の役割:go build
コマンドがimport "C"
を含むGoファイルを見つけると、cgo
ツールが起動されます。cgo
は、GoとCの間の呼び出しを仲介するスタブコードを生成し、Cコードをコンパイルするためにシステム上のCコンパイラ(通常はGCCやClang)を呼び出します。- コンパイルとリンク:
cgo
によって生成されたCのオブジェクトファイルは、Goのオブジェクトファイルと共にリンクされ、最終的な実行可能バイナリが作成されます。
C/C++コンパイラと関連フラグ
C/C++コードをコンパイルする際には、様々なフラグ(オプション)をコンパイラに渡すことで、コンパイルの挙動を制御します。
gcc
とg++
:gcc
: 主にC言語のコンパイルに使用されるGNU Compiler Collectionのコンポーネントです。g++
: 主にC++言語のコンパイルに使用されるGNU Compiler Collectionのコンポーネントです。C++固有の機能(クラス、テンプレートなど)をサポートします。
CPPFLAGS
(C PreProcessor Flags): Cプリプロセッサに渡されるフラグです。主にヘッダーファイルの検索パス(-I
)やマクロ定義(-D
)などに使用されます。CとC++の両方のソースファイルに適用されます。CFLAGS
(C Compiler Flags): Cコンパイラに渡されるフラグです。C言語のソースファイルにのみ適用されます。最適化レベル(-O2
)、警告オプション(-Wall
)などが含まれます。CXXFLAGS
(C++ Compiler Flags): C++コンパイラに渡されるフラグです。C++言語のソースファイルにのみ適用されます。C++の標準バージョン指定(-std=c++11
)などが含まれます。LDFLAGS
(Linker Flags): リンカに渡されるフラグです。ライブラリの検索パス(-L
)やリンクするライブラリ(-l
)などを指定します。
pkg-config
pkg-config
は、ソフトウェアライブラリのコンパイルおよびリンクに必要な情報を取得するためのコマンドラインツールです。ライブラリは.pc
という拡張子のファイル(パッケージ設定ファイル)を提供し、これにはライブラリのバージョン、必要なインクルードパス、リンカフラグなどの情報が含まれています。
cgo
は、#cgo pkg-config: <package_name>
というディレクティブを使用することで、pkg-config
から自動的にCFLAGS
やLDFLAGS
を取得し、ビルドプロセスに適用できます。これにより、手動でコンパイラやリンカのフラグを指定する手間が省け、ビルド設定のポータビリティが向上します。
Goのパッケージ構造とファイルの種類
Goのパッケージは、Goソースファイルだけでなく、C、C++、アセンブリなどの様々な種類のソースファイルを含むことができます。
.go
ファイル: Go言語のソースファイル。.c
ファイル: C言語のソースファイル。.s
ファイル: アセンブリ言語のソースファイル。.h
ファイル: C言語のヘッダーファイル。.syso
ファイル: システムオブジェクトファイル。事前にコンパイルされたオブジェクトファイルで、Goのビルド時にリンクされます。SWIG
関連ファイル:SWIG
(Simplified Wrapper and Interface Generator) を使用する場合のファイル。
このコミットでは、Goのビルドシステムが認識するファイルの種類にC++関連のものが追加されます。
技術的詳細
このコミットの主要な目的は、GoのビルドシステムがC++ファイルをネイティブに扱い、cgo
を通じてC++コードをコンパイル・リンクできるようにすることです。具体的な変更点は以下の通りです。
-
Package
構造体へのCXXFiles
フィールドの追加:cmd/go/pkg.go
およびsrc/pkg/go/build/build.go
内のPackage
構造体に、.cc
,.cpp
,.cxx
といったC++ソースファイルを格納するためのCXXFiles
フィールドが追加されました。これにより、GoのビルドツールはC++ファイルをGoパッケージの一部として認識し、管理できるようになります。 -
C++ファイルのコンパイルに
g++
を使用:cmd/go/build.go
において、CXXFiles
にリストされたC++ファイルはg++
コンパイラを使用してコンパイルされるようになりました。g++
のパスは、環境変数CXX
でオーバーライド可能です。これにより、Goのビルドプロセス内でC++コードが適切に処理されます。 -
C++ヘッダーファイル(.hh, .hpp, .hxx)の認識:
HFiles
フィールドが、従来の.h
ファイルに加えて、.hh
,.hpp
,.hxx
といったC++のヘッダーファイルも含むように拡張されました。これにより、C++プロジェクトで一般的に使用されるヘッダーファイルがGoのビルドシステムによって適切に認識され、処理されるようになります。cmd/godoc/index.go
では、これらの新しい拡張子がホワイトリストに追加され、godoc
がこれらのファイルをインデックス化できるようになりました。 -
#cgo
ディレクティブにおけるCPPFLAGS
とCXXFLAGS
のサポート:src/cmd/cgo/doc.go
のドキュメントが更新され、#cgo
ディレクティブでCPPFLAGS
とCXXFLAGS
が使用できるようになったことが明記されました。CPPFLAGS
: Cプリプロセッサに渡されるフラグで、CとC++の両方のファイルに適用されます。CXXFLAGS
: C++コンパイラにのみ渡されるフラグです。 これにより、Goパッケージ内でC/C++コードをビルドする際に、より細かくコンパイラオプションを制御できるようになります。対応する環境変数CGO_CPPFLAGS
とCGO_CXXFLAGS
も追加されました。
-
pkg-config
ディレクティブの変更:#cgo pkg-config:
ディレクティブが返す--cflags
が、従来のCFLAGS
ではなくCPPFLAGS
を修正するように変更されました。これは、pkg-config
が返すフラグがCとC++の両方のファイルに適用されるべきであるという意図に基づいています。これにより、CとC++のソースファイルがpkg-config
によって提供される共通のコンパイラフラグを確実に受け取れるようになります。 -
ビルド時のC++ファイル存在チェック:
cmd/go/build.go
のbuild
関数に、C++ファイルが存在するにもかかわらずcgo
またはSWIG
を使用していないパッケージに対するエラーチェックが追加されました。これは、C++ファイルはcgo
またはSWIG
を介してのみ処理できるため、それらを使用しない場合はビルドが失敗することを防ぐためのものです。
これらの変更により、GoのビルドシステムはC++コードをよりシームレスに統合できるようになり、GoとC++のハイブリッドプロジェクトの開発が容易になります。
コアとなるコードの変更箇所
このコミットにおける主要なコード変更は以下のファイルに集中しています。
src/cmd/cgo/doc.go
:cgo
ディレクティブのドキュメント更新。src/cmd/go/build.go
: ビルドロジックの変更、C++ファイルのコンパイル処理、新しいヘルパー関数の追加。src/cmd/go/doc.go
:go doc
コマンドで表示されるパッケージ情報の構造体定義の更新。src/cmd/go/list.go
:go list
コマンドで表示されるパッケージ情報の構造体定義の更新。src/cmd/go/pkg.go
:Package
構造体の定義変更、C++ファイル関連フィールドの追加。src/cmd/godoc/index.go
:godoc
が認識するファイル拡張子のホワイトリスト更新。src/pkg/go/build/build.go
:go/build
パッケージのPackage
構造体定義変更、ファイル認識ロジックの更新。
具体的な変更点と行数は以下の通りです。
src/cmd/cgo/doc.go
:CFLAGS
とLDFLAGS
に加えて、CPPFLAGS
,CXXFLAGS
が#cgo
ディレクティブで利用可能になったことを明記。pkg-config
がCFLAGS
ではなくCPPFLAGS
を修正するように変更されたことを明記。- 環境変数
CGO_CPPFLAGS
,CGO_CXXFLAGS
の追加を明記。
src/cmd/go/build.go
:fileExtSplit
ヘルパー関数の追加: ファイル名と拡張子を分離する。build
関数内で、C++ファイルが存在するがcgo
もSWIG
も使用していない場合にエラーを返すロジックを追加。cgo
呼び出し時にa.p.CXXFiles
を渡すように変更。HFiles
の処理において、ファイル名と拡張子を分離して処理するように変更。gc
関数で、textFiles
の計算にlen(p.CXXFiles)
を追加。gcc
関数をccompile
を呼び出すように変更。gxx
関数の追加:g++
を使用してC++ファイルをコンパイルする。ccompile
関数の追加: CまたはC++コンパイラを実行する汎用関数。gccld
関数で、C++ファイルが存在する場合はgxxCmd
を使用するように変更。gxxCmd
関数の追加:g++
コマンドラインプレフィックスを返す。ccompilerCmd
関数の追加: 環境変数とデフォルトコマンドに基づいてコンパイラコマンドラインプレフィックスを返す汎用関数。cgo
関数内で、CGO_CPPFLAGS
,CGO_CXXFLAGS
環境変数を考慮するように変更。pkg-config
の出力がcgoCFLAGS
ではなくcgoCPPFLAGS
に追加されるように変更。cgoCFLAGS
ではなくcgoCPPFLAGS
が-I
オプションに追加されるように変更。cgo
コマンド呼び出し時にcgoCPPFLAGS
を渡すように変更。- Cファイルのコンパイル時に
cgoCFLAGS
ではなくcflags
(cgoCPPFLAGS
とcgoCFLAGS
を結合したもの)を使用するように変更。 - C++ファイルのコンパイルロジックを追加し、
gxx
関数とcxxflags
(cgoCPPFLAGS
とcgoCXXFLAGS
を結合したもの)を使用。
src/cmd/go/doc.go
:Package
構造体にCXXFiles
フィールドを追加。HFiles
フィールドのコメントを更新し、.hh
,.hpp
,.hxx
を含むことを明記。CgoCPPFLAGS
,CgoCXXFLAGS
フィールドをCgo directives
セクションに追加。
src/cmd/go/list.go
:Package
構造体にCXXFiles
フィールドを追加。HFiles
フィールドのコメントを更新し、.hh
,.hpp
,.hxx
を含むことを明記。CgoCPPFLAGS
,CgoCXXFLAGS
フィールドをCgo directives
セクションに追加。
src/cmd/go/pkg.go
:Package
構造体にCXXFiles
フィールドを追加。HFiles
フィールドのコメントを更新し、.hh
,.hpp
,.hxx
を含むことを明記。CgoCPPFLAGS
,CgoCXXFLAGS
フィールドをCgo directives
セクションに追加。copyBuild
関数で、CXXFiles
,CgoCPPFLAGS
,CgoCXXFLAGS
をコピーするように変更。load
関数で、CXXFiles
をロードするように変更。usesCgo
ヘルパー関数の追加。isStale
関数で、srcs
のリストにp.CXXFiles
を追加。
src/cmd/godoc/index.go
:whitelisted
マップに.cc
,.cpp
,.cxx
,.hh
,.hpp
,.hxx
を追加し、godoc
がこれらのファイルを認識するように変更。
src/pkg/go/build/build.go
:Package
構造体にCXXFiles
フィールドを追加。HFiles
フィールドのコメントを更新し、.hh
,.hpp
,.hxx
を含むことを明記。CgoCPPFLAGS
,CgoCXXFLAGS
フィールドをCgo directives
セクションに追加。readDir
関数で、.cc
,.cpp
,.cxx
,.hh
,.hpp
,.hxx
を認識するように変更。saveCgo
関数で、CPPFLAGS
とCXXFLAGS
ディレクティブを処理するように変更。
コアとなるコードの解説
src/cmd/go/build.go
このファイルはGoのビルドロジックの核心であり、C++サポートの大部分がここに実装されています。
-
func fileExtSplit(file string) (name, ext string)
: この新しいヘルパー関数は、ファイル名から拡張子を安全に分離するために導入されました。これにより、HFiles
の処理など、ファイル名から拡張子を除いた部分を操作する際に、より堅牢な処理が可能になります。 -
C++ファイル存在チェック (
build
関数内):if len(a.p.CXXFiles) > 0 && !a.p.usesCgo() && !a.p.usesSwig() { return fmt.Errorf("can't build package %s because it contains C++ files (%s) but it's not using cgo nor SWIG", a.p.ImportPath, strings.Join(a.p.CXXFiles, ",")) }
このコードは、GoパッケージにC++ファイルが含まれているにもかかわらず、
cgo
もSWIG
も使用していない場合にビルドエラーを発生させます。これは、Goの標準ビルドツールがC++ファイルを直接コンパイルする機能を持たず、cgo
またはSWIG
を介して外部のC++コンパイラ(g++
など)に処理を委ねる必要があるためです。このチェックにより、誤った設定でのビルドを防ぎ、ユーザーに適切なガイダンスを提供します。 -
cgo
呼び出しの変更:outGo, outObj, err := b.cgo(a.p, cgoExe, obj, gccfiles, a.p.CXXFiles)
b.cgo
関数(cgo
ツールを実行するGoの内部関数)の呼び出しに、新しく認識されたa.p.CXXFiles
(C++ファイルのリスト)が追加されました。これにより、cgo
はCファイルだけでなくC++ファイルも処理対象として認識し、適切なコンパイラに渡すことができるようになります。 -
HFiles
の処理の変更:name, ext := fileExtSplit(file) // ... targ := file[:len(name)-len(_goos_goarch)] + "_GOOS_GOARCH." + ext
HFiles
(ヘッダーファイル)のコピー処理において、ファイル名から拡張子を分離するfileExtSplit
が使用されるようになりました。これにより、.h
だけでなく、.hh
,.hpp
,.hxx
といったC++ヘッダーファイルも、OSやアーキテクチャ固有の命名規則に従って適切にコピーされるようになります。 -
C/C++コンパイラの抽象化と
gxx
の導入:func (b *builder) gcc(p *Package, out string, flags []string, cfile string) error { return b.ccompile(p, out, flags, cfile, b.gccCmd(p.Dir)) } func (b *builder) gxx(p *Package, out string, flags []string, cxxfile string) error { return b.ccompile(p, out, flags, cxxfile, b.gxxCmd(p.Dir)) } func (b *builder) ccompile(p *Package, out string, flags []string, file string, compiler []string) error { file = mkAbs(p.Dir, file) return b.run(p.Dir, p.ImportPath, nil, compiler, flags, "-o", out, "-c", file) }
Cファイルのコンパイルを担当していた
gcc
関数が、汎用的なccompile
関数を呼び出すように変更されました。そして、C++ファイルをコンパイルするための新しいgxx
関数が追加され、これもccompile
を呼び出します。ccompile
は、渡されたcompiler
コマンド(gcc
またはg++
)を使用して、指定されたソースファイルをオブジェクトファイルにコンパイルします。これにより、CとC++のコンパイルロジックが共通化され、コードの重複が削減されました。 -
リンカの選択ロジックの変更 (
gccld
関数内):if len(p.CXXFiles) > 0 { cmd = b.gxxCmd(p.Dir) } else { cmd = b.gccCmd(p.Dir) }
リンカを実行する
gccld
関数において、パッケージにC++ファイル(p.CXXFiles
)が含まれている場合、リンカとしてg++
(b.gxxCmd
)を使用するように変更されました。C++ファイルが存在しない場合は、引き続きgcc
(b.gccCmd
)が使用されます。これは、C++コードを含むプロジェクトでは、C++標準ライブラリなどC++固有のライブラリをリンクするためにg++
リンカが必要となるためです。 -
コンパイラコマンドの取得 (
ccompilerCmd
の導入):func (b *builder) ccompilerCmd(envvar, defcmd, objdir string) []string { compiler := strings.Fields(os.Getenv(envvar)) if len(compiler) == 0 { compiler = append(compiler, defcmd) } a := []string{compiler[0], "-I", objdir, "-g", "-O2"} a = append(a, compiler[1:]...) return a }
gccCmd
とgxxCmd
が、共通のccompilerCmd
関数を呼び出すように変更されました。この関数は、指定された環境変数(例:CC
やCXX
)からコンパイラコマンドを取得し、設定されていない場合はデフォルトのコマンド(gcc
やg++
)を使用します。また、-I
(インクルードパス)、-g
(デバッグ情報)、-O2
(最適化レベル)といった共通のフラグを自動的に追加します。 -
cgo
関数におけるフラグ処理の強化:cgoCPPFLAGS := stringList(envList("CGO_CPPFLAGS"), p.CgoCPPFLAGS) cgoCFLAGS := stringList(envList("CGO_CFLAGS"), p.CgoCFLAGS) cgoCXXFLAGS := stringList(envList("CGO_CXXFLAGS"), p.CgoCXXFLAGS)
cgo
関数内で、CGO_CPPFLAGS
とCGO_CXXFLAGS
という新しい環境変数が考慮されるようになりました。これらの環境変数や#cgo
ディレクティブで指定されたフラグが、それぞれのコンパイラフラグリストに結合されます。if len(out) > 0 { cgoCPPFLAGS = append(cgoCPPFLAGS, strings.Fields(string(out))...) } // ... cgoCPPFLAGS = append(cgoCPPFLAGS, "-I", obj)
pkg-config
からの出力(--cflags
)がcgoCFLAGS
ではなくcgoCPPFLAGS
に追加されるように変更されました。また、_cgo_export.h
などの生成されたヘッダーファイルへのパス(-I obj
)もcgoCPPFLAGS
に追加されるようになりました。これにより、CとC++の両方のソースファイルが、pkg-config
やcgo
が生成するヘッダーファイルへのパスを適切に受け取れるようになります。cflags := stringList(cgoCPPFLAGS, cgoCFLAGS) // ... cxxflags := stringList(cgoCPPFLAGS, cgoCXXFLAGS)
Cファイルのコンパイルには
cgoCPPFLAGS
とcgoCFLAGS
を結合したcflags
が、C++ファイルのコンパイルにはcgoCPPFLAGS
とcgoCXXFLAGS
を結合したcxxflags
が使用されるようになりました。これにより、CとC++で共通のプリプロセッサフラグと、それぞれの言語固有のコンパイラフラグを適切に適用できます。for _, file := range gxxfiles { // ... if err := b.gxx(p, ofile, cxxflags, file); err != nil { return nil, nil, err } // ... }
gxxfiles
(C++ソースファイル)のリストをループ処理し、それぞれのファイルをgxx
関数とcxxflags
を使用してコンパイルするロジックが追加されました。これにより、Goのビルドプロセス内でC++ファイルが実際にコンパイルされ、オブジェクトファイルが生成されるようになります。
src/cmd/go/pkg.go
このファイルはGoのパッケージ情報を定義するPackage
構造体を含んでいます。
-
Package
構造体へのCXXFiles
フィールドの追加:type Package struct { // ... CXXFiles []string `json:",omitempty"` // .cc, .cpp and .cxx source files HFiles []string `json:",omitempty"` // .h, .hh, .hpp and .hxx source files // ... CgoCPPFLAGS []string `json:",omitempty"` // cgo: flags for C preprocessor CgoCFLAGS []string `json:",omitempty"` // cgo: flags for C compiler 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 // ... }
Package
構造体にCXXFiles
、CgoCPPFLAGS
、CgoCXXFLAGS
といった新しいフィールドが追加されました。これにより、GoのビルドシステムはC++ソースファイルやC++関連のコンパイラフラグをパッケージのメタデータとして保持し、管理できるようになります。HFiles
のコメントも更新され、C++ヘッダーファイルも含まれることが明記されました。 -
usesCgo()
関数の追加:func (p *Package) usesCgo() bool { return len(p.CgoFiles) > 0 }
このヘルパー関数は、パッケージが
cgo
を使用しているかどうかを簡潔に判断するために追加されました。これはcmd/go/build.go
のC++ファイル存在チェックで使用されています。
src/pkg/go/build/build.go
このファイルはGoのビルドパッケージの低レベルな機能を提供します。
-
Package
構造体へのフィールド追加:src/cmd/go/pkg.go
と同様に、go/build
パッケージのPackage
構造体にもCXXFiles
、CgoCPPFLAGS
、CgoCXXFLAGS
フィールドが追加されました。これにより、Goのビルドシステム全体でC++関連の情報を一貫して扱えるようになります。 -
ファイル認識ロジックの更新:
switch ext { case ".go", ".c", ".cc", ".cxx", ".cpp", ".s", ".h", ".hh", ".hpp", ".hxx", ".S", ".swig", ".swigcxx": // tentatively okay - read to make sure // ... case ".cc", ".cpp", ".cxx": p.CXXFiles = append(p.CXXFiles, name) continue case ".h", ".hh", ".hpp", ".hxx": p.HFiles = append(p.HFiles, name) continue
readDir
関数内のファイル拡張子認識ロジックが更新され、.cc
,.cpp
,.cxx
がC++ソースファイルとして、.hh
,.hpp
,.hxx
がヘッダーファイルとしてそれぞれCXXFiles
およびHFiles
に分類されるようになりました。これにより、Goのビルドシステムはこれらのファイルを自動的に検出し、適切な処理を行うことができます。 -
saveCgo
関数におけるCPPFLAGS
とCXXFLAGS
の処理:case "CPPFLAGS": di.CgoCPPFLAGS = append(di.CgoCPPFLAGS, args...) case "CXXFLAGS": di.CgoCXXFLAGS = append(di.CgoCXXFLAGS, args...)
saveCgo
関数は、Goソースファイルのプリアンブルにある#cgo
ディレクティブを解析し、対応するフラグをPackage
構造体に保存します。この変更により、#cgo CPPFLAGS:
と#cgo CXXFLAGS:
ディレクティブが認識され、それぞれのフラグがCgoCPPFLAGS
とCgoCXXFLAGS
フィールドに格納されるようになりました。
これらの変更は、GoのビルドシステムがC++ファイルをGoパッケージの一部として認識し、適切なコンパイラとフラグを使用してコンパイル・リンクするための基盤を確立します。これにより、GoとC++の連携がよりシームレスになり、開発者は既存のC++コードベースをGoプロジェクトに統合しやすくなります。
関連リンク
- Go Command Documentation: https://go.dev/cmd/go/
- Go cgo Documentation: https://go.dev/cmd/cgo/
- Go build package documentation: https://go.dev/pkg/go/build/
- Original Go issue: https://github.com/golang/go/issues/1476 (このコミットが修正したIssue)
参考にした情報源リンク
- Go's
cgo
tool provides support for interoperability with C and, indirectly, with C++: https://reinkrul.nl/ - How Go supports C++ through
cgo
: https://www.geeksforgeeks.org/go-cgo-cpp-support/ extern "C"
linkage specification: https://stackoverflow.com/questions/1041866/what-is-the-effect-of-extern-c-in-ccgo
and the Go build process: https://go.dev/blog/cgocgo
andpkg-config
: https://go.dev/blog/cgo-and-pkg-configCPPFLAGS
,CFLAGS
,CXXFLAGS
,LDFLAGS
incgo
: https://github.io/golang/go/wiki/cgo- Go
CXXFiles
: https://go.dev/src/cmd/go/pkg.go - Go
HFiles
(CGO context): https://stackoverflow.com/questions/24800000/what-are-hfiles-in-go CGO_ENABLED
environment variable: https://go.dev/doc/install/source#environment