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

[インデックス 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スクリプトから呼び出されないようにすることで、以前の変更を取り消しています。

具体的には、以下の技術的な変更が行われています。

  1. 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実行可能ファイルを生成するルール。
  2. misc/cgo/testso/cgoso_test.goの削除: このファイルは、cgosotestパッケージのTestCgoSo関数を定義しており、Test()関数を呼び出すことで共有ライブラリのテストを実行していました。このテストファイルの削除は、Goのテストフレームワークを通じたテスト実行を不可能にします。
  3. misc/cgo/testso/main.goの削除: このファイルは、cgosotestパッケージをインポートし、その中のTest()関数を呼び出すシンプルなGoプログラムでした。これは、共有ライブラリの機能をGoプログラムから直接呼び出すためのエントリポイントとして機能していました。
  4. misc/cgo/testso/test.bashの削除: このシェルスクリプトは、gomake outで実行可能ファイルをビルドし、LD_LIBRARY_PATH=. ./outで共有ライブラリのパスを指定して実行可能ファイルを起動し、最後にgomake cleanでクリーンアップを行う一連のテスト手順を自動化していました。このスクリプトの削除は、testsoテストの実行フロー全体を停止させます。
  5. 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つのファイルが変更されています。

  1. misc/cgo/testso/Makefile: 新規ファイルとして追加されていたものが削除されました。
  2. misc/cgo/testso/cgoso_test.go: 削除されました。
  3. misc/cgo/testso/main.go: 新規ファイルとして追加されていたものが削除されました。
  4. misc/cgo/testso/test.bash: 新規ファイルとして追加されていたものが削除されました。
  5. 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ファイル)に関する一般的な情報
  • Makefilemakeコマンドに関するドキュメント
  • 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」を優先しました。)