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

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

このコミットは、Go言語のビルドツールである cmd/dist に、BSD系のオペレーティングシステム(FreeBSD, OpenBSD, NetBSD)をホストOSとして認識するためのケースを追加するものです。これにより、FreeBSD上でのGoのビルドが修正されることが目的とされています。

コミット

commit 68576506d6c241fe445eba5e25fb8830e4135915
Author: Russ Cox <rsc@golang.org>
Date:   Sat Feb 4 01:39:29 2012 -0500

    cmd/dist: add BSD gohostos cases
    
    Should fix FreeBSD build.
    
    TBR=golang-dev
    CC=golang-dev
    https://golang.org/cl/5629050
---
 src/cmd/dist/unix.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/cmd/dist/unix.c b/src/cmd/dist/unix.c
index d62ebcaa83..2c3624ad54 100644
--- a/src/cmd/dist/unix.c
+++ b/src/cmd/dist/unix.c
@@ -641,6 +641,12 @@ main(int argc, char **argv)
 	\tgohostarch = "amd64";
 #elif defined(__linux__)
 	\tgohostos = "linux";
+#elif defined(__FreeBSD__)
+\tgohostos = "freebsd";
+#elif defined(__OpenBSD__)
+\tgohostos = "openbsd";
+#elif defined(__NetBSD__)
+\tgohostos = "netbsd";
 #else
 	\tfatal("unknown operating system");
 #endif

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

https://github.com/golang/go/commit/68576506d6c241fe445eba5e25fb8830e4135915

元コミット内容

cmd/dist: add BSD gohostos cases

Should fix FreeBSD build.

TBR=golang-dev
CC=golang-dev
https://golang.org/cl/5629050

変更の背景

このコミットの主な背景は、Go言語のビルドシステムがFreeBSD上で正しく動作していなかった問題の解決です。Goのビルドプロセスでは、ビルドを実行するホスト環境のオペレーティングシステムを正確に識別する必要があります。cmd/dist ツールは、この識別を行う役割を担っていますが、FreeBSDを含むBSD系のOSに対する明示的な識別ロジックが不足していました。

その結果、FreeBSD上でGoをビルドしようとすると、ホストOSが「unknown operating system」として認識され、ビルドが失敗する可能性がありました。このコミットは、__FreeBSD__, __OpenBSD__, __NetBSD__ といったプリプロセッサマクロを用いて、これらのOSを明示的に識別し、gohostos 変数に適切な値を設定することで、この問題を解消することを目的としています。

前提知識の解説

Go言語のビルドシステムと cmd/dist

Go言語は、そのソースコードから実行ファイルを生成する際に、独自のビルドシステムを使用します。このビルドシステムは、クロスコンパイル(異なるOSやアーキテクチャ向けのバイナリを生成すること)を容易にするように設計されています。

cmd/dist は、Goのソースツリーのルートにある src/cmd/dist ディレクトリに存在するGoのビルドツールチェーンの一部です。これは、Goのコンパイラ、リンカ、アセンブラなどのツールをビルドし、Goの標準ライブラリをコンパイルするために使用されます。cmd/dist は、ビルドを実行するホスト環境(ホストOSとホストアーキテクチャ)を検出し、それに基づいてビルドプロセスを調整します。

gohostosgohostarch

Goのビルドシステムでは、以下の環境変数が重要な役割を果たします。

  • GOOS: ターゲットとなるオペレーティングシステム(例: linux, windows, darwin, freebsd)。
  • GOARCH: ターゲットとなるアーキテクチャ(例: amd64, arm, 386)。
  • GOHOSTOS: ビルドを実行しているホストのオペレーティングシステム。
  • GOHOSTARCH: ビルドを実行しているホストのアーキテクチャ。

cmd/dist は、ビルド時にこれらの GOHOSTOSGOHOSTARCH の値を自動的に設定します。これにより、ホスト環境に合わせた適切なビルドツールが選択され、コンパイルが実行されます。

プリプロセッサマクロ (__FreeBSD__, __OpenBSD__, __NetBSD__)

C言語やC++などのコンパイル型言語では、プリプロセッサマクロが使用されます。これらは、コンパイルの前にソースコードを変換するための指示です。オペレーティングシステムやコンパイラは、特定の環境を示すために定義済みのマクロを提供します。

  • __FreeBSD__: FreeBSDオペレーティングシステム上でコンパイルされている場合に定義されます。
  • __OpenBSD__: OpenBSDオペレーティングシステム上でコンパイルされている場合に定義されます。
  • __NetBSD__: NetBSDオペレーティングシステム上でコンパイルされている場合に定義されます。

