[exerb-dev:0550] 実行ファイルに拡張ライブラリ(.so)と同名のDLLを格納したい場合について

Zurück zum Archiv-Index

Masahiro Kitajima katon****@katon*****
2010年 2月 1日 (月) 00:26:08 JST


[ruby-list:46829] より。

現象:
 以下の test.rb を .exe ファイルに変換します。

---- test.rb ----
require 'iconv'
---- test.rb 終わり ----

  C:\TMP>mkexy test.rb

 iconv.dll が無い環境で動かすため、レシピ・ファイルに iconv.dll 
の記述を追加します。

---- test.exy ----
# Generated by mkexy
# on 2010-01-31 19:48

general:
  startup: test.rb
  core: cui
  kcode: none

file:
  test.rb:
  iconv.so:
    file: c:/ruby187/lib/ruby/1.8/i386-mswin32/iconv.so
    type: extension-library
  iconv.dll:                        # 追加
    file: c:/ruby187/bin/iconv.dll  # 追加
    type: dynamic-library           # 追加
---- test.exy 終わり ----

  C:\TMP>exerb test.exy
  C:\TMP>test.exe
  test.rb:1:in `require': No such file to load -- iconv (LoadError)
          from test.rb:1

 require 'iconv' が失敗します。
 require 'iconv.so' とすれば成功します。

原因:
 Exerb::Recipe#create_archive で .exe ファイルのアーカイブ部分に 
add_file_entry する際に、レシピ・ファイルの file ブロックに書かれ
たファイル・リストを、ファイル名でソートしているため、ファイル名
部分が同名の .so と .dll を一緒に格納する場合、.dll、.so の順に格
納されています。

 このような .exe ファイルを実行した場合、exerb/exerb.cpp:
exerb_find_file_inside() で、先に .dll がマッチしてしまいます。
 ここで扱われる DLL ファイルは、feature 名に '.so' を補っている
事から、中身が ruby 拡張ライブラリである事を想定していると考えら
れ、ここでファイルの typeに拘わらず、拡張子が .dll であるファイル
を処理しているのが間違いです。

対策案:
 exerb/exerb.cpp: exerb_find_file_inside() で .dll にマッチした
時、ファイルの type が拡張ライブラリでなければスキップするように
すればよいと思います。パッチを添付します。

-- 
北島雅博(かとんぼ)
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: exerb.cpp.patch
型:         application/octet-stream
サイズ:     610 バイト
説明:       無し
Download 



exerb-developer メーリングリストの案内
Zurück zum Archiv-Index