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

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

このコミットは、Go言語の実験的なパッケージである exp/terminal を、src/pkg/Makefile に追加するものです。これにより、Linux以外のシステムでも exp/terminal パッケージがビルドされるようになります。

コミット

commit 026f8dfb94b1d4c85ddde081fd10956909918589
Author: Adam Langley <agl@golang.org>
Date:   Sun Jan 15 10:22:15 2012 -0500

    exp/terminal: add to level Makefile for the (non-Linux?) systems that need it.
    
    R=golang-dev
    CC=golang-dev
    https://golang.org/cl/5528102

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

https://github.com/golang/go/commit/026f8dfb94b1d4c85ddde081fd10956909918589

元コミット内容

commit 026f8dfb94b1d4c85ddde081fd10956909918589
Author: Adam Langley <agl@golang.org>
Date:   Sun Jan 15 10:22:15 2012 -0500

    exp/terminal: add to level Makefile for the (non-Linux?) systems that need it.
    
    R=golang-dev
    CC=golang-dev
    https://golang.org/cl/5528102
---
 src/pkg/Makefile | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/pkg/Makefile b/src/pkg/Makefile
index c090a2f6c6..47e6a51745 100644
--- a/src/pkg/Makefile
+++ b/src/pkg/Makefile
@@ -81,10 +81,11 @@ DIRS=\\\n \texp/ebnflint\\\n \texp/gotype\\\n \texp/norm\\\n-\texp/ssh\\\n \texp/spdy\\\n \texp/sql\\\n \texp/sql/driver\\\n+\texp/ssh\\\n+\texp/terminal\\\n \texp/types\\\n \texpvar\\\n \tflag\\\n```

## 変更の背景

このコミットの背景には、Go言語の `exp/terminal` という実験的なパッケージが、Linux以外のオペレーティングシステムでも適切にビルドされるようにする必要があったことが挙げられます。Go言語はクロスプラットフォーム開発を強く意識しており、様々な環境でコードが動作することが重要です。`exp/terminal` パッケージが特定の環境でのみビルドされる状態では、そのパッケージの利用範囲が限定されてしまいます。

`Makefile` は、プロジェクトのビルドプロセスを自動化するためのツールであり、Go言語の初期のビルドシステムにおいても重要な役割を担っていました。`src/pkg/Makefile` は、Goの標準ライブラリや実験的なパッケージのビルド対象ディレクトリを定義するファイルです。ここに `exp/terminal` を追加することで、Goのビルドシステムがこのパッケージを認識し、ビルド対象に含めるようになります。

## 前提知識の解説

### Go言語 (Golang)

Goは、Googleによって開発されたオープンソースのプログラミング言語です。静的型付け、コンパイル型言語でありながら、動的型付け言語のような開発のしやすさを目指しています。並行処理のサポートが強力で、ガベージコレクションを備えています。システムプログラミング、Webサービス、ネットワークプログラミングなどで広く利用されています。

### Makefile

Makefileは、プログラムのコンパイルやビルドプロセスを自動化するためのファイルです。`make` コマンドによって解釈され、ソースコードから実行可能ファイルやライブラリを生成する手順を記述します。依存関係を管理し、変更されたファイルのみを再ビルドすることで、効率的な開発を可能にします。Go言語のプロジェクトでは、Go Modulesの登場により `go build` コマンドが主流になりましたが、このコミットが作成された時期(2012年)には、Goのビルドプロセスにおいて `Makefile` がより中心的な役割を担っていました。

### `exp` パッケージ

Go言語の標準ライブラリには、`exp` というプレフィックスを持つパッケージ群が存在します。これらは「experimental(実験的)」の略であり、まだ安定版として提供するには時期尚早だが、将来的に標準ライブラリに取り込まれる可能性のある機能や、特定の目的のために試行的に提供される機能が含まれています。`exp` パッケージは、APIが変更される可能性があり、後方互換性が保証されない場合があるため、利用には注意が必要です。

### `exp/terminal` パッケージ

コミットメッセージから推測すると、`exp/terminal` はターミナル(コマンドラインインターフェース)とのインタラクションに関連する機能を提供する実験的なパッケージであると考えられます。例えば、ターミナルの設定変更、キー入力の検出、カーソル操作など、低レベルなターミナル制御を行うための機能が含まれていた可能性があります。

### クロスプラットフォーム開発

クロスプラットフォーム開発とは、単一のソースコードベースから複数の異なるオペレーティングシステム(例: Windows, macOS, Linux)やハードウェアアーキテクチャ(例: x86, ARM)上で動作するソフトウェアを開発することです。Go言語は、その設計思想からクロスプラットフォーム開発に非常に適しており、コンパイル時にターゲットとなるOSやアーキテクチャを指定することで、その環境向けのバイナリを生成できます。

## 技術的詳細

このコミットの技術的な核心は、Go言語のビルドシステムにおける `Makefile` の役割と、新しい実験的パッケージの統合方法にあります。

Goの初期のビルドシステムでは、`src/pkg/Makefile` がGoの標準ライブラリやその他のパッケージをビルドするための中心的な設定ファイルでした。このファイルには、ビルド対象となるパッケージのディレクトリが `DIRS` 変数にリストアップされていました。`make` コマンドが実行されると、この `DIRS` リストに記載された各ディレクトリに対してビルド処理が走る仕組みでした。

コミットメッセージにある「add to level Makefile for the (non-Linux?) systems that need it」という記述は、`exp/terminal` パッケージが特定のシステム(特にLinux以外のシステム)でビルドされる際に、`Makefile` にその存在を明示的に知らせる必要があったことを示唆しています。これは、Goのビルドシステムが、`DIRS` に含まれていないパッケージを自動的にビルド対象としないためです。

具体的には、`src/pkg/Makefile` 内の `DIRS` 変数に `exp/terminal` を追加することで、Goのビルドプロセスがこの新しい実験的パッケージを認識し、Goがサポートするすべてのプラットフォーム(または少なくとも、`exp/terminal` が意図するプラットフォーム)でコンパイルされるようになります。これにより、`exp/terminal` パッケージがクロスプラットフォームで利用可能になるための基盤が整えられました。

この変更は、Goのビルドシステムがまだ成熟していなかった時期の典型的な調整であり、新しいパッケージが追加されるたびに `Makefile` を手動で更新する必要があったことを示しています。現代のGo Modulesベースのビルドシステムでは、このような `Makefile` の手動編集はほとんど不要となり、依存関係は `go.mod` ファイルによって自動的に管理されます。

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

変更は `src/pkg/Makefile` ファイルの1箇所のみです。

```diff
--- a/src/pkg/Makefile
+++ b/src/pkg/Makefile
@@ -81,10 +81,11 @@ DIRS=\\\n \texp/ebnflint\\\n \texp/gotype\\\n \texp/norm\\\n-\texp/ssh\\\n \texp/spdy\\\n \texp/sql\\\n \texp/sql/driver\\\n+\texp/ssh\\\n+\texp/terminal\\\n \texp/types\\\n \texpvar\\\n \tflag\\\n```

具体的には、`DIRS` 変数のリストに `exp/terminal` が追加されています。また、`exp/ssh` の行が移動していますが、これは実質的な変更ではなく、単に `exp/terminal` を追加する際にリストの順序が調整されたものと見られます。

## コアとなるコードの解説

この変更の目的は、Goのビルドシステムに対して `exp/terminal` パッケージの存在を知らせ、それをビルド対象に含めることです。

`src/pkg/Makefile` 内の `DIRS` 変数は、Goの標準ライブラリや実験的なパッケージが配置されているディレクトリのリストを定義しています。`make` コマンドが実行されると、このリストに記載された各ディレクトリ内のGoパッケージがコンパイルされます。

`+ \texp/terminal\` の行が追加されたことで、`exp/terminal` ディレクトリがビルド対象のリストに明示的に含まれるようになりました。これにより、Goのビルドプロセスは `exp/terminal` パッケージを検出し、そのソースコードをコンパイルして、Goの環境にインストールされるようになります。

この変更は、特にLinux以外のシステムで `exp/terminal` をビルドする際に重要でした。なぜなら、Goのビルドシステムが `Makefile` の `DIRS` リストに依存してビルド対象を決定していたため、リストにないパッケージはビルドされなかったからです。この修正により、`exp/terminal` はGoがサポートする様々なプラットフォームで利用可能となり、クロスプラットフォーム対応が強化されました。

## 関連リンク

*   Go CL 5528102: [https://golang.org/cl/5528102](https://golang.org/cl/5528102)

## 参考にした情報源リンク

*   Go言語公式ドキュメント (Go言語全般): [https://go.dev/doc/](https://go.dev/doc/)
*   GNU Make マニュアル (Makefile全般): [https://www.gnu.org/software/make/manual/](https://www.gnu.org/software/make/manual/)
*   Goの実験的パッケージに関する議論 (Stack Overflowなど): [https://stackoverflow.com/questions/tagged/go-exp](https://stackoverflow.com/questions/tagged/go-exp) (一般的な情報源として)
*   Goのビルドシステムに関する歴史的情報 (Goのブログやメーリングリストのアーカイブ): [https://groups.google.com/g/golang-nuts](https://groups.google.com/g/golang-nuts) (一般的な情報源として)