Windows環境におけるlibxml-ruby gemインストール時のrake

 先日、Windowsで、ActiveSupportのXMLパーサをLibXMLに切り替える方法について書きましたが、その判断に至る経緯についてメモしておきます。
 ActiveSupportのXMLパーサの実装をLibXMLに変更できない件(2)の最後の方で書いていますが、XMLパーサがnilとなってしまうのは、libxml-rubyのインストール時のrakeが正しく実行されていないのが原因ではないかと思っています。

rake

 libxml-ruby gemをインストールするとできるlibxml-ruby-0.9.7-x86-mswin32-60フォルダにRakefileがある。そこで、とりあえず、rakeを実行。
 tarがないというエラーになる。

tar zcvf libxml-ruby-0.9.7.tgz libxml-ruby-0.9.7
'tar' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
rake aborted!
Command failed with status (1): [tar zcvf libxml-ruby-0.9.7.tgz libxml-ruby...]

 Windowsでtarを実行できるようにしよう。vectorから、tar32230.zipダウンロード。解凍。tar32.dllがあるフォルダtar32_2にパスを通す(tar32.dllをC:\Windows\system32に移動してもよい)。また、vectorからtar11.lzhをダウンロード。解凍。TAR.EXEがあるフォルダtar11にパスを通す。
 再度、rake。今度は成功したよう。libxml-ruby-0.9.7-x86-mswin32-60の下に、adminフォルダができる。admin\pkg\libxml-ruby-0.9.7フォルダ内の構成は、rake前のlibxml-ruby-0.9.7-x86-mswin32-60内の構成と全く同一。
 libxml_ruby.rbができないのはrakeが失敗していたせいではないのか?結局、以前と状況変わらず(つД;)

libxml-ruby-0.9.7-x86-mswin32-60\ext\mingw でも rake

 libxml-ruby-0.9.7-x86-mswin32-60\ext\mingwにもRakefileがある。そこでもrakeしてみる。エラーとなる。

(in C:/ruby/lib/ruby/gems/1.8/gems/libxml-ruby-0.9.7-x86-mswin32-60/ext/mingw)
cp libxml_ruby.so
rake aborted!
can't convert nil into String
C:/ruby/lib/ruby/gems/1.8/gems/libxml-ruby-0.9.7-x86-mswin32-60/ext/mingw/rakefi
le:23
(See full trace by running task with --trace)

 rake --traceしてみる。

(in C:/ruby/lib/ruby/gems/1.8/gems/libxml-ruby-0.9.7-x86-mswin32-60/ext/mingw)
** Invoke default (first_time)
** Invoke install (first_time)
** Execute install
cp libxml_ruby.so
rake aborted!
can't convert nil into String
c:/ruby/lib/ruby/1.8/fileutils.rb:1408:in `directory?'
c:/ruby/lib/ruby/1.8/fileutils.rb:1408:in `fu_each_src_dest0'
c:/ruby/lib/ruby/1.8/fileutils.rb:1393:in `fu_each_src_dest'
c:/ruby/lib/ruby/1.8/fileutils.rb:382:in `cp'
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:1070:in `cp'
C:/ruby/lib/ruby/gems/1.8/gems/libxml-ruby-0.9.7-x86-mswin32-60/ext/mingw/rakefi
le:23
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:617:in `call'
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:617:in `execute'
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:612:in `each'
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:612:in `execute'
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:578:in `invoke_with_call_c
hain'
c:/ruby/lib/ruby/1.8/monitor.rb:242:in `synchronize'
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:571:in `invoke_with_call_c
hain'
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:588:in `invoke_prerequisit
es'
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:585:in `each'
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:585:in `invoke_prerequisit
es'
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:577:in `invoke_with_call_c
hain'
c:/ruby/lib/ruby/1.8/monitor.rb:242:in `synchronize'
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:571:in `invoke_with_call_c
hain'
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:564:in `invoke'
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:2027:in `invoke_task'
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:2005:in `top_level'
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:2005:in `each'
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:2005:in `top_level'
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:2044:in `standard_exceptio
n_handling'
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:1999:in `top_level'
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:1977:in `run'
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:2044:in `standard_exceptio
n_handling'
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:1974:in `run'
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/bin/rake:31
c:/ruby/bin/rake:19:in `load'
c:/ruby/bin/rake:19

 Rakefileの23行目のコピーがうまくいっていない。23行目では、dest_pathにEXTENSION_NAMEをコピーしている。

  cp(EXTENSION_NAME, dest_path)

 dest_pathには、20行目でRUBYLIBDIR環境変数が設定されている。たぶん、ここで、環境変数がなくて、nilが設定されていたんだろう。

  dest_path = ENV['RUBYLIBDIR']

 いきなり、libxml-ruby-0.9.7-x86-mswin32-60\ext\mingwでrakeはだめなのか。

libxml-ruby-0.9.7-x86-mswin32-60\ext\mingwRakefile

 でも、ヒントを得た。dest_pathは"libxml-ruby-0.9.7-x86-mswin32-60\lib"となるはずであり、15行目の"task :install do"からはじまるブロックが正しく実行されれば、libxml-ruby-0.9.7-x86-mswin32-60\ext\mingwにある以下の4つのファイルが、libxml-ruby-0.9.7-x86-mswin32-60\libにコピーされるはずである。

  • libxml_ruby.so
  • libxml_ruby.dll.a
  • libxml2-2.dll
  • libiconv-2.dll

 でも、libxml-ruby-0.9.7-x86-mswin32-60\lib にそのようなファイルは見当たらない。それで、手動で、上の4つのファイルをコピーしてみたら、XMLパーサが使えるようになりました。
 以上が、Windowsで、ActiveSupportのXMLパーサをLibXMLに切り替えるのステップ2に至った経緯です。