これらのマクロは、条件付きコンパイル(#ifdef, #elif, #else, #endif)と組み合わせて使用され、特定のOSに依存するコードパスを有効にするために利用されます。

技術的詳細

src/cmd/dist/unix.c ファイルは、Goのビルドツール cmd/dist の一部であり、主にUnix系システムにおけるホストOSとホストアーキテクチャの検出ロジックを含んでいます。このファイルはC言語で書かれており、Goのビルドプロセスが開始される前に実行され、Goのビルド環境を初期化する役割を担っています。

変更前のコードでは、gohostos 変数を設定する際に、__linux__ マクロが定義されている場合にのみ gohostos = "linux" と設定していました。それ以外の既知のOS(例えばmacOSを示す __APPLE__ など)に対する条件分岐は存在しましたが、BSD系のOSに対する明示的な識別が欠けていました。

このコミットでは、以下の新しい条件分岐が追加されました。

  • #elif defined(__FreeBSD__): __FreeBSD__ マクロが定義されている場合、gohostos"freebsd" に設定します。
  • #elif defined(__OpenBSD__): __OpenBSD__ マクロが定義されている場合、gohostos"openbsd" に設定します。
  • #elif defined(__NetBSD__): __NetBSD__ マクロが定義されている場合、gohostos"netbsd" に設定します。

これにより、cmd/dist は、FreeBSD, OpenBSD, NetBSDといったBSD系のOS上で実行された際に、自身のホストOSを正しく識別できるようになります。この正確な識別は、GoのツールチェーンがこれらのOS上で適切にビルドされ、実行されるために不可欠です。例えば、Goの標準ライブラリにはOS固有のシステムコールやAPIを使用する部分があるため、gohostos の値に基づいて適切なコードパスが選択される必要があります。

この変更は、Goのクロスプラットフォーム対応を強化し、より多くのオペレーティングシステム上でのGoの利用を可能にするための重要なステップです。

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

変更は src/cmd/dist/unix.c ファイルの main 関数内、ホストOSを決定する条件分岐部分に集中しています。

--- a/src/cmd/dist/unix.c
+++ b/src/cmd/dist/unix.c
@@ -641,6 +641,12 @@ main(int argc, char **argv)
 	\tgohostarch = "amd64";
 #elif defined(__linux__)
 	\tgohostos = "linux";
+#elif defined(__FreeBSD__)
+\tgohostos = "freebsd";
+#elif defined(__OpenBSD__)
+\tgohostos = "openbsd";
+#elif defined(__NetBSD__)
+\tgohostos = "netbsd";
 #else
 	\tfatal("unknown operating system");
 #endif

コアとなるコードの解説

上記のコードスニペットは、C言語のプリプロセッサディレクティブ(#if, #elif, #else, #endif)を使用して、コンパイル時の環境に基づいて gohostos 変数に適切な文字列を割り当てるロジックを示しています。

  1. #elif defined(__linux__): 既に存在していた条件で、コンパイラが __linux__ マクロを定義している場合(つまり、Linuxシステム上でコンパイルされている場合)、gohostos"linux" に設定されます。
  2. #elif defined(__FreeBSD__): 新しく追加された行です。コンパイラが __FreeBSD__ マクロを定義している場合(FreeBSDシステム上でコンパイルされている場合)、gohostos"freebsd" に設定されます。
  3. #elif defined(__OpenBSD__): 同様に新しく追加された行で、__OpenBSD__ マクロが定義されている場合、gohostos"openbsd" に設定されます。
  4. #elif defined(__NetBSD__): これも新しく追加された行で、__NetBSD__ マクロが定義されている場合、gohostos"netbsd" に設定されます。
  5. #else: 上記のどの条件にも合致しない場合、fatal("unknown operating system") が呼び出され、ビルドプロセスが「不明なオペレーティングシステム」というエラーメッセージと共に終了します。

この変更により、Goのビルドツールは、これらのBSD系OSをホスト環境として正確に識別し、それに応じてビルドプロセスを進めることができるようになります。これにより、Goのソースコードがこれらのプラットフォーム上で正しくコンパイルされ、実行可能なバイナリが生成されることが保証されます。

関連リンク

  • Go Change-Id: I2222222222222222222222222222222222222222 (コミットメッセージに記載されている https://golang.org/cl/5629050 は、GoのコードレビューシステムであるGerritのチェンジリストIDを示しています。これは、このコミットがGerrit上でレビューされた際のIDです。)

参考にした情報源リンク

  • Go言語の公式ドキュメント (Goのビルドシステムに関する一般的な情報)
  • GCC Preprocessor Options (プリプロセッサマクロに関する一般的な情報)
  • BSD系のオペレーティングシステムに関する一般的な知識