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

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

このコミットは、Go言語のランタイムにおけるCgo関連のファイル整理を目的としています。具体的には、src/pkg/runtime/cgo/trigger.goというファイルが削除され、そのファイルに含まれていたCgoのリンカフラグ(LDFLAGS)に関するディレクティブがsrc/pkg/runtime/cgo/cgo.goに移動されています。これにより、Cgoのビルド設定が一元化され、不要なファイルが削除されました。

コミット

commit 22c41ff019592edcc7f7039d1ac0fffd638c4b7b
Author: Mikio Hara <mikioh.mikioh@gmail.com>
Date:   Tue Feb 21 12:07:38 2012 +0900

    runtime: remove an obsolete file
    
    R=golang-dev, adg
    CC=golang-dev
    https://golang.org/cl/5686049

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

https://github.com/golang/go/commit/22c41ff019592edcc7f7039d1ac0fffd638c4b7b

元コミット内容

このコミットの元々の意図は、Goランタイム内の「廃止されたファイル」を削除することです。具体的には、src/pkg/runtime/cgo/trigger.goというファイルが対象でした。このファイルは、GoツールがCgoを使用してパッケージをビルドすることを認識させるためのものでしたが、ビルドシステムの変更に伴い不要になったと考えられます。

変更の背景

この変更の背景には、Go言語のビルドシステム、特にCgoの取り扱いに関する進化があります。初期のGoのビルドプロセスでは、Cgoを使用するパッケージをGoツールに認識させるために、特定のファイル(この場合はtrigger.go)にimport "C"#cgoディレクティブを記述する必要がありました。これは、GoのビルドツールがCgoの依存関係を正しく解決し、外部Cコードとリンクするために必要な情報を提供するためです。

しかし、Goのビルドシステムは継続的に改善されており、時間の経過とともに、このような「トリガー」ファイルが不要になるような変更が加えられた可能性があります。このコミットが行われた2012年2月頃は、Go 1のリリースが近づいていた時期であり、Goのツールチェインやランタイムの安定化、効率化が進められていました。trigger.goの削除は、ビルドプロセスの簡素化と、Cgo関連のビルド設定の一元化の一環として行われたと考えられます。trigger.goのコメントにある「TODO: Once we stop using Make, this import can move into cgo.go.」という記述は、GoのビルドがMakeベースのシステムからGo独自のビルドツールへと移行する過程で、このファイルが不要になることが予見されていたことを示唆しています。

前提知識の解説

Go言語のCgo

Cgoは、GoプログラムからC言語のコードを呼び出すためのGoの機能です。また、C言語のコードからGoの関数を呼び出すことも可能です。Cgoを使用することで、既存のCライブラリをGoプロジェクトに統合したり、パフォーマンスが重要な部分をCで記述したりすることができます。

