Solaris10上のRuby 2.0.0(というか、OpenCSWのgcc-4.8.0)でmsgpackがインストールに失敗する件

2.x系は、CFLAGSに`-ansi -std=iso9899:199409`が入るようになり、Rubyのコンパイルは成功するものの、inlineや`//`コメントを使っている拡張ライブラリがコンパイルできない問題があるようです。

https://www.ruby-forum.com/topic/4410941

これによりgemを使った`msgpack`や`yajl-ruby`のインストール時にコンパイルが失敗し、fluentdのインストールができません。

※この記事は d.hatena.ne.jp/fujisan3776 から持ってきています

## OpenCSWで必要なパッケージをインストールする ##

pkgutilのインストール方法は割愛 (http://www.opencsw.org/manual/for-administrators/getting-started.html を見てください)

```bash
# pkgutil -i -y gcc4g++ bison libreadline_dev libssl_dev libncurses_dev libgdbm_dev pkgconfig sudo
```

※たぶんこれで足りると思う

## Ruby 2.0.0 or higher install via rbenv ##

### 論よりコード ###

```bash
$ curl 'http://pastebin.com/raw.php?i=saYYa8X6' > configure.in-cflags.patch
$ CONFIGURE_OPTS="--with-opt-dir=/opt/csw" rbenv install -p 2.0.0-p353 < configure.in-cflags.patch
```

※ pastebin.comに上がっているdiffは、私がuploadしたファイルです

### 環境について ###

Solaris10のgccは以下の通り

```bash
$ which gcc
/opt/csw/bin/gcc
$ gcc -v
Reading specs from /opt/csw/lib/gcc/i386-pc-solaris2.10/4.8.0/specs
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/opt/csw/libexec/gcc/i386-pc-solaris2.10/4.8.0/lto-wrapper
Target: i386-pc-solaris2.10
Configured with: /home/maciej/src/opencsw/pkg/gcc4/trunk/work/solaris10-i386/build-isa-pentium_pro/gcc-4.8.0/configure --prefix=/opt/csw --exec_prefix=/opt/csw --bindir=/opt/csw/bin --sbindir=/opt/csw/sbin --libexecdir=/opt/csw/libexec --datadir=/opt/csw/share --sysconfdir=/etc/opt/csw --sharedstatedir=/opt/csw/share --localstatedir=/var/opt/csw --libdir=/opt/csw/lib --infodir=/opt/csw/share/info --includedir=/opt/csw/include --mandir=/opt/csw/share/man --enable-cloog-backend=isl --enable-java-awt=xlib --enable-languages=ada,c,c++,fortran,go,java,objc --enable-libada --enable-libssp --enable-nls --enable-objc-gc --enable-threads=posix --program-suffix=-4.8 --with-cloog=/opt/csw --with-gmp=/opt/csw --with-included-gettext --with-ld=/usr/ccs/bin/ld --without-gnu-ld --with-libiconv-prefix=/opt/csw --with-mpfr=/opt/csw --with-ppl=/opt/csw --with-system-zlib=/opt/csw --with-gnu-as --with-as=/opt/csw/bin/gas
Thread model: posix
gcc version 4.8.0 (GCC) 
```

#### `gem install msgpack` エラーメッセージ ####

```bash
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

    /export/home/ma2shita/.rbenv/versions/2.0.0-p353/bin/ruby extconf.rb
checking for ruby/st.h... yes
checking for st.h... yes
checking for rb_str_replace() in ruby.h... yes
creating Makefile

make "DESTDIR="
compiling core_ext.c
In file included from /opt/csw/lib/gcc/i386-pc-solaris2.10/4.8.0/include-fixed/math.h:27:0,
                 from /export/home/ma2shita/.rbenv/versions/2.0.0-p353/include/ruby-2.0.0/ruby/missing.h:23,
                 from /export/home/ma2shita/.rbenv/versions/2.0.0-p353/include/ruby-2.0.0/ruby/ruby.h:1567,
                 from /export/home/ma2shita/.rbenv/versions/2.0.0-p353/include/ruby-2.0.0/ruby.h:33,
                 from compat.h:21,
                 from core_ext.h:21,
                 from core_ext.c:19:
/export/home/ma2shita/.rbenv/versions/2.0.0-p353/include/ruby-2.0.0/ruby/missing.h:212:17: error: expected identifier or '(' before '__extension__'
 RUBY_EXTERN int signbit(double x);
                     ^
/export/home/ma2shita/.rbenv/versions/2.0.0-p353/include/ruby-2.0.0/ruby/missing.h:212:17: error: expected identifier or '(' before ')' token
 RUBY_EXTERN int signbit(double x);
                     ^
make: *** [core_ext.o] Error 1


Gem files will remain installed in /export/home/ma2shita/app/vendor/bundle/ruby/2.0.0/gems/msgpack-0.5.8 for inspection.
Results logged to /export/home/ma2shita/app/vendor/bundle/ruby/2.0.0/gems/msgpack-0.5.8/ext/msgpack/gem_make.out
```

## configure.in-cflags.patch について ##

### 使い方 ###

- rbenv installの場合 => `rbenv install -p 2.0.0-p353 < configure.in-cflags.patch`
- tarballの場合 => `patch -p0 < configure.in-cflags.patch ; autoconf ; ./configure ; make`

### 概要 ###

configure.in-cflags.patch は、Solaris上でコンパイルする際のCFLAGSを`-std=gnu90`にするパッチです。

(ただし、本問題がSolaris10+OpenCSW gcc(4.8.0)の固有の問題か否か調査不足のため不明)

```diff
--- configure.in.orig	2014-01-25 18:01:50.492004734 +0900
+++ configure.in	2014-01-25 18:32:17.810251545 +0900
@@ -725,6 +725,12 @@
       # with ANSI standard flags. Anonumous union is required to compile
       # socket extension where <net/if.h> uses anonymous union.
     ],
+    [solaris*], [
+      RUBY_TRY_CFLAGS(-std=gnu90, [
+        RUBY_APPEND_OPTION(warnflags, -std=gnu90)
+        RUBY_APPEND_OPTION(strict_warnflags, -std=gnu90)
+      ])
+    ],
     [
       # ANSI (no XCFLAGS because this is C only)
       RUBY_TRY_CFLAGS(-ansi -std=iso9899:199409, [
```

## あとがき ##

ちなみに rubyの make testも、msgpackの rake specも PASSしてますので、実用上については問題なさそうです。

しかしいろいろ難しい。こんな環境で使ってるんじゃねぇよ、って声が聞こえてきそうです。ごめんなさい^2