[インデックス 12467] ファイルの概要
このコミットは、Go言語のmisc/cgo/testso
ディレクトリにおける以前の変更(CL 5754063 / コミットハッシュ e23b66fcfc94
)を元に戻すものです。元に戻された変更は、cgo
を使用した共有ライブラリ(.so
ファイル)のテストを再有効化し、macOS (darwin) 環境でも有効にすることを目的としていましたが、実際には共有ライブラリのテストが適切に行われていなかったため、このコミットでその変更が取り消されました。
コミット
commit afb1b0e6b77e40cae93eccd68dbfd5b9404920cb
Author: Russ Cox <rsc@golang.org>
Date: Wed Mar 7 10:15:20 2012 -0500
undo CL 5754063 / e23b66fcfc94
Does not actually test so files.
««« original CL description
misc/cgo: re-enable testso
Also enabled it for darwin.
R=rsc
CC=golang-dev
https://golang.org/cl/5754063
»»»
R=golang-dev, minux.ma, r, f
CC=golang-dev
https://golang.org/cl/5756075
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/afb1b0e6b77e40cae93eccd68dbfd5b9404920cb
元コミット内容
このコミットが元に戻しているのは、Change List (CL) 5754063、コミットハッシュ e23b66fcfc94
に対応する変更です。その元のコミットの目的は以下の通りでした。
misc/cgo
ディレクトリ内のtestso
(共有ライブラリのテスト)を再有効化する。- 特にmacOS (darwin) 環境においてもこのテストを有効にする。
これは、GoプログラムがC言語の共有ライブラリと連携するcgo
機能のテストスイートを改善しようとする試みでした。
変更の背景
元に戻されたCL 5754063は、cgo
と共有ライブラリの連携テストを有効にすることを意図していましたが、実際には「Does not actually test so files.」(共有ライブラリファイルを実際にテストしていない)という問題が判明しました。このコミットは、そのテストが期待通りに機能していなかったため、その不完全な変更を取り消すことを目的としています。これにより、誤ったテスト結果や、テストが機能しているという誤解を防ぎます。
前提知識の解説
このコミットを理解するためには、以下の技術的背景知識が役立ちます。
- Go言語の
cgo
: GoプログラムからC言語のコードを呼び出すためのGoの機能です。これにより、既存のCライブラリを利用したり、パフォーマンスが重要な部分をCで記述したりすることが可能になります。cgo
を使用すると、Goのビルドプロセス中にCコンパイラが呼び出され、CコードがコンパイルされてGoの実行可能ファイルにリンクされます。 - 共有ライブラリ(Shared Libraries /
.so
ファイル):.so
(Linux) や.dylib
(macOS) 、.dll
(Windows) といった拡張子を持つファイルで、複数のプログラムから共有して利用できるライブラリです。プログラムの実行時にメモリにロードされ、コードの再利用性やディスク容量の節約に貢献します。cgo
では、Goプログラムがこれらの共有ライブラリ内の関数を呼び出すことができます。 Makefile
: ビルド自動化ツールであるmake
が使用する設定ファイルです。ソースコードのコンパイル、リンク、テストなどの一連のビルドプロセスを定義します。このコミットでは、misc/cgo/testso/Makefile
が共有ライブラリのビルドとテスト実行のためのルールを定義していました。LD_LIBRARY_PATH
: LinuxやUnix系OSで使用される環境変数で、動的リンカが共有ライブラリを検索するディレクトリのパスを指定します。プログラムが共有ライブラリをロードする際に、このパスが参照されます。gomake
: Goプロジェクトで使われるmake
のラッパーまたはGo独自のビルドスクリプトを指すことがあります。この文脈では、Goのビルドシステムの一部としてMakefile
を実行するコマンドを指している可能性が高いです。- Goのテストフレームワーク: Goには標準で
testing
パッケージが用意されており、ユニットテストやベンチマークテストを記述できます。go test
コマンドでこれらのテストを実行します。 darwin
: AppleのmacOSオペレーティングシステムのカーネル名です。Goのビルド環境では、GOOS=darwin
としてmacOSをターゲットに指定します。
技術的詳細
このコミットは、misc/cgo/testso
ディレクトリを実質的に削除し、そのテストがsrc/run.bash
スクリプトから呼び出されないようにすることで、以前の変更を取り消しています。
具体的には、以下の技術的な変更が行われています。
misc/cgo/testso/Makefile
の削除: このファイルは、共有ライブラリlibcgoso.so
のビルド、main.go
のコンパイル、そして最終的な実行可能ファイルout
の生成を定義していました。このファイルの削除は、testso
テストのビルドプロセス全体を無効にします。CGO_DEPS+=libcgoso.so
:cgo
の依存関係として共有ライブラリを指定。CGO_LDFLAGS+=-lcgoso -L.
: リンク時に現在のディレクトリからlibcgoso.so
を探すように指定。libcgoso.so: cgoso_c.c
: Cソースファイルcgoso_c.c
から共有ライブラリをビルドするルール。out: install main.go
:main.go
をコンパイルしてout
実行可能ファイルを生成するルール。
misc/cgo/testso/cgoso_test.go
の削除: このファイルは、cgosotest
パッケージのTestCgoSo
関数を定義しており、Test()
関数を呼び出すことで共有ライブラリのテストを実行していました。このテストファイルの削除は、Goのテストフレームワークを通じたテスト実行を不可能にします。misc/cgo/testso/main.go
の削除: このファイルは、cgosotest
パッケージをインポートし、その中のTest()
関数を呼び出すシンプルなGoプログラムでした。これは、共有ライブラリの機能をGoプログラムから直接呼び出すためのエントリポイントとして機能していました。misc/cgo/testso/test.bash
の削除: このシェルスクリプトは、gomake out
で実行可能ファイルをビルドし、LD_LIBRARY_PATH=. ./out
で共有ライブラリのパスを指定して実行可能ファイルを起動し、最後にgomake clean
でクリーンアップを行う一連のテスト手順を自動化していました。このスクリプトの削除は、testso
テストの実行フロー全体を停止させます。src/run.bash
の変更: Goプロジェクト全体のテストを実行するメインスクリプトであるsrc/run.bash
から、misc/cgo/testso
ディレクトリでのテスト実行部分が削除されました。- 以前は
[ "$GOHOSTOS" == darwin ] ||
という条件でmacOSでもtestso
テストが実行されるように変更されていましたが、このコミットでその部分が削除され、testso
テストの実行自体が取り消されました。 go test
コマンドの代わりに"$GOMAKE" clean
と./test.bash
が呼び出されていましたが、これらも削除されました。
- 以前は
これらの変更により、misc/cgo/testso
ディレクトリは実質的に無効化され、Goのビルドおよびテストプロセスから除外されます。これは、以前の変更が共有ライブラリのテストという本来の目的を達成できていなかったため、その不完全なテストコードをシステムから取り除くという判断に基づいています。
コアとなるコードの変更箇所
このコミットでは、以下の5つのファイルが変更されています。
misc/cgo/testso/Makefile
: 新規ファイルとして追加されていたものが削除されました。misc/cgo/testso/cgoso_test.go
: 削除されました。misc/cgo/testso/main.go
: 新規ファイルとして追加されていたものが削除されました。misc/cgo/testso/test.bash
: 新規ファイルとして追加されていたものが削除されました。src/run.bash
: 5行が変更されました(4行追加、1行削除)。
コアとなるコードの解説
misc/cgo/testso/Makefile
(削除)
このMakefile
は、cgo
と共有ライブラリのテストに必要なビルド手順を定義していました。
# 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.
include ../../../src/Make.inc
TARG=cgosotest
CGO_DEPS+=libcgoso.so
CGO_LDFLAGS+=-lcgoso -L.
CLEANFILES+=out libcgoso.so
CGOFILES=\
cgoso.go\
include ../../../src/Make.pkg
libcgoso.so: cgoso_c.c
gcc cgoso_c.c -fPIC -o $@ $(_CGO_CFLAGS_$(GOARCH)) $(_CGO_LDFLAGS_$(GOOS))
out: install main.go
$(GC) $(GCFLAGS) $(GCIMPORTS) main.go
$(LD) -o $@ main.$O
include ../../../src/Make.inc
: Goのビルドシステム共通のインクルードファイル。TARG=cgosotest
: ターゲット名を定義。CGO_DEPS+=libcgoso.so
:cgo
の依存関係としてlibcgoso.so
を指定。CGO_LDFLAGS+=-lcgoso -L.
: リンカフラグとして、現在のディレクトリ(.
)からlibcgoso.so
を探すように指定。libcgoso.so: cgoso_c.c
:cgoso_c.c
から共有ライブラリlibcgoso.so
をビルドするルール。gcc
を使用し、位置独立コード(-fPIC
)としてコンパイル。out: install main.go
:main.go
をコンパイルして実行可能ファイルout
を生成するルール。Goコンパイラ($(GC)
)とリンカ($(LD)
)を使用。
このファイルの削除により、testso
テストのビルドプロセス全体が停止します。
misc/cgo/testso/cgoso_test.go
(削除)
このファイルはGoのテストコードでした。
package cgosotest
import (
"testing"
)
func TestCgoSo(t *testing.T) { Test() }
package cgosotest
:cgosotest
パッケージに属する。func TestCgoSo(t *testing.T) { Test() }
: Goのテスト関数。Test()
という関数を呼び出すことで、共有ライブラリの機能をテストしていました。
このファイルの削除により、Goのテストフレームワークを通じたtestso
のテスト実行が不可能になります。
misc/cgo/testso/main.go
(削除)
このファイルは、共有ライブラリの機能を呼び出すGoのエントリポイントでした。
// 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.
package main
import "cgosotest"
func main() {
cgosotest.Test()
}
package main
: 実行可能ファイルのエントリポイント。import "cgosotest"
:cgosotest
パッケージをインポート。func main() { cgosotest.Test() }
:main
関数からcgosotest
パッケージのTest()
関数を呼び出す。これは、共有ライブラリの機能をGoプログラムから直接実行するためのものでした。
このファイルの削除により、testso
の実行可能ファイルが生成されなくなります。
misc/cgo/testso/test.bash
(削除)
このシェルスクリプトは、testso
テストの実行フローを自動化していました。
#!/bin/sh
# 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.\
set -e
gomake out
LD_LIBRARY_PATH=. ./out
gomake clean
set -e
: コマンドが失敗した場合にスクリプトを終了させる。gomake out
:Makefile
を使って実行可能ファイルout
をビルド。LD_LIBRARY_PATH=. ./out
: 現在のディレクトリを共有ライブラリの検索パスに追加し、out
実行可能ファイルを実行。gomake clean
: ビルドによって生成されたファイルをクリーンアップ。
このスクリプトの削除により、testso
テストの自動実行プロセスが停止します。
src/run.bash
(変更)
Goプロジェクト全体のテストを実行するメインスクリプトです。
--- a/src/run.bash
+++ b/src/run.bash
@@ -57,10 +57,13 @@ BROKEN=true
go test
) || exit $?\
+$BROKEN ||
[ "$CGO_ENABLED" != 1 ] ||
[ "$GOHOSTOS" == windows ] ||
+[ "$GOHOSTOS" == darwin ] ||
(xcd ../misc/cgo/testso
-go test
+\"$GOMAKE\" clean
+./test.bash
) || exit $?\
(xcd ../doc/progs
変更点:
-go test
の行が削除され、+"$GOMAKE" clean
と+./test.bash
が追加されました。これは、misc/cgo/testso
ディレクトリに移動した後、Goの標準テストコマンドgo test
を実行する代わりに、Makefile
のクリーンアップとtest.bash
スクリプトの実行を行うように変更されたことを示しています。[ "$GOHOSTOS" == darwin ] ||
の行が追加されました。これは、macOS (darwin) 環境でもmisc/cgo/testso
のテストを実行するための条件でした。
このコミットでは、上記の変更が元に戻されています。つまり、misc/cgo/testso
ディレクトリでのテスト実行ブロック全体が削除され、src/run.bash
はもはやtestso
テストを呼び出さなくなりました。
関連リンク
- 元のCL (Change List) 5754063: https://golang.org/cl/5754063 (このリンクはGoのコードレビューシステムへのリンクであり、直接的なWebページとしては存在しない可能性がありますが、Goのコミットメッセージで参照されるCL番号の一般的な形式です。)
- このコミットのCL (Change List) 5756075: https://golang.org/cl/5756075
参考にした情報源リンク
- Go言語の
cgo
に関する公式ドキュメントやチュートリアル - 共有ライブラリ(
.so
ファイル)に関する一般的な情報 Makefile
とmake
コマンドに関するドキュメントLD_LIBRARY_PATH
環境変数に関する情報- Goの
testing
パッケージに関する公式ドキュメント src/run.bash
のようなGoプロジェクトのビルドスクリプトの一般的な構造- https://github.com/golang/go/commit/afb1b0e6b77e40cae93eccd68dbfd5b9404920cb (このコミット自体のGitHubページ)
- Web検索: "CL 5754063 golang" (ただし、検索結果は今回のコミットが参照するCLとは異なる内容であったため、直接的な情報源としては使用していません。コミットメッセージ内の「original CL description」を優先しました。)