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

  • 0
    いいね
  • 0
    コメント
    この記事は最終更新日から1年以上が経過しています。

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

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

    これによりgemを使ったmsgpackyajl-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