この記事はアピリッツの技術ブログ「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 以下のファイルを確認するようにしましょう。