ホーム DoRuby Webroar を Macports の Ruby で動かすでござる

Webroar を Macports の Ruby で動かすでござる

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

エレコマの開発を担当しているたろちゃんです。

Webroarは以前Daoka氏が紹介をしていたが、Macportsで導入したRubyの上で動作しませんでした。また、SSLのサポートも通らなかったため、両方が動くように調整をしてみました。

今回はSSL環境を構築したいため、gnutlsを導入します。

$ sudo port install gnutls

webroarの導入自体は以下のコマンドで行ないました。

$ sudo gem install webroar

ユーザガイドに沿ってインストールを行なうと以下のようにエラーとなりました。

wisp:~ btm$ sudo webroar install --ssl-support
Checking for the dependencies ...
Checking for ruby........found   at /opt/local/bin/ruby.
Checking for libruby.1.8.7.dylib........found  at /opt/local/lib.
Checking for openssl-ruby........found.
Checking for zlib-ruby........found.
Checking for ruby_headers........found   at /opt/local/lib/ruby/1.8/i686-darwin10/ruby.h.
Checking for rubygems........found.
Checking for /usr/bin/gcc-4.2........found   at /usr/bin/gcc-4.2.
Checking for make........found   at /usr/bin/make.
Checking for starling........found   at /opt/local/bin/starling.
Checking for Xcode.app........found   at /Developer/Applications/Xcode.app.
Checking for any previous installation of WebROaR ... found.

Please enter your choice from the options below:
 1. Import configuration, logs and admin panel data from the previous installation - WebROaR-0.2.6.
 2. No import required, install WebROaR-0.2.6 afresh.
> 1
Importing configuration, logs and admin panel data from the previous WebROaR-0.2.6 install ... done.
Creating directory structure ... done.
Compiling C source files ... failed.
Compilation error. Please refer 'install.log' for details.

install.logは /opt/local/lib/ruby/gems/1.8/gems/webroar-0.2.6/install.log に置かれます。それを見ると gnutls.h が見つからないというメッセージが出ていました。これは単純に -I/opt/local/include と -L/opt/local/lib をコンパイル時に渡せば良いという事ですが、実は gnutls に依存している webroar-head だけではなく、webroar-worker も -L/opt/local/lib を渡さなければならない事が後々判明しました。これは、ライブラリのパスを渡さないと MacOSX に付属している Ruby のライブラリを参照してしまうからです。

$ otool -L /opt/local/lib/ruby/gems/1.8/gems/webroar-0.2.6/bin/webroar-worker 
/opt/local/lib/ruby/gems/1.8/gems/webroar-0.2.6/bin/webroar-worker:
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.0.0)
	/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)
	/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/libruby.1.dylib (compatibility version 1.8.0, current version 1.8.7)

このため、両方のリンク時に必ず -L/opt/local/lib を指定するようにしなくてはなりません。

今回はwebroar 0.2.6 を対象に次のようなパッチを用意しました。

--- lib/command_runner.rb.orig	2010-01-19 17:37:20.000000000 +0900
+++ lib/command_runner.rb	2010-01-19 17:36:53.000000000 +0900
@@ -56,6 +56,7 @@
   Options:
     -s, --ssl-support      Install the server with SSL support
     -d, --debug-build      Compile the server as a debug build to output extremely verbose logs 
+    -m, --macports         Compile the server with MacPorts Ruby
 
   Summary:
     Install the server
@@ -175,6 +176,10 @@
       options[:report_dir] = dir
     end
 
+    opts.on( '-m', '--macports', 'Compile with MacPorts Ruby') do
+      options[:macports] = true
+    end
+
   end
 
   begin
--- lib/installer.rb.orig	2010-01-19 17:38:03.000000000 +0900
+++ lib/installer.rb	2010-01-19 18:11:26.000000000 +0900
@@ -165,7 +165,11 @@
       ssl = true
       str = "ssl=yes "
     end
-    
+   
+    if options[:macports]
+      str += "macports=yes "
+    end
+
     if CheckUser.new.check == 0
       
 #      if File.exist?(File.join(WEBROAR_BIN_DIR,"webroar-head")) && File.exist?(File.join(WEBROAR_BIN_DIR,"webroar-worker"))
