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

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

このコミットは、Go言語のツールチェインにSolarisオペレーティングシステムへの対応を追加する初期段階の変更です。具体的には、GoのビルドシステムがSolarisを認識し、Solaris上でツールをビルドできるようにするための基盤を構築します。

コミット

commit 901e7bfe53b4610ef9ff9eef5d2cbec7671b6f68
Author: Aram Hăvărneanu <aram@mgk.ro>
Date:   Tue Jan 7 23:12:12 2014 +1100

    lib9, libmach, cmd/dist, go/build: add support for GOOS=solaris
    
    This change adds solaris to the list of supported operating
    systems and allows cmd/dist to be built on Solaris.
    
    This CL has to come first because we want the tools to ignore
    solaris-specific files until the whole port is integrated.
    
    R=golang-codereviews, jsing, rsc, minux.ma
    CC=golang-codereviews
    https://golang.org/cl/35900045

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

https://github.com/golang/go/commit/901e7bfe53b4610ef9ff9eef5d2cbec7671b6f68

元コミット内容

このコミットは、lib9libmachcmd/distgo/buildといったGoの内部コンポーネントに対して、GOOS=solarisのサポートを追加します。これにより、cmd/dist(Goの配布ツール)がSolaris上でビルドできるようになります。

この変更は、Solarisへの完全な移植が完了するまで、ツールがSolaris固有のファイルを無視するようにするために、他の関連する変更よりも先行して適用される必要があると述べられています。

変更の背景

Go言語は、クロスプラットフォーム対応を重視しており、様々なオペレーティングシステム(OS)やアーキテクチャで動作するように設計されています。このコミットは、その多プラットフォーム戦略の一環として、Solaris OSへのサポートを導入するための初期ステップです。

Goのビルドシステムやランタイムは、OS固有の機能やシステムコールに依存する部分が多く存在します。新しいOSをサポートするためには、まずビルドツールがそのOSを認識し、そのOS上で動作するバイナリを生成できるようにする必要があります。このコミットは、Solaris固有のランタイム機能の実装に先立ち、GoのビルドツールがSolarisを「知る」ための基盤を整備することを目的としています。

特に、コミットメッセージにある「This CL has to come first because we want the tools to ignore solaris-specific files until the whole port is integrated.」という記述は重要です。これは、Solarisへの完全な移植作業が進行中であること、そして、その作業中にSolaris固有のコードがGoのビルドシステムによって適切に扱われる(あるいは一時的に無視される)ようにするための準備であることを示唆しています。これにより、段階的な移植作業が可能となり、他のプラットフォームへの影響を最小限に抑えつつ、Solarisサポートを進めることができます。

前提知識の解説

このコミットを理解するためには、以下のGo言語およびOSに関する基本的な知識が必要です。

  • GOOSとGOARCH: Go言語のビルドシステムでは、GOOS環境変数でターゲットOS(例: linux, windows, darwin, freebsdなど)を、GOARCH環境変数でターゲットアーキテクチャ(例: amd64, 386, armなど)を指定します。これにより、特定のOSとアーキテクチャ向けにGoプログラムをクロスコンパイルできます。
  • ビルドタグ (Build Tags): Goのソースファイルには、// +build <tag>のようなコメント行を記述することで、特定のビルド条件(OS、アーキテクチャ、カスタムタグなど)が満たされた場合にのみそのファイルをコンパイルに含めるように指定できます。これは、プラットフォーム固有のコードを管理する上で非常に重要なメカニズムです。
  • cmd/dist: Goのソースコードリポジトリに含まれるツールの一つで、Goの配布物(コンパイラ、リンカ、標準ライブラリなど)をビルドするために使用されます。Goの自己ホスト型コンパイラが動作するために必要な初期ツールセットを構築する役割も担います。
  • lib9: Goの初期のランタイムライブラリの一部で、Goのランタイムが依存する低レベルのOS抽象化レイヤーを提供していました。Unix系OSにおけるファイル操作、プロセス管理、メモリ管理などの基本的な機能を含みます。
  • libmach: デバッガやプロファイラなどのツールが、実行中のプロセスやコアダンプのメモリレイアウト、シンボル情報などを解析するために使用するライブラリです。OS固有のプロセス情報へのアクセスを提供します。
  • Solaris: Sun Microsystems(現在はOracleが所有)によって開発されたUnix系のオペレーティングシステムです。特にエンタープライズ環境でのサーバーOSとして利用されていました。SPARCおよびx86アーキテクチャをサポートします。
  • uname -misainfo -n: Unix系OSでシステム情報を取得するためのコマンドです。
    • uname -m: マシンハードウェア名(アーキテクチャ)を表示します。
    • isainfo -n: Solarisで利用されるコマンドで、システムがサポートする命令セットアーキテクチャ(ISA)を表示します。例えば、amd64i386といった情報が得られます。

