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

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

このコミットは、Go言語のmisc/cgo/testsoディレクトリにあるテストを再有効化し、特にmacOS (darwin) 環境でのテスト実行を可能にするための変更です。従来のシェルスクリプトとMakefileに依存したテスト実行方法から、Goの標準テストフレームワーク(go test)を利用する形へと移行しています。

コミット

commit 152a1aa610117baf9a712b17d2673ad73bd490e6
Author: Francisco Souza <franciscossouza@gmail.com>
Date:   Wed Mar 7 00:40:16 2012 -0500

    misc/cgo: re-enable testso
    
    Also enabled it for darwin.
    
    R=rsc
    CC=golang-dev
    https://golang.org/cl/5754063

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

https://github.com/golang/go/commit/152a1aa610117baf9a712b17d2673ad73bd490e6

元コミット内容

misc/cgo: re-enable testso Also enabled it for darwin.

このコミットメッセージは、misc/cgoディレクトリ内のtestsoというテストを再度有効にし、特にmacOS (darwin) 環境でも動作するようにしたことを示しています。

変更の背景

Go言語のCgo機能は、GoプログラムからC言語のコードを呼び出すための重要なメカニズムです。共有ライブラリ(.soファイルやmacOSの.dylibファイル)との連携は、Cgoの主要なユースケースの一つであり、その機能が正しく動作することを保証するためのテストは不可欠です。

このコミット以前、misc/cgo/testsoディレクトリ内のテストは、何らかの理由で無効化されていたか、特定のプラットフォーム(特にmacOS)で適切に実行されていなかった可能性があります。従来のテスト実行は、Makefiletest.bashというシェルスクリプトに依存しており、これはプラットフォーム間の互換性やGoのビルドシステムとの統合において課題を抱えていた可能性があります。

この変更の背景には、Goのテストインフラストラクチャをより統一的で堅牢なものにするという意図があったと考えられます。Goの標準テストフレームワーク(go test)は、クロスプラットフォームでのテスト実行を容易にし、テストの発見、実行、レポート生成を一貫した方法で提供します。これにより、Cgoと共有ライブラリの連携テストが、より広範な環境で確実に実行されるようになります。特にmacOS (darwin) での有効化は、Goがサポートする主要なOSでのCgo機能の完全性を保証するために重要です。

前提知識の解説

Cgo

Cgoは、Go言語のプログラムからC言語のコードを呼び出すためのGoの機能です。これにより、既存のCライブラリをGoプロジェクトで再利用したり、Goでは実装が難しい低レベルの操作をCで行ったりすることが可能になります。Cgoを使用するには、Goのソースファイル内にCのコードを記述するか、既存のCのヘッダーファイルをインポートします。Goのビルドプロセス中に、CgoはCのコードをコンパイルし、Goのコードとリンクします。

共有ライブラリ(Shared Libraries / .so / .dylib)

共有ライブラリは、複数のプログラムによって共有される実行可能コードとデータのコレクションです。Linuxでは.so(Shared Object)、macOSでは.dylib(Dynamic Library)、Windowsでは.dll(Dynamic Link Library)という拡張子が一般的です。プログラムが共有ライブラリを使用する場合、ライブラリのコードはプログラムの実行時にメモリにロードされ、複数のプログラム間で共有されるため、ディスクスペースとメモリを節約できます。Cgoは、Goプログラムがこれらの共有ライブラリ内のC関数を呼び出すことを可能にします。

Goの標準テストフレームワーク (go test)

Go言語には、標準で強力なテストフレームワークが組み込まれています。テストファイルは通常、テスト対象のGoファイルと同じパッケージに配置され、ファイル名の末尾に_test.goが付きます。テスト関数はTestで始まり、*testing.T型の引数を取ります。go testコマンドを実行すると、Goツールチェーンが自動的にテストファイルを見つけ、コンパイルし、実行します。このフレームワークは、テストの並列実行、ベンチマークテスト、カバレッジレポートなど、多くの高度な機能を提供します。

src/run.bash

src/run.bashは、Goプロジェクトのルートディレクトリにあるシェルスクリプトで、Goのテストスイート全体を実行するための主要なスクリプトの一つです。Goの様々なサブシステムやパッケージのテストを順次実行し、全体的な健全性を確認する役割を担っています。このスクリプトは、GoのCI/CDパイプラインや開発者のローカル環境でのテスト実行において中心的な役割を果たします。

技術的詳細

