- blogs:
- cles::blog
2010/10/16

Ruby 1.9.2 に win32-service を入れる

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 を使ってログインすることができます。
サイト内検索
検索ワードランキング
へぇが多いエントリ
閲覧数が多いエントリ
1 . アーロンチェアのポスチャーフィットを修理(112093)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110733)
3 . 年次の人間ドックへ(110337)
4 . 2023 年分の確定申告完了!(1つめ)(109889)
5 . 三菱鉛筆がラミーを買収(109789)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110733)
3 . 年次の人間ドックへ(110337)
4 . 2023 年分の確定申告完了!(1つめ)(109889)
5 . 三菱鉛筆がラミーを買収(109789)
cles::blogについて
Referrers