2.x系は、CFLAGSに-ansi -std=iso9899:199409
が入るようになり、Rubyのコンパイルは成功するものの、inlineや//
コメントを使っている拡張ライブラリがコンパイルできない問題があるようです。
これによりgemを使ったmsgpack
やyajl-ruby
のインストール時にコンパイルが失敗し、fluentdのインストールができません。
※この記事は d.hatena.ne.jp/fujisan3776 から持ってきています
OpenCSWで必要なパッケージをインストールする
pkgutilのインストール方法は割愛 (http://www.opencsw.org/manual/for-administrators/getting-started.html を見てください)
# pkgutil -i -y gcc4g++ bison libreadline_dev libssl_dev libncurses_dev libgdbm_dev pkgconfig sudo
※たぶんこれで足りると思う
Ruby 2.0.0 or higher install via rbenv
論よりコード
$ 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は以下の通り
$ 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
エラーメッセージ
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)の固有の問題か否か調査不足のため不明)
--- 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