--- tasks/compile.rake.orig	2010-01-19 11:54:46.000000000 +0900
+++ tasks/compile.rake	2010-01-19 17:43:29.000000000 +0900
@@ -66,6 +66,9 @@
     puts "Adding HAVE_GNUTLS flag."
     $flags << '-DHAVE_GNUTLS'
   end
+  if ENV['macports'].eql?("yes")
+    puts "Building for MacPorts Ruby build."
+  end
   $flags = $flags.join(" ")
   $webroar_config_called=true
 end
@@ -128,12 +131,18 @@
 TEST_OBJ_DIR = File.join(OBJ_DIR, 'test').freeze
 LOG_FILES = File.join('','var','log','webroar').freeze
 TMP_FILES = File.join('','tmp').freeze
+MACPORTS_HEADER_DIR = File.join('', 'opt', 'local', 'include').freeze
+MACPORTS_LIB_DIR = File.join('', 'opt', 'local', 'lib').freeze
 
 ## Create necessory directories
 #create_directories([OBJ_DIR, WORKER_OBJ_DIR, YAML_OBJ_DIR, TEST_OBJ_DIR, TMP_FILES, LOG_FILES])
 
 include_dir = ["#{LIBEV_DIR}","#{EBB_DIR}","#{HEAD_DIR}","#{YAML_DIR}","#{HELPER_DIR}","#{UNIT_TEST_DIR}", "#{WORKER_DIR}"]
 
+if ENV['macports'].eql?("yes")
+  include_dir << "#{MACPORTS_HEADER_DIR}"
+end
+
 include_dir.each do |dir|
   $inc_flags << " -I#{dir} "
 end
@@ -244,6 +253,10 @@
   $libs += $LIBS + ' ' + Config::expand($LIBRUBYARG_SHARED,CONFIG)
   #$libs += ' '+CONFIG["LIBRUBYARG"]  
   $libs += ' -lpthread '
+  if ENV['macports'].eql?("yes")
+    puts "Compiling with MacPorts Ruby."
+    $libs += " -L#{MACPORTS_LIB_DIR} "
+  end
   out_file=File.join(BIN_DIR,'webroar-worker')
   object_files=FileList[File.join(WORKER_OBJ_DIR,'*.o'), helper_obj.keys, File.join(YAML_OBJ_DIR,'*.o')]
   # -rdynamic option to get function name in stacktrace
@@ -263,6 +276,10 @@
     puts "Compiling with gnutls library."
     $libs += ' -lgnutls '
   end
+  if ENV['macports'].eql?("yes")
+    puts "Compiling with MacPorts Ruby."
+    $libs += " -L#{MACPORTS_LIB_DIR} "
+  end
   out_file=File.join(BIN_DIR,'webroar-head')
   object_files=FileList[File.join(OBJ_DIR,'*.o'),File.join(YAML_OBJ_DIR,'*.o')]
   # -rdynamic option to get function name in stacktrace
--- tasks/gem.rake.orig	2010-01-19 17:54:13.000000000 +0900
+++ tasks/gem.rake	2010-01-19 17:54:39.000000000 +0900
@@ -118,7 +118,11 @@
   if ENV['debug_build'] == 'yes'
     opt_str += "-d "
   end 
-  
+ 
+  if ENV['macports'] == 'yes'
+    opt_str += "-m "
+  end
+
   sh "webroar install #{opt_str}" 
 end
 

パッチの内容は webroar install にオプション -m もしくは –macports を追加してMacPorts用にビルドをしたい場合はオプションを付けるようにするというものです。

これをwebroar_0.2.6_macports_patch.diffとして適当なディレクトリに用意します。

では、パッチを当ててビルドをしてみましょう。

$ cd /opt/local/lib/ruby/gems/1.8/gems/webroar-0.2.6
$ sudo patch -p 0 < ~/develop/ruby/webroar_0.2.6_macports_patch.diff
$ sudo webroar install -s -m

正常に動作するでしょうか?Admin Panelにログインができたら、後は指示に従って導入を進める事ができます。

なお、筆者のケースで、rack-1.1.0が入ってしまい上手く動作させる事ができない事がありました。これはrails-2.3.5がrack-1.0.1に依存(正確にはrailsが依存してるライブラリが依存)しているためです。しかし、このようなケースだとログに一部出力されずに分かりづらい事があります。そういう時はwebroarをdebugオプションつきでインストールをして、/var/log/webroar 以下のファイルを確認するようにしましょう。

記事を共有

最近人気な記事