Sparc Solaris向けにGoのクロスコンパイル環境を作った話

Minori Tokuda(@snowcrush)

GOOS=solaris

Solaris(ソラリス)はサン・マイクロシステムズ(サン)によって開発され、 UNIXとして認証を受けたオペレーティングシステム (OS) である。

wikipedia

GOARCH=sparc64

SPARC(スパーク、Scalable Processor Architecture)は、 サン・マイクロシステムズが開発・製造したRISCベースのマイクロプロセッサであり、 その命令セットアーキテクチャの名称である。

wikipedia

Q. なぜSparc/Solarisなのか?

A. 歴史的経緯です!

うちのサーバの現況

  1. 大量のバッチプログラムが動いている
  2. ネットワーク構成上他のサーバへは移植できない
  3. 使用できる言語はJava/Perlのみ

=> つらい

新しい開発言語が欲しい!

新たな開発言語の要件

  1. ライブラリやランタイムの導入で悩まない
  2. 起動が早い
  3. マイナーなアーキテクチャでも動作する

あれ、Go・・・いいんじゃね?

Goの対応OS/CPUリスト

https://golang.org/doc/install/source#environment

GOOS/GOARCH

...

solaris/amd64

あっ、Sparcが無い

gccgoを使う

gccgo

  • Go言語のもう一つのコンパイラ
  • gccをバックエンドに使っている
  • gccのサポートするアーキテクチャが使える
  • gccのクロスコンパイルの仕組みが利用できる

作り方01

http://ggolang.blogspot.jp/2015/05/gccgo-gcc510-cross-compile-for-sparc.html

このサイトを全部コピ参考にしました

作り方02

  1. クロスコンパイル用の環境を用意します(Fedora release 20)
  2. gccをインストールします
  3. gcコンパイラ(v1.4)をインストールします(重要)

作り方03

  1. 3つ環境変数を決めます
    • PREFIX=${クロスコンパイラがインストールされるルートパス}
    • SYSROOT=${コンパイルするときにリンクする環境のルートパス}
    • TARGET=sparc-sun-solaris2.10

作り方04

  1. SYSROOTに対象サーバのライブラリとヘッダをごっそりコピーする(rsync)
$ sudo cd $SYSROOT
$ sudo rsync -a root@solaris_sparc_machine:/lib/ $SYSROOT/lib/
$ sudo rsync -a root@solaris_sparc_machine:/usr/lib $SYSROOT/usr/
$ sudo rsync -a root@solaris_sparc_machine:/usr/include $SYSROOT/usr/
$ sudo rsync -a root@solaris_sparc_machine:/usr/platform $SYSROOT/usr/
$ sudo rsync -a root@solaris_sparc_machine:/usr/local/lib $SYSROOT/usr/local/
$ sudo rsync -a root@solaris_sparc_machine:/usr/local/include $SYSROOT/usr/local/
$ sudo rsync -a root@solaris_sparc_machine:/usr/sfw/lib $SYSROOT/usr/sfw/
$ sudo rsync -a root@solaris_sparc_machine:/usr/sfw/include $SYSROOT/usr/sfw/

作り方05

  1. 対象アーキテクチャ向けにbinutilsとgccをビルドする
$ tar -zxf binutils-2.25.tar.gz
$ mkdir build-binutils
$ cd build-binutils
$ sudo ../binutils-2.25/configure  -target=$TARGET --prefix=$PREFIX -with-sysroot=$SYSROOT -v
$ sudo make -j4
$ sudo make install
$ untar gcc-5.1.0.tar.gz
$ mkdir gcc-build
$ cd gcc-build
$ sudo ../gcc-5.1.0/configure --target=$TARGET --with-gnu-as --with-gnu-ld  --prefix=$PREFIX -with-sysroot=$SYSROOT --disable-libgcj --enable-languages=c,c++,go -v
$ sudo make -j6
$ sudo make install

完成

作成したクロスコンパイラにパスを通す

$ cd $PREFIX/bin
$ ln -s /sparc-sun-solaris2.10-gccgo  gccgo
$ export PATH=$PREFIX/bin:$PATH

コンパイル

$ go build --compiler gccgo \
  --gccgoflags "-v -static-libgo -static-libgcc -Wl,-dy -lnsl -lsocket -lrt"

重要 参照元のオプションに-static-libgccを追加しないとSolaris環境では動作しませんでした。

動作確認したツール類

  1. serf
  2. gnatsd
  3. fluentd-forwarder

動かなかったもの

  1. consul
  2. peco

go1.5以降に依存しているものはうごかないみたい

特定のアーキテクチャがハードコーディングされているものは動かないみたい

終わりに

  1. マイナーなアーキテクチャでもgccgoなら動かせる(?)
  2. 既存のツールをgo getでインストールする場合は依存関係の解決が大変
  3. 公式ライブラリのみ使って自作するのであれば大丈夫
  4. gccgo6でgcc1.5相当になる模様

結論: Linux使おう