このコミットの主要な技術的変更点は、misc/cgo/testsoディレクトリ内のテスト実行メカニズムを、従来のMakefiletest.bashによるシェルスクリプトベースのシステムから、Goの標準テストフレームワーク(go test)へと完全に移行したことです。

  1. テスト実行のGoネイティブ化:

    • misc/cgo/testso/Makefilemisc/cgo/testso/test.bashが削除されました。これらは、Cgoでビルドされた共有ライブラリ(libcgoso.so)をコンパイルし、それを利用するGoの実行可能ファイル(main.go)をビルド・実行するための手順を定義していました。
    • misc/cgo/testso/main.goも削除されました。これは、共有ライブラリの機能を呼び出すためのシンプルなGoプログラムでした。
    • 代わりに、misc/cgo/testso/cgoso_test.goという新しいテストファイルが追加されました。このファイルは、Goのtestingパッケージを利用して、共有ライブラリの機能をテストします。これにより、テストのビルドと実行がgo testコマンドによって直接管理されるようになります。
  2. クロスプラットフォーム対応の改善:

    • 従来のtest.bashスクリプトは、シェルスクリプトの性質上、OS間の互換性の問題や、特定の環境変数(LD_LIBRARY_PATHなど)の設定に依存する可能性がありました。
    • go testへの移行により、Goツールチェーンが共有ライブラリのリンクとテスト実行をより適切に処理できるようになります。特に、コミットメッセージにある「Also enabled it for darwin」は、macOS環境での共有ライブラリの扱い(例: .dylibファイルの検索パス)がgo testによって抽象化され、テストがより確実に実行されるようになったことを示唆しています。src/run.bashの変更で、[ "$GOHOSTOS" == darwin ] ||という条件が削除されたのは、macOSでのテストがもはや特別な扱いを必要とせず、他のOSと同様にgo testで実行できるようになったことを意味します。
  3. テストスイートの統合:

    • src/run.bashの変更は、Go全体のテストスイートの一部としてmisc/cgo/testsoのテストがどのように実行されるかを更新しています。
    • 以前は、misc/cgo/testsoディレクトリに移動し、./test.bashを実行していました。
    • 変更後は、同じディレクトリでgo testを実行するようになりました。これにより、Goのテストインフラストラクチャ全体との整合性が向上し、テストの管理と実行が簡素化されます。

この変更は、GoのCgo機能のテストをより堅牢で、クロスプラットフォーム互換性があり、Goの標準的な開発ワークフローに統合されたものにするための重要なステップです。

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

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

  1. misc/cgo/testso/Makefile: 削除

    • 共有ライブラリlibcgoso.soのビルドと、それを使用するmain.goのコンパイル・リンク手順を定義していたファイル。
  2. misc/cgo/testso/cgoso_test.go: 新規追加

    • Goの標準テストフレームワーク(testingパッケージ)を使用したテストコード。
  3. misc/cgo/testso/main.go: 削除

    • 共有ライブラリの機能を呼び出すためのGoのメインプログラム。
  4. misc/cgo/testso/test.bash: 削除

    • Makefileでビルドされた実行ファイルをLD_LIBRARY_PATHを設定して実行し、テストを行うシェルスクリプト。
  5. src/run.bash: 変更

    • Go全体のテストスイートを実行するスクリプト。misc/cgo/testsoのテスト実行方法が更新された。

src/run.bash の差分

--- a/src/run.bash
+++ b/src/run.bash
@@ -57,13 +57,10 @@ BROKEN=true
 go test
 ) || exit $?\n 
