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

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

このコミットは、Go言語プロジェクトのmisc/cgo/testディレクトリから、もはや使用されていないMakefileを削除するものです。この変更は、Goのビルドシステムとテストフレームワークの進化により、特定のテストシナリオでカスタムのビルドスクリプトが不要になったことを示しています。

コミット

  • コミットハッシュ: 1ac397f4b93e37f75f8c747a0167b5b2018b2d40
  • 作者: Dave Cheney dave@cheney.net
  • コミット日時: 2012年8月16日 木曜日 20:19:54 +1000

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

https://github.com/golang/go/commit/1ac397f4b93e37f75f8c747a0167b5b2018b2d40

元コミット内容

misc/cgo/test: remove unused Makefile

R=golang-dev, minux.ma, iant
CC=golang-dev
https://golang.org/cl/6459091

変更の背景

このコミットの背景には、Go言語のビルドシステムとテスト実行環境の成熟があります。初期のGoプロジェクトでは、特にC言語との連携(cgo)を伴う複雑なビルドやテストの実行にMakefileが使用されることがありました。しかし、Goの標準ツールチェーン、特にgo buildgo testコマンドが進化するにつれて、これらのツールがcgoのコンパイルやリンク、テストの実行をよりシームレスに、かつ自動的に処理できるようになりました。

削除されたMakefileの内部には、# gotest is gone. TODOというコメントが含まれており、これはカスタムのテスト実行ロジックがGoの標準テストコマンド(go test)に置き換えられたことを強く示唆しています。これにより、もはやこのMakefileは不要となり、コードベースのクリーンアップの一環として削除されました。これは、Goのツールがプロジェクトのビルドとテストのニーズを完全に満たすようになった結果であり、外部のビルドシステムへの依存を減らすというGoの設計思想とも一致します。

前提知識の解説

Makefile

Makefileは、主にUnix系システムでソフトウェアのビルドプロセスを自動化するために使用されるファイルです。makeユーティリティによって解釈され、ソースコードのコンパイル、リンク、テストの実行など、一連のコマンドを定義します。依存関係を管理し、変更されたファイルのみを再ビルドすることで、効率的な開発を支援します。

Go言語のビルドシステム

Go言語は、独自の強力なビルドシステムを内蔵しています。

  • go build: Goのソースファイルをコンパイルし、実行可能バイナリを生成します。依存関係の解決、パッケージのダウンロード、クロスコンパイルなどを自動的に行います。
  • go test: Goのテストコードを実行します。テストファイルの検出、テストのコンパイル、実行、結果のレポートまでを自動で行い、ベンチマークテストやカバレッジレポートの生成も可能です。 Goのビルドシステムは、外部のMakefileに依存することなく、Goプロジェクトのほとんどのビルドとテストのニーズをカバーできるように設計されています。

Cgo

cgoは、GoプログラムからC言語のコードを呼び出したり、C言語のコードからGoの関数を呼び出したりするためのGoの機能です。cgoを使用すると、Goのソースファイル内にCのコードを直接記述したり、既存のCライブラリをGoプロジェクトにリンクしたりできます。cgoを使用するGoプログラムをビルドする際には、Goコンパイラだけでなく、Cコンパイラ(通常はGCCやClang)も必要となり、ビルドプロセスが複雑になることがあります。しかし、go buildgo testは、cgoの存在を自動的に検出し、必要なCコンパイルとリンクのステップを内部で処理します。

テストフレームワーク

Go言語には、標準ライブラリの一部として軽量なテストフレームワークが組み込まれています。testingパッケージとgo testコマンドを組み合わせることで、ユニットテスト、ベンチマークテスト、例(Example)テストなどを簡単に記述・実行できます。テストファイルは通常、テスト対象のGoファイルと同じディレクトリに_test.goというサフィックスを付けて配置されます。

技術的詳細

削除されたMakefileは、misc/cgo/testディレクトリ内のcgoテストのビルドと実行を管理するために使用されていました。このMakefileは、以下の主要な要素を含んでいました。

  1. インクルードファイル:
    • ../../../src/Make.inc: Goプロジェクト全体のビルド設定を含む共通のインクルードファイル。
    • ../../../src/Make.pkg: パッケージ固有のビルド設定を含む共通のインクルードファイル。
  2. ターゲット定義:
    • TARG=runtime/cgotest: ビルドされるターゲットの名前を定義。
  3. CGOソースファイルのリスト:
    • CGOFILES: align.go, basic.go, callback.goなど、cgoを使用するGoソースファイルのリスト。
  4. CGOオブジェクトファイルのリスト:
    • CGO_OFILES: callback_c.oなど、cgoによって生成されるCのオブジェクトファイルのリスト。
  5. その他のオブジェクトファイルのリスト:
    • OFILES: runtime.$Oなど、Goランタイムに関連するオブジェクトファイルのリスト。
  6. Windows固有のビルドロジック:
    • ifeq ($(GOOS),windows): Windows環境でのビルドに特化した条件分岐。
    • GCCVERSION, GCCLIBDIR, CHKSTK: WindowsでのGCCのバージョン検出、ライブラリパスの指定、スタックチェック関連のオブジェクトファイル(_chkstk.oまたは_chkstk_ms.o)の追加など。これは、Windows環境でのcgoのリンキングがより複雑であるため、カスタムの対応が必要だったことを示唆しています。
    • CGOFILES+=sleep_windows.go: Windows固有のcgoソースファイルの追加。
    • $(CHKSTK)ターゲット: ar -x "$(GCCLIBDIR)/libgcc.a" $@というコマンドで、GCCのライブラリから特定のオブジェクトファイルを抽出する処理。
  7. テストターゲット:
    • test:: テストを実行するためのターゲット。しかし、その中身はecho cgo: tests disabled. gotest is gone. TODOとなっており、既にこのMakefile経由でのテスト実行は無効化され、go testへの移行が示唆されていました。