技術的詳細

このコミットは、Goのビルドシステムと一部の低レベルライブラリにSolarisサポートを組み込むための複数の変更を含んでいます。

  1. src/cmd/dist/build.cの変更:

    • okgoosという配列に"solaris"が追加されています。この配列は、cmd/distがサポートする有効なGOOS値のリストを定義しています。これにより、GoのビルドツールがSolarisを正当なターゲットOSとして認識するようになります。
  2. src/cmd/dist/unix.cの変更:

    • main関数内で、コンパイル時のマクロ__sun__SVR4をチェックすることで、現在のホストOSがSolarisであるかを判定するロジックが追加されています。
    • もしSolarisであれば、gohostos変数が"solaris"に設定されます。
    • さらに、isainfo -nコマンドを実行し、その出力に"amd64"または"i386"が含まれるかを確認することで、ホストのアーキテクチャ(gohostarch)を動的に決定するロジックが追加されています。これは、Solarisのuname -mが64ビットプラットフォームでもi86pcを返す場合があるため、より正確なアーキテクチャ情報を得るために必要です。
    • #include <signal.h>が追加されています。これは、Solarisでのビルドに必要なヘッダーファイルである可能性があります。
  3. src/lib9/run_unix.csrc/lib9/tempdir_unix.cの変更:

    • これらのファイルには、Goのビルドタグが記述されています。既存のビルドタグリスト(darwin dragonfly freebsd linux netbsd openbsd)にsolarisが追加されています。これにより、これらのファイルがSolaris環境でもコンパイルされるようになります。これらのファイルは、Unix系のOSで共通の低レベル機能(プロセス実行や一時ディレクトリの管理など)を提供するため、Solarisでも同様の機能が必要とされます。
  4. src/libmach/solaris.cの新規追加:

    • このファイルは、Solaris固有のlibmach関数(プロセス制御や情報取得に関連する関数)のスタブ実装を提供します。具体的には、ctlproc, proctextfile, procstatus, attachproc, detachproc, procthreadpidsといった関数が定義されていますが、これらはすべてsysfatal(システム致命的エラー)を呼び出して「unimplemented in Solaris」(Solarisでは未実装)というメッセージを出力します。
    • これは、コミットメッセージにある「tools to ignore solaris-specific files until the whole port is integrated」という方針を反映しています。つまり、ビルドは通るようにするが、実際の機能はまだ実装されていないことを明示しています。これにより、GoのツールチェインはSolarisを認識し、ビルドは可能になりますが、デバッグやプロファイリングといったlibmachが提供する高度な機能は、この時点では利用できないことを意味します。
  5. src/pkg/go/build/deps_test.gosrc/pkg/go/build/syslist.goの変更:

    • deps_test.go内のgeeseGOOSのテスト用リスト)と、syslist.go内のgoosList定数に"solaris"が追加されています。これらは、Goのビルドシステムが認識するOSのリストを定義しており、Solarisが正式にサポート対象OSのリストに加わったことを示します。

これらの変更は、GoのビルドシステムがSolarisを認識し、Solaris上でGoのツールをビルドするための最小限の変更であり、Solarisへの完全なランタイム移植に向けた第一歩となります。

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

