斎藤と申します。横から失礼します。

gem install bigdecimalが失敗する問題は、BigDecimalのgemに限らず、現状の他の
gemにも波及する問題である、という事を知っていただきたいです。

たとえば拙作ライブラリのgemは、1.9.3では何の問題もなくgem installできますが、
最新の2.0.0に同梱されているgemで試したところ、以下のように、bigdecimalの
ケースに酷似したエラーメッセージと共に、installが失敗します。

$ ruby-2.0.0  -v
ruby 2.0.0dev (2013-01-14 trunk 38812) [x86_64-linux]

$ gem-2.0.0  -v
2.0.0.preview3.1

$ gem-2.0.0 install decimal # gemの名前が似ているのはたまたまです ;)
Building native extensions.  This could take a while...
ERROR:  Error installing decimal:
    ERROR: Failed to build gem native extension.

    /home/tadashi/rubies/2.0.0/bin/ruby-2.0.0 extconf.rb
checking for RUBY_VERSION in version.h... no
checking for rb_big_div()... yes
checking for rb_big_modulo()... yes
checking for rb_bigzero_p()... yes
checking for rb_usascii_str_new()... yes
creating Makefile

make
compiling decimal.c
decimal.c: In function ‘divmod’:
decimal.c:1030:8: warning: unused variable ‘div_inum’ [-Wunused-variable]
decimal.c: In function ‘do_round’:
decimal.c:855:47: warning: ‘inum’ may be used uninitialized in this
function [-Wmaybe-uninitialized]
linking shared-object decimal.so

make install
/usr/bin/install -c -m 0755 decimal.so
/home/tadashi/rubies/2.0.0/lib/ruby/gems/2.0.0/gems/decimal-0.1.0/lib
installing default decimal libraries
/usr/bin/install: `./lib/decimal.rb' and
`/home/tadashi/rubies/2.0.0/lib/ruby/gems/2.0.0/gems/decimal-0.1.0/lib/decimal.rb'
are the same file
make: *** [/home/tadashi/rubies/2.0.0/lib/ruby/gems/2.0.0/gems/decimal-0.1.0/lib/decimal.rb]
Error 1


Gem files will remain installed in
/home/tadashi/rubies/2.0.0/lib/ruby/gems/2.0.0/gems/decimal-0.1.0 for
inspection.
Results logged to
/home/tadashi/rubies/2.0.0/lib/ruby/gems/2.0.0/gems/decimal-0.1.0/./gem_make.out


ログからは、makeによるビルドは(warningが出るものの)成功していますが、make installで
失敗しているのがお分かりいただけると思います。

これはたしかにgem作者がディレクトリ構成を変えれば回避できますが、逆に申し
上げると、現在installできるgemでも構成を変えない限り、2.0.0になった途端に(API・
コードに互換性はあっても)installできなくなる可能性があるということになります。
これがバグかどうか自分にははっきりしませんが、大きな非互換であるのは明らか
ではないでしょうか。

このようにインストールに失敗するgemがいくつあるのかも、実際にインストール
するか、構成をチェックしてみなければ分かりません。2.0リリース後に阿鼻叫喚する
特定のgem利用者が出るのは間違いないでしょう。またこのディレクトリの仕様変更に
よって、どんなメリットがあるのかも自分は分かりませんでした。

というわけでいちgem作者のお願いとして、

1. 2.0.0のリリースか、せめて直後のパッチリリースまでには、上記の振る舞いを元に
  戻してインストールできるようにしてほしい
2. 戻せないのであれば、現行の全gemについて機械的に2.0.0readyであるかチェックし
  gem作者に通知してほしい (というのはrubygems.orgの仕事になりそうですね)

というものを要望させていただきたいです。(ただ2は、かなりコストが高く感じます)

その他にも、

3. gem作者に、インストール不能になる非互換が発生する旨をアナウンスする

という選択肢もあるかもしれませんが、今まではアナウンスを見たことがないですし、
この時期から新しく出すのでは、すでに遅すぎるのではないかという気がしています。

ご検討をよろしくお願いいたします。

2013/1/14 hsbt (Hiroshi SHIBATA) <shibata.hiroshi / gmail.com>:
>
> Issue #7344 has been updated by hsbt (Hiroshi SHIBATA).
>
>
> io-console も同じなのにエラーが出ないのは何故と調べてみると、io-console は LOAD_PATH の下でビルドした後に、io というディレクトリを作成して、io/console.so と移動しているため、gnu install でエラーがでないようでした。
> ----------------------------------------
> Bug #7344: gem pristine bigdecimal が失敗してしまう
> https://bugs.ruby-lang.org/issues/7344#change-35401
>
> Author: hsbt (Hiroshi SHIBATA)
> Status: Feedback
> Priority: Normal
> Assignee: mrkn (Kenta Murata)
> Category: core
> Target version: 2.0.0
> ruby -v: ruby 2.0.0dev (2012-11-13) [x86_64-darwin12.2.1]
>
>
> gem pristine bigdecimal を実行すると以下のエラーが発生して落ちてしまいます。
>
> % gem pristine bigdecimal
> Restoring gems to pristine condition...
> Building native extensions.  This could take a while...
> ERROR:  While executing gem ... (Gem::Installer::ExtensionBuildError)
> ERROR: Failed to build gem native extension.
>
> /Users/hsbt/.rbenv/versions/2.0.0-dev/bin/ruby extconf.rb
> checking for labs() in stdlib.h... yes
> checking for llabs() in stdlib.h... yes
> creating Makefile
>
> make
> compiling bigdecimal.c
> linking shared-object bigdecimal.bundle
>
> make install
> /usr/local/Cellar/coreutils/8.19/libexec/gnubin/install -c -m 0755 bigdecimal.bundle /Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/gems/2.0.0/gems/bigdecimal-1.1.0/.
> /usr/local/Cellar/coreutils/8.19/libexec/gnubin/install: ‘bigdecimal.bundle’ and ‘/Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/gems/2.0.0/gems/bigdecimal-1.1.0/./bigdecimal.bundle’ are the same file
> make: *** [install-so] Error 1
>
> 単独で実行している時は影響がないのですが、 OS アップデート時などに gem pristine --all を実行した時は b で必ず止まってしまうので困っています。
>
>
> --
> http://bugs.ruby-lang.org/
>

--
Tadashi Saito