このMakefileが削除されたのは、go buildおよびgo testコマンドが、これらの複雑なビルドステップ(特にcgoのコンパイルとリンク、OSごとの差異の吸収)を内部で自動的に処理できるようになったためです。開発者はもはや、これらの詳細をMakefileで手動で記述する必要がなくなり、Goの標準ツールチェーンに任せることができるようになりました。これにより、ビルドスクリプトの簡素化、保守性の向上、そしてGoプロジェクトのポータビリティの向上が実現されました。

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

このコミットによる変更は、単一のファイルの削除です。

--- a/misc/cgo/test/Makefile
+++ /dev/null
@@ -1,48 +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.
-
-include ../../../src/Make.inc
-
-TARG=runtime/cgotest
-
-CGOFILES=\
-	align.go\
-	basic.go\
-	callback.go\
-	env.go\
-	exports.go\
-	helpers.go\
-	issue1222.go\
-	issue1328.go\
-	issue1560.go\
-	issue2462.go\
-	duplicate_symbol.go\
-
-CGO_OFILES=\
-	callback_c.o\
-
-OFILES=\
-	runtime.$O\
-
-ifeq ($(GOOS),windows)
-GCCVERSION=$(shell gcc -dumpversion)
-ifeq ($(GOARCH),386)
-GCCLIBDIR=/mingw/lib/gcc/mingw32/$(GCCVERSION)
-CHKSTK=_chkstk.o
-else
-GCCLIBDIR=/mingw/lib/gcc/x86_64-w64-mingw32/$(GCCVERSION)
-CHKSTK=_chkstk_ms.o
-endif
-
-CGOFILES+=sleep_windows.go
-CGO_OFILES+=$(CHKSTK)
-
-$(CHKSTK):
-	ar -x "$(GCCLIBDIR)/libgcc.a" $@
-endif
-
-include ../../../src/Make.pkg
-
-test:
-	echo cgo: tests disabled. gotest is gone. TODO
-\ No newline at end of file

この差分は、misc/cgo/test/Makefileファイルが完全に削除されたことを示しています。ファイルの内容はすべて削除され、新しい内容はありません。

コアとなるコードの解説

削除されたMakefileは、Goのcgo機能を用いたテストのビルドと実行を自動化するためのものでした。その内容は、Goのビルドシステムがまだ初期段階にあり、cgoの複雑なビルドプロセスを完全に抽象化できていなかった時代の名残と言えます。

具体的には、以下の役割を担っていました。

  • ソースファイルの指定: CGOFILES変数で、cgoを介してCコードと連携するGoのソースファイルを列挙していました。これは、makeがどのファイルをコンパイル対象とするかを把握するために必要でした。
  • オブジェクトファイルの管理: CGO_OFILES変数で、Cコードから生成されるオブジェクトファイルを指定していました。makeはこれらのオブジェクトファイルをGoのバイナリにリンクするために使用していました。
  • プラットフォーム固有の対応: ifeq ($(GOOS),windows)ブロックは、Windows環境でのビルドにおける特殊な要件(GCCのライブラリパスの指定や、スタックチェック関連のオブジェクトファイルの処理など)を扱っていました。これは、クロスプラットフォーム対応のビルドをMakefileで実現しようとした努力の跡です。
  • テストの実行: test:ターゲットは、テストを実行するためのエントリポイントでした。しかし、既にこのターゲットは機能しておらず、go testへの移行が促されていました。

このMakefileの削除は、Goの標準ツールチェーン(go buildgo test)が、これらのタスクをすべて内部で処理できるようになったことを意味します。go testは、cgoを使用するGoファイルを見つけると、自動的にCコンパイラを呼び出し、必要なCコードをコンパイルし、Goのテストバイナリにリンクします。また、異なるオペレーティングシステムやアーキテクチャにおけるビルドの差異も、Goツールチェーンが吸収するため、開発者が手動でMakefileに記述する必要がなくなりました。

結果として、このMakefileは冗長となり、削除されることでプロジェクトのビルド設定が簡素化され、Goの標準的な開発ワークフローにさらに沿う形になりました。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメントおよびブログ記事
  • makeユーティリティに関する一般的な知識
  • Go言語のビルドシステムとcgoの進化に関する一般的な知識
  • Go言語のソースコードリポジトリ内の関連ファイル(src/Make.inc, src/Make.pkgなど)の構造と役割に関する理解
  • Gerrit Change-ID 6459091 (Goプロジェクトのコードレビューシステム)