-$BROKEN ||
 [ \"$CGO_ENABLED\" != 1 ] ||
 [ \"$GOHOSTOS\" == windows ] ||
-[ \"$GOHOSTOS\" == darwin ] ||
 (xcd ../misc/cgo/testso
-\"$GOMAKE\" clean
-./test.bash
+go test
 ) || exit $?\n 
 (xcd ../doc/progs

この差分は、misc/cgo/testsoディレクトリでのテスト実行部分を変更しています。

  • [ "$GOHOSTOS" == darwin ] || の行が削除されました。これは、macOS (darwin) 環境でのCgoテストが、他のOSと同様に特別な条件なしで実行できるようになったことを示します。
  • "$GOMAKE" clean./test.bash の行が削除されました。これは、従来のMakefileとシェルスクリプトによるテスト実行が廃止されたことを意味します。
  • 代わりに go test が追加されました。これにより、Goの標準テストコマンドがmisc/cgo/testsoディレクトリで実行されるようになります。

misc/cgo/testso/cgoso_test.go の内容

package cgosotest

import (
	"testing"
)

func TestCgoSo(t *testing.T) { Test() }

このファイルは、cgosotestパッケージのテストを定義しています。TestCgoSo関数は、Goのテスト関数として認識され、内部でTest()という関数を呼び出しています。このTest()関数は、Cgoを通じて共有ライブラリの機能を呼び出すロジックを含んでいると推測されます(ただし、このコミットの差分にはTest()関数の定義自体は含まれていません。おそらく、cgoso.goなどの別のファイルで定義されていると考えられます)。

コアとなるコードの解説

このコミットの核心は、GoのCgo機能と共有ライブラリの連携をテストするメカニズムを、Goの標準テストフレームワークに完全に移行した点にあります。

削除されたファイル群の役割と問題点

  • misc/cgo/testso/Makefile: このMakefileは、Cgoで書かれたCのソースファイル(cgoso_c.cなど、コミット差分には含まれていないが推測される)から共有ライブラリlibcgoso.soをビルドし、さらにその共有ライブラリを利用するGoの実行ファイルmain.goをビルドする役割を担っていました。Makefileベースのビルドは、環境依存性(特定のgccのバージョンやパス、Make.incのインクルードパスなど)が高く、クロスプラットフォームでの一貫した動作を保証するのが難しい場合があります。
  • misc/cgo/testso/main.go: このファイルは、共有ライブラリlibcgoso.soが提供するC関数をGoから呼び出すためのエントリポイントとなるシンプルなGoプログラムでした。テストの目的で、このプログラムを実行し、期待される動作を確認していたと考えられます。
  • misc/cgo/testso/test.bash: このシェルスクリプトは、Makefileでビルドされた実行ファイルoutを実際に実行するためのものでした。特に、LD_LIBRARY_PATH=.を設定して、カレントディレクトリにある共有ライブラリをロードするように指示していました。シェルスクリプトは、OSやシェル環境によって挙動が異なる可能性があり、テストの信頼性を損なう要因となることがあります。

これらのファイル群は、Cgoと共有ライブラリの連携テストを実現していましたが、Goの標準的な開発・テストワークフローとは異なる、やや特殊なビルド・実行手順を必要としていました。

新規追加された misc/cgo/testso/cgoso_test.go の役割

  • cgoso_test.goは、Goのtestingパッケージを利用した典型的なテストファイルです。func TestCgoSo(t *testing.T)という関数は、go testコマンドによって自動的に発見され、実行されます。
  • このテスト関数内で呼び出されているTest()関数(このコミットの差分には含まれていませんが、同じパッケージ内の別のGoファイル、例えばcgoso.goなどで定義されていると推測されます)が、Cgoを介して共有ライブラリのC関数を呼び出す実際のロジックを含んでいます。
  • go testを使用することで、GoツールチェーンがCgoのコンパイル、共有ライブラリのリンク、テストの実行、結果のレポート生成といった一連のプロセスを自動的に管理します。これにより、開発者はプラットフォームごとのビルドスクリプトの差異を意識することなく、一貫した方法でテストを実行できるようになります。

src/run.bash の変更の意義

src/run.bashはGoプロジェクト全体のテストをオーケストレーションするスクリプトです。このスクリプトがmisc/cgo/testsoのテスト実行部分を、従来の./test.bashからgo testに切り替えたことは、以下の重要な意味を持ちます。

  1. テスト実行の標準化: Goのテストはすべてgo testコマンドで実行されるという原則に沿うことで、テストの発見、実行、レポート生成が一貫した方法で行われるようになります。
  2. クロスプラットフォーム互換性の向上: go testはGoツールチェーンの一部であり、Goがサポートするすべてのプラットフォームで一貫して動作するように設計されています。特に、macOS (darwin) での特別な条件([ "$GOHOSTOS" == darwin ] ||)が削除されたことは、GoツールチェーンがmacOS上でのCgoと共有ライブラリのテストを適切に処理できるようになったことを示しています。これにより、macOS環境でのCgoテストの信頼性と保守性が向上します。
  3. 保守性の向上: 従来のMakefileやシェルスクリプトは、Goのビルドシステムとは独立して管理する必要があり、Goのバージョンアップやビルド環境の変更に伴ってメンテナンスが必要になる可能性がありました。go testへの移行により、テストのビルドと実行がGoツールチェーンに統合され、保守が容易になります。

このコミットは、GoのCgo機能のテストインフラストラクチャを近代化し、より堅牢で、クロスプラットフォーム互換性があり、Goの標準的な開発ワークフローに統合されたものにするための重要な改善です。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • Go言語のソースコード (特にsrc/run.bashmisc/cgoディレクトリ)
  • 共有ライブラリに関する一般的な知識 (Linuxの.so、macOSの.dylibなど)
  • Goのテストフレームワークに関する一般的な知識
  • GitHubのコミット履歴と差分表示機能
  • GoのIssueトラッカーやコードレビューシステム (CL: Change List) - https://golang.org/cl/5754063