Docker が Go で書かれているから。
来るべきその日に備えて。
Installing Go from source に記載されていますが、Go コンパイラのターゲット OS に Solaris は含まれています。
The compilers can target the DragonFly BSD, FreeBSD, Linux, NetBSD, OpenBSD, OS X (Darwin), Plan 9,
Solaris
and Windows operating systems.
リリースノートに垣間見る Solaris のサポート情報
正式ではなくexperimental support
として、Go 1.3 から illumos Kernel や Solaris 11 がサポートされています。
Go 1.3 Release Notes (June 2014):
Support for Solaris
- Go 1.3 now includes experimental support for Solaris on the amd64 (64-bit x86) architecture. It requires illumos, Solaris 11 or above.
Go 1.4 Release Notes (December 2014):
- 特に記載なし
Go 1.5 Release Notes (August 2015):
- The Solaris port now has full support for cgo and the packages net and crypto/x509, as well as a number of other fixes and improvements.
特に言及されていないので、現在のリリース (Go 1.5)でも experimental support
は継続中なのですかね
golang-dev で Solaris を話題にしている人がいないかちょっと調べてみました。
- gccgo backport of recent changes to mksysinfo.sh
Solaris 12 specific;
とか書かれていたりします。- Proposal for a dev.sparc64 branch for the solaris/sparc64 port
solaris/sparc64 port for Go 1.6 のために dev.sparc64 branch を作成することについての提案
サポートされるインストラクション・セットは?
Installing Go from sourceに記載がありますが、現時点では 5 つのインストラクションセット(CPU) をサポートしています。
Solaris という観点では、amd64 (x86-64) になりますね。
SPARC へのポーティングは行われているようです。はやく dev.sparc64 branch できると良いですね。
The Go compilers support five instruction sets.
There are important differences in the quality of the compilers for the different architectures.
- amd64 (also known as x86-64)
A mature implementation. The compiler has an effective optimizer (registerizer) and generates good code (although gccgo can do noticeably better sometimes). - 386 (x86 or x86-32)
Comparable to the amd64 port. - arm (ARM)
Supports Linux, FreeBSD, NetBSD and Darwin binaries. Less widely used than the other ports. - arm64 (AArch64)
Supports Linux and Darwin binaries. New in 1.5 and not as well excercised as other ports. - ppc64, ppc64le (64-bit PowerPC big- and little-endian)
Supports Linux binaries. New in 1.5 and not as well excercised as other ports.
Go コンパイラ・ツールチェーンは、Go 言語で書かれている
Go 1.5 Bootstrap Plan
Go 1.5 will use a toolchain written in Go (at least in part).
Question: how do you build Go if you need Go built already?
Answer: building Go 1.5 will require having Go 1.4 available.
えっ。
Go 1.5 から、Go コンパイラを手に入れるためには Go 1.4 が必須にするというプランに関するドキュメントです。
“Goのソースツリーから,すべてのCプログラムを排除する方法”を検討していたそうです。
そして、最新の Go 1.5 は、このプランのとおり Go コンパイラが必要となりました。
現在は、Go コンパイラに必要な toolchaine (ツールチェーン: プログラムを作成するために利用されるプログラムの集合体)として、gc Go コンパイラと関連するツール群を利用する方法
と
GCC バックエンドを利用した gccgo を利用する方法
の 2 つの方法が提供されている。
- gc Go コンパイラと関連するツール群を利用する方法
- Installing Go from source
- GCC バックエンドを利用した gccgo
- Setting up and using gccgo
Solaris で Go コンパイラを動かすもっとも簡単な方法としては、
- まずは、Go コンパイラを必要としない Solaris をサポートした Go 1.4 をビルドする
- できあがった Go コンパイラで Go 1.5 をビルドする
という流れになります。
そのため Solaris では、gc Go コンパイラと関連するツール群を利用する方法
によるインストール手順を採用します。
ビルドは、次回 Golang って Solaris でビルドできるのか調べてみた に続く・・・
おまけ
boltdb - Bolt is a pure Go key/value store が mmap を利用することに対応するパッチおよびユーザーの仮想メモリ領域が特定のパターンで使用されることをカーネルに通知し、メモリおよびスレッドの配置を最適化する madvice() をサポートするパッチを作成している人も。
- Issue:
- x/sys/unix: Solaris lacks Flock (plus related constants) #11113
- Here is the complete patch for x/sys:
http://www.bonsai.com/ken/public/xsys_solaris.patch - Here is the complete patch for bolt:
http://www.bonsai.com/ken/public/bolt_solaris.patch
また、Solaris 上の Go コンパイラでは SYS_IOCTL が未定義のため syscall.Syscall(syscall.SYS_IOCTL,...) のようにシステムコールの直接呼び出しが書かれたコードはエラーになってしまうというのもあります。
上記の Issue に解決策が記載されていました。
ただ、いろいろ調べているとこのような書き方はプラットフォームのポータビリティを無視しているという意見もあり、ちょっと脱線していますが色々と面白い話にも遭遇しました。