このコミットにおけるコアとなるコードの変更箇所は以下のファイルです。

  1. src/cmd/dist/build.c:

    --- a/src/cmd/dist/build.c
    +++ b/src/cmd/dist/build.c
    @@ -52,6 +52,7 @@ static char *okgoos[] = {
     	"darwin",
     	"dragonfly",
     	"linux",
    +	"solaris",
     	"freebsd",
     	"netbsd",
     	"openbsd",
    

    okgoos配列に"solaris"を追加し、cmd/distがSolarisをサポート対象OSとして認識するようにします。

  2. src/cmd/dist/unix.c:

    --- a/src/cmd/dist/unix.c
    +++ b/src/cmd/dist/unix.c
    @@ -24,6 +24,7 @@
     #include <errno.h>
     #include <stdarg.h>
     #include <setjmp.h>
    +#include <signal.h>
     
     // bprintf replaces the buffer with the result of the printf formatting
     // and returns a pointer to the NUL-terminated buffer contents.
    @@ -686,6 +687,14 @@ main(int argc, char **argv)
     	gohostos = "openbsd";
     #elif defined(__NetBSD__)
     	gohostos = "netbsd";
    +#elif defined(__sun) && defined(__SVR4)
    +	gohostos = "solaris";
    +	// Even on 64-bit platform, solaris uname -m prints i86pc.
    +	run(&b, nil, 0, "isainfo", "-n", nil);
    +	if(contains(bstr(&b), "amd64"))
    +		gohostarch = "amd64";
    +	if(contains(bstr(&b), "i386"))
    +		gohostarch = "386";
     #else
     	fatal("unknown operating system");
     #endif
    

    SolarisをホストOSとして検出するロジックと、isainfo -nを使用してアーキテクチャを特定するロジックを追加します。

  3. src/libmach/solaris.c (新規ファイル):

    // This is stubbed out for the moment. Will revisit when the time comes.
    #include <u.h>
    #include <libc.h>
    #include <bio.h>
    #include <mach.h>
    
    int
    ctlproc(int pid, char *msg)
    {
    	USED(pid);
    	USED(msg);
    	sysfatal("ctlproc unimplemented in Solaris");
    	return -1;
    }
    
    char*
    proctextfile(int pid)
    {
    	USED(pid);
    	sysfatal("proctextfile unimplemented in Solaris");
    	return nil;
    }
    
    char*
    procstatus(int pid)
    {
    	USED(pid);
    	sysfatal("procstatus unimplemented in Solaris");
    	return nil;
    }
    
    Map*
    attachproc(int pid, Fhdr *fp)
    {
    	USED(pid);
    	USED(fp);
    	sysfatal("attachproc unimplemented in Solaris");
    	return nil;
    }
    
    void
    detachproc(Map *m)
    {
    	USED(m);
    	sysfatal("detachproc unimplemented in Solaris");
    }
    
    int
    procthreadpids(int pid, int *p, int np)
    {
    	USED(pid);
    	USED(p);
    	USED(np);
    	sysfatal("procthreadpids unimplemented in Solaris");
    	return -1;
    }
    

    Solaris固有のプロセス関連関数のスタブ実装を提供し、ビルドが通るようにしつつ、機能が未実装であることを明示します。

コアとなるコードの解説

このコミットの核となるのは、GoのビルドシステムがSolarisを認識し、その上で動作するための「足がかり」を設けることです。

  • src/cmd/dist/build.csrc/cmd/dist/unix.cの変更: これらはGoのビルドツールの一部であり、Goのコンパイラやその他のツールをビルドする際に、どのOSとアーキテクチャをサポートするか、そして現在のホストOSが何かを判断するために使用されます。okgoosへの"solaris"の追加は、GoがSolarisを正式なターゲットOSとして認識し始めることを意味します。unix.cでのSolaris検出ロジックとisainfo -nによるアーキテクチャ特定は、GoのビルドシステムがSolaris環境で正確に動作するために不可欠です。特に、uname -mが常に正確なアーキテクチャを返さないSolarisの特性に対応している点が重要です。

  • src/lib9/run_unix.csrc/lib9/tempdir_unix.cのビルドタグ追加: これらのファイルは、GoのランタイムがUnix系OSで共通して使用する低レベルの機能(例: プロセス実行、一時ディレクトリの作成)を提供します。+build solarisタグを追加することで、これらの汎用UnixコードがSolaris環境でもコンパイル対象となるように指示しています。これにより、Solarisへの移植作業の初期段階で、既存のUnix向けコードを再利用し、共通部分のビルドエラーを防ぐことができます。

  • src/libmach/solaris.cの新規追加とスタブ実装: これは、このコミットの意図を最も明確に示している部分です。libmachは、デバッガやプロファイラがプロセス情報を取得するために使用するOS固有の機能を提供します。このファイルが新規作成され、すべての関数がsysfatalで「unimplemented」と表示されるスタブになっているのは、Solarisへの完全な移植がまだ完了していないことを示しています。しかし、このスタブが存在することで、libmachに依存するGoのツール(例えば、デバッガ)がSolaris上でビルドできるようになります。これは、完全な機能がなくても、ビルドプロセスを継続し、将来の完全な実装のためのプレースホルダーを提供するという、段階的な開発アプローチの典型例です。

これらの変更は、GoがSolarisを「認識」し、その上で基本的なツールを「ビルドできる」ようにするための最小限かつ戦略的なステップです。これにより、Go開発者はSolarisへの完全な移植作業を、既存のビルドシステムに統合された形で進めることが可能になります。

関連リンク

参考にした情報源リンク