忘れたときに備えた記録

トップ 最新 追記
2005|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|11|12|
2009|01|02|03|04|05|06|10|12|
2010|06|07|08|12|
2011|07|09|
2012|09|11|
2013|02|03|09|
2015|10|11|
2016|01|08|11|
2017|02|08|10|
2018|11|

2011-09-15(Thursday)

自分でprefixを指定してインストールしたライブラリを使うgemのインストール方法

あるライブラリを--prefix付きでソースからビルドしてインストールして、そのライブラリを使うgemをインストールして使う、という場合について調べてみたのです。

今回、題材にするのはKyoto Cabinetになります。

背景

Ubuntuのパッケージになっていないライブラリを試しに使ってみたくて、手動でインストールする場合を考えます。

$ sudo make install

としてしまうと、/usr/local以下に他の同様のライブラリやソフトと一緒にインストールされてしまいますが、試しに使うという場合は、後で簡単に消せるように(また、消すべきでないファイルを消してしまわないように)、独立したディレクトリにインストールします。

そういう風にインストールしたライブラリを使うgemをインストールする場合の注意事項について、解説します。

今回、ライブラリのインストール先は $HOME/tmp/opt にして、rubygemsの方は既にインストール済みとします。

ライブラリのインストール

Kyoto Cabinetからソースコードをダウンロードしてインストールします。configureで--prefixを使ってインストール先を指定します。

$ ./configure --prefix=$HOME/tmp/opt
#================================================================
# Configuring Kyoto Cabinet version 1.2.70.
#================================================================
(中略)
#================================================================
# Ready to make.
#================================================================
$ make
(中略)
#================================================================
# Ready to install.
#================================================================
$ make install
(中略)
#================================================================
# Thanks for using Kyoto Cabinet.
#================================================================
$

gemのインストール

現在、Kyoto Cabinet用のgemとしては

  • kyotocabinet (1.0)
  • kyotocabinet-ruby (1.27.1)

の2つがありますが、kyotocabinet-ruby の方が有効なようです。

まず、うまく行かない場合

$ gem install kyotocabinet-ruby
Fetching: kyotocabinet-ruby-1.27.1.gem (100%)
Building native extensions.  This could take a while...
ERROR:  Error installing kyotocabinet-ruby:
	ERROR: Failed to build gem native extension.
(中略)
checking for kccommon.h... no
*** extconf.rb failed ***
(中略)
Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/usr/bin/ruby1.8
	--with-kyotocabinet-dir
	--without-kyotocabinet-dir
	--with-kyotocabinet-include
	--without-kyotocabinet-include=${kyotocabinet-dir}/include
	--with-kyotocabinet-lib
	--without-kyotocabinet-lib=${kyotocabinet-dir}/lib
(以下略)

ここから、--with-opt-dirまたは--with-kyotocabinet-dirで、Kyoto Cabinetをインストールしたディレクトリを指定すれば良いらしいと分かります。

今回、opt-dirとkyotocabinet-dirの違いは良く分かりませんでした。試したところ、どちらでもインストールして使うことができます。 多分、複数のライブラリを使うようなgemで、同じoptディレクトリにライブラリが入っているならopt-dir、個別に分けているなら"ライブラリ名-dir"を使うんではないかなと。

何にしろ、この指定は gem install の末尾に -- で区切って付加します。

$ gem install kyotocabinet-ruby -- --with-kyotocabinet-dir=$HOME/tmp/opt
Building native extensions.  This could take a while...
Successfully installed kyotocabinet-ruby-1.27.1
1 gem installed
Installing RDoc documentation for kyotocabinet-ruby-1.27.1...

使ってみる

とりあえずrequireだけしてみましょう。

$ ruby -rubygems -e 'require "kyotocabinet"; puts :ok'
/home/hiraku/opt/gem/gems/kyotocabinet-ruby-1.27.1/lib/kyotocabinet.so: libkyotocabinet.so.15: cannot open shared object file: No such file or directory - /home/hiraku/opt/gem/gems/kyotocabinet-ruby-1.27.1/lib/kyotocabinet.so (LoadError)
	from /usr/local/lib/site_ruby/1.8/i686-linux/rubygems/custom_require.rb:59:in `require'
	from -e:1

これは、実行時にld.soがlibkyotocabinet.soの位置を知らないために起こるエラーです。 環境変数 LD_LIBRARY_PATH で指定することで解決できます。

$ LD_LIBRARY_PATH=$HOME/tmp/opt/lib ruby -rubygems -e 'require "kyotocabinet"; puts :ok'
ok

これでコマンドラインから起動するスクリプトからは問題なく使うことが出きるようになります。 しかし、例えばsuexecなCGIではこの環境変数を使うことができないので、そういう場合は素直に/usr/local以下にインストールする必要があります。

まとめ

  • ライブラリインストール時に--prefixでインストール先を指定する
  • gemのインストール時は末尾に -- --with-XXXX-dirでライブラリのインストール先を教える
  • 実行時には LD_LIBRARY_PATH でライブラリのインストール先を教える
  • suexecなCGIでは無理!

どっとはらいヽ(´−`)丿

Tags: Ruby RubyGems

2011-09-30(Friday)

shared_context のローカル版

先日公開されたるびま 35号改めて学ぶ RSpecで shared_context が紹介されていました。

これは、すべてのdescribe/contextブロックから一意の名前で参照できるコンテキストですが、これに対して、特定のdescribe/contextブロックの中でだけ共有できるコンテキストがあれば便利じゃね?と思って作ってみたのがこちらです。

例えば、複数の機能を持つ規模の大きいアプリを作っていて、それらの機能で異なる基本的なサンプルを処理させる場合に

shared_context "basic sample for Hoge" do
...
end
shared_context "basic sample for Fuga" do
...
end

describe Hoge do
   describe "#size" do
      include_context "basic sample for Hoge"
   end
end

describe Foge do
   describe "#size" do
      include_context "basic sample for Fuga"
   end
end

と書く代わりに

describe Hoge do
   local_context "basic sample" do
      ...
   end

   describe "#size" do
      include_local_context "basic sample"
   end
end

describe Fuga do
   local_context "basic sample" do
      ...
   end

   describe "#size" do
      include_local_context "basic sample"
   end
end

と書いて、共有するコンテキストの名前を簡単にできます。

gistに置いてありますので、よろしかったらどうぞ。

Tags: Ruby RSpec