BLOGTIMES
2010/10/16

Ruby 1.9.2 に win32-service を入れる

  ruby 
このエントリーをはてなブックマークに追加

RubyでWindowsのデーモンを実装したかったので、Ruby1.9.2 に gem で win32-service をインストールしようとしたら、一筋縄ではインストールできなかったので、インストール方法をメモしておきます。

作業の前提条件としてはWindowsにRubyInstaller for Windowsを使ってRuby 1.9.2がインストールしてあり、DevKit-4.5.0が正しくインストールされているものとします。インストール先はデフォルトのままなので、"C:\Ruby192"です。

まず、gemで単純にインストールを試みると下記のような感じのエラーが出ます。

C:\>gem install win32-service Temporarily enhancing PATH to include DevKit... Building native extensions. This could take a while... ERROR: Error installing win32-service: ERROR: Failed to build gem native extension. C:/Ruby192/bin/ruby.exe extconf.rb checking for RegisterServiceCtrlHandlerEx()... yes creating Makefile make C:/Ruby192/bin/ruby -e "puts 'EXPORTS', 'Init_daemon'" > daemon-i386-mingw32.def gcc -I. -IC:/Ruby192/include/ruby-1.9.1/i386-mingw32 -I/C/Ruby192/include/ruby-1.9.1/ruby/backward -I/C/Ruby192/include/ruby-1.9.1 -Iwin32 -DHAVE_REGISTERSERVICECTRLHANDLEREX -O3 -g -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long -o daemon.o -c win32/daemon.c win32/daemon.c: In function 'Ruby_Service_Ctrl': win32/daemon.c:141:7: error: '__try' undeclared (first use in this function) win32/daemon.c:141:7: note: each undeclared identifier is reported only once for each function it appears in win32/daemon.c:142:7: error: expected ';' before '{' token win32/daemon.c: In function 'Service_Ctrl': win32/daemon.c:199:4: error: '__try' undeclared (first use in this function) win32/daemon.c:200:4: error: expected ';' before '{' token win32/daemon.c: In function 'ThreadProc': win32/daemon.c:279:7: warning: initialization discards qualifiers from pointer target type make: *** [daemon.o] Error 1 Gem files will remain installed in C:/Ruby192/lib/ruby/gems/1.9.1/gems/win32-service-0.7.1 for inspection. Results logged to C:/Ruby192/lib/ruby/gems/1.9.1/gems/win32-service-0.7.1/ext/gem_make.out

この症状の類似の事例をネットで検索してみると「RubyForge: Win32 Utils: トラッカー詳細: 27692 win32-service install error with 1.9.1」が見つかりました。これによると__tryと__finallyマクロをコメントアウトしてしまえばとりあえずOKのようなのでコードを書き換えてgemを再生成してインストールすることにしました。

コードの修正とインストール

__try、__finallyは2カ所あるので、この2カ所をコメントアウトしておきます。

--- C:/Ruby192/lib/ruby/gems/1.9.1/gems/win32-service-0.7.1/ext/win32/daemon.c.org Sat Oct 16 20:55:38 2010 +++ C:/Ruby192/lib/ruby/gems/1.9.1/gems/win32-service-0.7.1/ext/win32/daemon.c Sat Oct 16 20:55:38 2010 @@ -138,8 +138,8 @@ { while (WaitForSingleObject(hStopEvent,0) == WAIT_TIMEOUT) { - __try - { +// __try +// { EnterCriticalSection(&csControlCode); // Check to see if anything interesting has been signaled @@ -164,11 +164,11 @@ } waiting_control_code = IDLE_CONTROL_CODE; } - } - __finally - { +// } +// __finally +// { LeaveCriticalSection(&csControlCode); - } +// } // This is an ugly polling loop, be as polite as possible rb_thread_polling(); @@ -196,15 +196,15 @@ // hard to image this code ever failing, so we probably // don't need the __try/__finally wrapper - __try - { +// __try +// { EnterCriticalSection(&csControlCode); waiting_control_code = dwCtrlCode; - } - __finally - { +// } +// __finally +// { LeaveCriticalSection(&csControlCode); - } +// } switch(dwCtrlCode) {

その後、gemを再生成してから、再生成されたgemを使ってインストールします。

C:\>cd \Ruby192\lib\ruby\gems\1.9.1\gems\win32-service-0.7.1 C:\Ruby192\lib\ruby\gems\1.9.1\gems\win32-service-0.7.1>gem build win32-service.gemspec Successfully built RubyGem Name: win32-service Version: 0.7.1 File: win32-service-0.7.1.gem C:\Ruby192\lib\ruby\gems\1.9.1\gems\win32-service-0.7.1>gem install win32-service-0.7.1.gem --local Temporarily enhancing PATH to include DevKit... Building native extensions. This could take a while... Successfully installed win32-service-0.7.1 1 gem installed Installing ri documentation for win32-service-0.7.1... Installing RDoc documentation for win32-service-0.7.1...

これで Ruby 1.9.2 でも win32-service が使えるようになります。


    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/3852
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン