mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Ruby - 2.3.2 ビルドインストール時のエラー!

[ プログラミング ] [ Ruby ]

こんばんは。

Ruby 2.3.2 をソースをビルドしてインストールする際にエラーが出力されるので、調査して対策してみました。

調べてみると、実際は 2.3.1 から同じようなエラーになるようですが、自分が 2.3.1 をソースビルドでインストールした時には気付きませんでした。

0. 前提条件

  • LMDE2(Linux Mint Debian Edition 2) での作業を想定。

1. 現象

.configure, make 後に sudo make install すると、以下のようなエラーを出力して終了する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/home/foo/ruby-2.3.2/lib/rubygems/installer.rb:233:in `check_executable_overwrite': no implicit conversion of nil into String (TypeError)
        from /home/foo/ruby-2.3.2/lib/rubygems/installer.rb:474:in `block in generate_bin'
        from /home/foo/ruby-2.3.2/lib/rubygems/installer.rb:461:in `each'
        from /home/foo/ruby-2.3.2/lib/rubygems/installer.rb:461:in `generate_bin'
        from /home/foo/ruby-2.3.2/lib/rubygems/installer.rb:301:in `install'
        from ./tool/rbinstall.rb:686:in `call'
        from ./tool/rbinstall.rb:686:in `block in <class:Installer>'
        from ./tool/rbinstall.rb:754:in `block (2 levels) in <main>'
        from /home/foo/ruby-2.3.2/lib/rubygems/specification.rb:821:in `block in each_spec'
        from /home/foo/ruby-2.3.2/lib/rubygems/specification.rb:743:in `block (2 levels) in each_gemspec'
        from /home/foo/ruby-2.3.2/lib/rubygems/specification.rb:742:in `each'
        from /home/foo/ruby-2.3.2/lib/rubygems/specification.rb:742:in `block in each_gemspec'
        from /home/foo/ruby-2.3.2/lib/rubygems/specification.rb:741:in `each'
        from /home/foo/ruby-2.3.2/lib/rubygems/specification.rb:741:in `each_gemspec'
        from /home/foo/ruby-2.3.2/lib/rubygems/specification.rb:819:in `each_spec'
        from ./tool/rbinstall.rb:751:in `block in <main>'
        from ./tool/rbinstall.rb:801:in `block in <main>'
        from ./tool/rbinstall.rb:798:in `each'
        from ./tool/rbinstall.rb:798:in `<main>'
uncommon.mk:260: recipe for target 'do-install-all' failed
make: *** [do-install-all] Error 1

但し、 ruby -v を実行すると正常にバージョンが出力されるし、 irb も正常に機能する。

エラーメッセージから判断するに、 RubyGems 周りがおかしいのかもしれない。

2. 原因

“lib/rubygems/installer.rb” の 233 行目を含む check_executable_overwrite filename メソッドを眺めてみる。
※233行目は、 question << existing の行(以下の37行目)
(行ハイライト等のオプションが効かないバージョンの Octopress なので(参考:BUG: start, mark, and linenos don’t work in code blocks · Issue #1472 · imathis/octopress))

/home/foo/ruby-2.3.2/lib/rubygems/installer.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
  def check_executable_overwrite filename # :nodoc:
    return if @force

    generated_bin = File.join @bin_dir, formatted_program_filename(filename)

    return unless File.exist? generated_bin

    ruby_executable = false
    existing = nil

    open generated_bin, 'rb' do |io|
      next unless io.gets =~ /^#!/ # shebang
      io.gets # blankline

      # TODO detect a specially formatted comment instead of trying
      # to run a regexp against Ruby code.
      next unless io.gets =~ /This file was generated by RubyGems/

      ruby_executable = true
      existing = io.read.slice(%r{
          ^(
            gem \s |
            load \s Gem\.bin_path\(
          )
          (['"])(.*?)(\2),
        }x, 3)
    end

    return if spec.name == existing

    # somebody has written to RubyGems' directory, overwrite, too bad
    return if Gem.default_bindir != @bin_dir and not ruby_executable

    question = "#{spec.name}'s executable \"#{filename}\" conflicts with ".dup

    if ruby_executable then
      question << existing

      return if ask_yes_no "#{question}\nOverwrite the executable?", false

      conflict = "installed executable from #{existing}"
    else
      question << generated_bin

      return if ask_yes_no "#{question}\nOverwrite the executable?", false

      conflict = generated_bin
    end

    raise Gem::InstallError,
      "\"#{filename}\" from #{spec.name} conflicts with #{conflict}"
  end

どうやら、String 変数 questionexisting を連結しようとしているが、 existing が nil になることあるようだ。

3. 対策

該当のメソッドしか目を通していないので、これが根本的な対策となるか不明だが、 “lib/rubygems/installer.rb” の 233 行目を以下のように変更した。

/home/foo/ruby-2.3.2/lib/rubygems/installer.rb
1
2
3
4
5
6
7
8
@@ -230,7 +230,7 @@
     question = "#{spec.name}'s executable \"#{filename}\" conflicts with ".dup

     if ruby_executable then
-      question << existing
+      question << (existing || 'an unknown executable')

       return if ask_yes_no "#{question}\nOverwrite the executable?", false

この後、再度 sudo make install を流して、正常にインストールが終了することを確認する。
また、RubyGems ライブラリのインストールが問題なく行えること、その他各種動作が正常であることも確認する。

4. 参考サイト


以上。

Comments