Cgoを使用するには、Goのソースファイル内に特別なコメントブロックを記述します。このコメントブロックは、import "C"の直前に配置され、Cのコードや、Cコンパイラやリンカに渡すためのディレクティブ(#cgo)を含めることができます。

#cgo ディレクティブ

#cgoディレクティブは、CgoがCコードをコンパイルおよびリンクする際に使用するフラグを指定するために使われます。主な用途は以下の通りです。

  • CFLAGS: Cコンパイラに渡すフラグ(例: -I/path/to/includeでインクルードパスを指定)。
  • LDFLAGS: リンカに渡すフラグ(例: -L/path/to/lib -lfooでライブラリのパスとライブラリ名を指定)。
  • CPPFLAGS: Cプリプロセッサに渡すフラグ。
  • CXXFLAGS: C++コンパイラに渡すフラグ。

これらのディレクティブは、Goプログラムが外部のCライブラリに依存している場合に、そのライブラリを正しくリンクするために不可欠です。

LDFLAGS: -lpthread

LDFLAGS: -lpthreadは、リンカに対してpthreadライブラリ(POSIXスレッドライブラリ)をリンクするように指示するフラグです。多くのUnix系システム(Linux, macOS, FreeBSDなど)では、スレッド関連の機能を使用するCプログラムは、このライブラリに依存しています。Goのランタイムは、内部的にスレッドを使用するため、Cgoを介してCコードと連携する際に、このpthreadライブラリが必要となる場合があります。特に、GoのスケジューラがOSのスレッドとどのように連携するか、あるいはCgoがC関数を呼び出す際に新しいOSスレッドを生成する必要がある場合などに重要になります。

LDFLAGS: -lm -mthreads (Windows)

Windows環境では、pthreadの代わりに異なるリンカフラグが使用されます。

  • -lm: 数学関数ライブラリ(libm)をリンクします。これは、CgoがGoのランタイムとCライブラリの間で数学関数を扱う際に必要となる可能性があります。
  • -mthreads: MinGWなどのGCCベースのコンパイラでWindowsのスレッドモデルを使用するためのフラグです。Windows上でのCgoの動作において、スレッド関連の機能が正しくリンクされるようにするために必要です。

Goランタイム

Goランタイムは、Goプログラムの実行を管理するシステムです。これには、ガベージコレクタ、スケジューラ(ゴルーチンをOSスレッドにマッピング)、メモリ管理、Cgoとの連携などが含まれます。GoプログラムがCgoを介してCコードとやり取りする場合、ランタイムはCgoの呼び出しを仲介し、GoとCのスタック間の切り替えなどを管理します。

技術的詳細

このコミットの技術的な核心は、GoのビルドシステムにおけるCgoディレクティブの処理方法の進化にあります。

元々、src/pkg/runtime/cgo/trigger.goというファイルが存在し、その中にCgoのLDFLAGSディレクティブが含まれていました。このファイル名が示唆するように、これはGoツールがCgoを使用するパッケージをビルドする際に、Cgoのビルドプロセスを「トリガー」するための役割を担っていたと考えられます。つまり、このファイルが存在し、import "C"を含んでいることで、GoツールはCgoのコンパイルとリンクのステップを実行する必要があると判断していたのでしょう。

しかし、Goのビルドシステムが成熟するにつれて、このような明示的な「トリガー」ファイルは不要になったか、あるいはより効率的な方法でCgoの依存関係が検出されるようになったと考えられます。trigger.goのコメントにある「TODO: Once we stop using Make, this import can move into cgo.go.」という記述は、GoのビルドプロセスがMakeベースのシステムからGo独自のビルドツール(go buildなど)へと移行するにつれて、このファイルが冗長になることが予見されていたことを強く示唆しています。

このコミットでは、trigger.goを削除し、その中にあった重要な#cgo LDFLAGSディレクティブをsrc/pkg/runtime/cgo/cgo.goに移動しています。cgo.goは、Cgoのランタイムサポートに関する主要なファイルであり、Cgoの内部実装に関連するコードが含まれています。この移動により、Cgoのビルド設定がCgoのコアロジックを扱うファイルに統合され、関連する情報が一箇所に集約されることになります。これは、コードの保守性と理解しやすさを向上させるための典型的なリファクタリングパターンです。

結果として、Goのビルドツールは、cgo.go内の#cgoディレクティブを直接読み取り、必要なリンカフラグを適用するようになります。これにより、trigger.goという中間的なファイルが不要になり、ビルドプロセスがわずかに簡素化されます。

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

src/pkg/runtime/cgo/cgo.go の変更

--- a/src/pkg/runtime/cgo/cgo.go
+++ b/src/pkg/runtime/cgo/cgo.go
@@ -9,6 +9,18 @@ for details on using cgo.
 */
 package cgo
 
+/*
+
+#cgo darwin LDFLAGS: -lpthread
+#cgo freebsd LDFLAGS: -lpthread
+#cgo linux LDFLAGS: -lpthread
+#cgo netbsd LDFLAGS: -lpthread
+#cgo openbsd LDFLAGS: -lpthread
+#cgo windows LDFLAGS: -lm -mthreads
+
+*/
+import "C"
+
 // Supports _cgo_panic by converting a string constant to an empty
 // interface.
 

src/pkg/runtime/cgo/trigger.go の変更

--- a/src/pkg/runtime/cgo/trigger.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This tells the go tool that this package builds using cgo.
-// TODO: Once we stop using Make, this import can move into cgo.go.
-
-package cgo
-
-/*
-
-#cgo darwin LDFLAGS: -lpthread
-#cgo freebsd LDFLAGS: -lpthread
-#cgo linux LDFLAGS: -lpthread
-#cgo netbsd LDFLAGS: -lpthread
-#cgo openbsd LDFLAGS: -lpthread
-#cgo windows LDFLAGS: -lm -mthreads
-
-*/
-import "C"

コアとなるコードの解説

このコミットの主要な変更は、src/pkg/runtime/cgo/trigger.goファイルが完全に削除され、そのファイルに含まれていたCgoディレクティブのブロックがsrc/pkg/runtime/cgo/cgo.goファイルに移動されたことです。

削除された src/pkg/runtime/cgo/trigger.go

このファイルは、そのコメントから「Goツールがこのパッケージをcgoを使ってビルドすることを伝える」ためのものであったことがわかります。また、「TODO: Once we stop using Make, this import can move into cgo.go.」というコメントは、GoのビルドシステムがMakeベースからGo独自のツールチェーンへと移行する際に、このファイルが不要になることが予見されていたことを示しています。

削除されたファイルには、以下のCgoディレクティブが含まれていました。

/*
#cgo darwin LDFLAGS: -lpthread
#cgo freebsd LDFLAGS: -lpthread
#cgo linux LDFLAGS: -lpthread
#cgo netbsd LDFLAGS: -lpthread
#cgo openbsd LDFLAGS: -lpthread
#cgo windows LDFLAGS: -lm -mthreads
*/
import "C"

これらのディレクティブは、各オペレーティングシステム(Darwin/macOS, FreeBSD, Linux, NetBSD, OpenBSD, Windows)において、CgoがGoのランタイムとCコードをリンクする際に必要となるリンカフラグを指定しています。特に-lpthreadはPOSIXスレッドライブラリを、Windowsの-lm -mthreadsは数学ライブラリとスレッド関連のライブラリをリンクするために使用されます。

変更された src/pkg/runtime/cgo/cgo.go

このファイルは、GoのCgoランタイムサポートの主要な部分を担っています。削除されたtrigger.goから、上記のCgoディレクティブブロックがこのファイルにそのまま追加されました。

これにより、Cgoのビルドに必要なリンカフラグの情報が、Cgoのコアロジックを扱うファイルに直接組み込まれることになります。Goツールは、cgo.goをコンパイルする際にこのディレクティブを読み取り、指定されたリンカフラグをビルドプロセスに適用します。

この変更の意図は、Cgoのビルド設定をより論理的な場所に統合し、trigger.goという冗長なファイルを削除することで、コードベースを整理し、ビルドプロセスを簡素化することにあります。Goのビルドシステムが進化し、Cgoの依存関係の検出方法が改善されたため、もはやtrigger.goのような「トリガー」ファイルは必要なくなった、という判断が背景にあると考えられます。

関連リンク

  • Go言語のCgoに関する公式ドキュメント(現在のバージョン): https://pkg.go.dev/cmd/cgo
  • Go 1リリースノート(2012年3月28日リリース): https://go.dev/doc/go1 (このコミットはGo 1リリース直前の変更と推測されます)

参考にした情報源リンク

  • Go言語のCgoに関する一般的な情報
  • Go言語のビルドプロセスに関する情報
  • pthreadライブラリに関する情報
  • MinGW/GCCのリンカフラグに関する情報
  • Goのコミット履歴と関連する議論(golang-devメーリングリストなど)
  • trigger.goのコメント内容

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

このコミットは、Go言語のランタイムにおけるCgo関連のファイル整理を目的としています。具体的には、src/pkg/runtime/cgo/trigger.goというファイルが削除され、そのファイルに含まれていたCgoのリンカフラグ(LDFLAGS)に関するディレクティブがsrc/pkg/runtime/cgo/cgo.goに移動されています。これにより、Cgoのビルド設定が一元化され、不要なファイルが削除されました。

コミット

commit 22c41ff019592edcc7f7039d1ac0fffd638c4b7b
Author: Mikio Hara <mikioh.mikioh@gmail.com>
Date:   Tue Feb 21 12:07:38 2012 +0900

    runtime: remove an obsolete file
    
    R=golang-dev, adg
    CC=golang-dev
    https://golang.org/cl/5686049

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

https://github.com/golang/go/commit/22c41ff019592edcc7f7039d1ac0fffd638c4b7b

元コミット内容

このコミットの元々の意図は、Goランタイム内の「廃止されたファイル」を削除することです。具体的には、src/pkg/runtime/cgo/trigger.goというファイルが対象でした。このファイルは、GoツールがCgoを使用してパッケージをビルドすることを認識させるためのものでしたが、ビルドシステムの変更に伴い不要になったと考えられます。

変更の背景

この変更の背景には、Go言語のビルドシステム、特にCgoの取り扱いに関する進化があります。初期のGoのビルドプロセスでは、Cgoを使用するパッケージをGoツールに認識させるために、特定のファイル(この場合はtrigger.go)にimport "C"#cgoディレクティブを記述する必要がありました。これは、GoのビルドツールがCgoの依存関係を正しく解決し、外部Cコードとリンクするために必要な情報を提供するためです。

このコミットが行われた2012年2月頃は、Go 1のリリース(2012年3月)が目前に迫っており、Goのツールチェインやランタイムの安定化、効率化が活発に進められていた時期です。trigger.goのコメントにある「TODO: Once we stop using Make, this import can move into cgo.go.」という記述は、GoのビルドがMakeベースのシステムからGo独自のビルドツールへと移行する過程で、このファイルが不要になることが予見されていたことを示唆しています。

Web検索では「trigger.go」という特定のファイルが2012年に廃止されたという直接的な公式ドキュメントは見つかりませんでしたが、2012年がGo 1.0のリリースとCgoツールの活発な開発期間であったことは確認できました。これは、Goプロジェクト内部でビルドプロセスの簡素化やリファクタリングが継続的に行われていたという文脈と一致します。したがって、trigger.goの削除は、ビルドプロセスの簡素化と、Cgo関連のビルド設定の一元化の一環として行われたと考えられます。

前提知識の解説

Go言語のCgo

Cgoは、GoプログラムからC言語のコードを呼び出すためのGoの機能です。また、C言語のコードからGoの関数を呼び出すことも可能です。Cgoを使用することで、既存のCライブラリをGoプロジェクトに統合したり、パフォーマンスが重要な部分をCで記述したりすることができます。

Cgoを使用するには、Goのソースファイル内に特別なコメントブロックを記述します。このコメントブロックは、import "C"の直前に配置され、Cのコードや、Cコンパイラやリンカに渡すためのディレクティブ(#cgo)を含めることができます。

#cgo ディレクティブ

#cgoディレクティブは、CgoがCコードをコンパイルおよびリンクする際に使用するフラグを指定するために使われます。主な用途は以下の通りです。

  • CFLAGS: Cコンパイラに渡すフラグ(例: -I/path/to/includeでインクルードパスを指定)。
  • LDFLAGS: リンカに渡すフラグ(例: -L/path/to/lib -lfooでライブラリのパスとライブラリ名を指定)。
  • CPPFLAGS: Cプリプロセッサに渡すフラグ。
  • CXXFLAGS: C++コンパイラに渡すフラグ。

これらのディレクティブは、Goプログラムが外部のCライブラリに依存している場合に、そのライブラリを正しくリンクするために不可欠です。

LDFLAGS: -lpthread

LDFLAGS: -lpthreadは、リンカに対してpthreadライブラリ(POSIXスレッドライブラリ)をリンクするように指示するフラグです。多くのUnix系システム(Linux, macOS, FreeBSDなど)では、スレッド関連の機能を使用するCプログラムは、このライブラリに依存しています。Goのランタイムは、内部的にスレッドを使用するため、Cgoを介してCコードと連携する際に、このpthreadライブラリが必要となる場合があります。特に、GoのスケジューラがOSのスレッドとどのように連携するか、あるいはCgoがC関数を呼び出す際に新しいOSスレッドを生成する必要がある場合などに重要になります。

LDFLAGS: -lm -mthreads (Windows)

Windows環境では、pthreadの代わりに異なるリンカフラグが使用されます。

  • -lm: 数学関数ライブラリ(libm)をリンクします。これは、CgoがGoのランタイムとCライブラリの間で数学関数を扱う際に必要となる可能性があります。
  • -mthreads: MinGWなどのGCCベースのコンパイラでWindowsのスレッドモデルを使用するためのフラグです。Windows上でのCgoの動作において、スレッド関連の機能が正しくリンクされるようにするために必要です。

Goランタイム

Goランタイムは、Goプログラムの実行を管理するシステムです。これには、ガベージコレクタ、スケジューラ(ゴルーチンをOSスレッドにマッピング)、メモリ管理、Cgoとの連携などが含まれます。GoプログラムがCgoを介してCコードとやり取りする場合、ランタイムはCgoの呼び出しを仲介し、GoとCのスタック間の切り替えなどを管理します。

技術的詳細

このコミットの技術的な核心は、GoのビルドシステムにおけるCgoディレクティブの処理方法の進化にあります。

元々、src/pkg/runtime/cgo/trigger.goというファイルが存在し、その中にCgoのLDFLAGSディレクティブが含まれていました。このファイル名が示唆するように、これはGoツールがCgoを使用するパッケージをビルドする際に、Cgoのビルドプロセスを「トリガー」するための役割を担っていたと考えられます。つまり、このファイルが存在し、import "C"を含んでいることで、GoツールはCgoのコンパイルとリンクのステップを実行する必要があると判断していたのでしょう。

しかし、Goのビルドシステムが成熟するにつれて、このような明示的な「トリガー」ファイルは不要になったか、あるいはより効率的な方法でCgoの依存関係が検出されるようになったと考えられます。trigger.goのコメントにある「TODO: Once we stop using Make, this import can move into cgo.go.」という記述は、GoのビルドプロセスがMakeベースのシステムからGo独自のビルドツール(go buildなど)へと移行するにつれて、このファイルが冗長になることが予見されていたことを強く示唆しています。

このコミットでは、trigger.goを削除し、その中にあった重要な#cgo LDFLAGSディレクティブをsrc/pkg/runtime/cgo/cgo.goに移動しています。cgo.goは、Cgoのランタイムサポートに関する主要なファイルであり、Cgoの内部実装に関連するコードが含まれています。この移動により、Cgoのビルド設定がCgoのコアロジックを扱うファイルに統合され、関連する情報が一箇所に集約されることになります。これは、コードの保守性と理解しやすさを向上させるための典型的なリファクタリングパターンです。

結果として、Goのビルドツールは、cgo.go内の#cgoディレクティブを直接読み取り、必要なリンカフラグを適用するようになります。これにより、trigger.goという中間的なファイルが不要になり、ビルドプロセスがわずかに簡素化されます。

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

src/pkg/runtime/cgo/cgo.go の変更

--- a/src/pkg/runtime/cgo/cgo.go
+++ b/src/pkg/runtime/cgo/cgo.go
@@ -9,6 +9,18 @@ for details on using cgo.
 */
 package cgo
 
+/*
+
+#cgo darwin LDFLAGS: -lpthread
+#cgo freebsd LDFLAGS: -lpthread
+#cgo linux LDFLAGS: -lpthread
+#cgo netbsd LDFLAGS: -lpthread
+#cgo openbsd LDFLAGS: -lpthread
+#cgo windows LDFLAGS: -lm -mthreads
+
+*/
+import "C"
+
 // Supports _cgo_panic by converting a string constant to an empty
 // interface.
 

src/pkg/runtime/cgo/trigger.go の変更

--- a/src/pkg/runtime/cgo/trigger.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This tells the go tool that this package builds using cgo.
-// TODO: Once we stop using Make, this import can move into cgo.go.
-
-package cgo
-
-/*
-
-#cgo darwin LDFLAGS: -lpthread
-#cgo freebsd LDFLAGS: -lpthread
-#cgo linux LDFLAGS: -lpthread
-#cgo netbsd LDFLAGS: -lpthread
-#cgo openbsd LDFLAGS: -lpthread
-#cgo windows LDFLAGS: -lm -mthreads
-
-*/
-import "C"

コアとなるコードの解説

このコミットの主要な変更は、src/pkg/runtime/cgo/trigger.goファイルが完全に削除され、そのファイルに含まれていたCgoディレクティブのブロックがsrc/pkg/runtime/cgo/cgo.goファイルに移動されたことです。

削除された src/pkg/runtime/cgo/trigger.go

このファイルは、そのコメントから「Goツールがこのパッケージをcgoを使ってビルドすることを伝える」ためのものであったことがわかります。また、「TODO: Once we stop using Make, this import can move into cgo.go.」というコメントは、GoのビルドシステムがMakeベースからGo独自のツールチェーンへと移行する際に、このファイルが不要になることが予見されていたことを示しています。

削除されたファイルには、以下のCgoディレクティブが含まれていました。

/*
#cgo darwin LDFLAGS: -lpthread
#cgo freebsd LDFLAGS: -lpthread
#cgo linux LDFLAGS: -lpthread
#cgo netbsd LDFLAGS: -lpthread
#cgo openbsd LDFLAGS: -lpthread
#cgo windows LDFLAGS: -lm -mthreads
*/
import "C"

これらのディレクティブは、各オペレーティングシステム(Darwin/macOS, FreeBSD, Linux, NetBSD, OpenBSD, Windows)において、CgoがGoのランタイムとCコードをリンクする際に必要となるリンカフラグを指定しています。特に-lpthreadはPOSIXスレッドライブラリを、Windowsの-lm -mthreadsは数学ライブラリとスレッド関連のライブラリをリンクするために使用されます。

変更された src/pkg/runtime/cgo/cgo.go

このファイルは、GoのCgoランタイムサポートの主要な部分を担っています。削除されたtrigger.goから、上記のCgoディレクティブブロックがこのファイルにそのまま追加されました。

これにより、Cgoのビルドに必要なリンカフラグの情報が、Cgoのコアロジックを扱うファイルに直接組み込まれることになります。Goツールは、cgo.goをコンパイルする際にこのディレクティブを読み取り、指定されたリンカフラグをビルドプロセスに適用します。

この変更の意図は、Cgoのビルド設定をより論理的な場所に統合し、trigger.goという冗長なファイルを削除することで、コードベースを整理し、ビルドプロセスを簡素化することにあります。Goのビルドシステムが進化し、Cgoの依存関係の検出方法が改善されたため、もはやtrigger.goのような「トリガー」ファイルは必要なくなった、という判断が背景にあると考えられます。

関連リンク

  • Go言語のCgoに関する公式ドキュメント(現在のバージョン): https://pkg.go.dev/cmd/cgo
  • Go 1リリースノート(2012年3月28日リリース): https://go.dev/doc/go1 (このコミットはGo 1リリース直前の変更と推測されます)

参考にした情報源リンク

  • Go言語のCgoに関する一般的な情報
  • Go言語のビルドプロセスに関する情報
  • pthreadライブラリに関する情報
  • MinGW/GCCのリンカフラグに関する情報
  • Goのコミット履歴と関連する議論(golang-devメーリングリストなど)
  • trigger.goのコメント内容
  • Web検索結果: "Go language cgo trigger.go obsolete 2012" (Go 1.0リリースとCgo開発の活発な時期であったことの確認)