Vagrant + Chef + CentOS6.5 でOpenCV2.4.9をインストールする。

OpenCVをVagrant + Chef + CentOS6.5の開発環境にインストールするのに結構なハマり所が多かったので、メモしておきます。

## OpenCVをインストールするレシピ

以下がopencvをインストールするためのレシピです。

````ruby:opencv/recipes/default.rb

for_opencv_pkgs = %w(
  gcc
  gtk+extra
  gtk+extra-devel
  pkgconfig
  python
  python-devel
  numpy
  libavc1394
  libavc1394-devel
  libdc1394
  libdc1394-devel
  libjpeg-turbo
  libjpeg-turbo-devel
  libpng
  libpng-devel
  sqlite-devel
 )

for_opencv_pkgs.each do |pkg|
  package pkg do
    action :install
  end
end


remote_file '/tmp/epel-release-6-8.noarch.rpm' do
  source 'http://ftp-srv2.kddilabs.jp/Linux/packages/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm'
  action :create_if_missing
end

package 'epel-release-6-8.noarch.rpm' do
  provider Chef::Provider::Package::Rpm
  source '/tmp/epel-release-6-8.noarch.rpm'
  action :install
end

package 'cmake28' do
  action :install
end


remote_file "/tmp/2.4.9.tar.gz" do
  source "https://github.com/Itseez/opencv/archive/2.4.9.tar.gz"
  action :create_if_missing
end

bash 'install opencv' do
  user 'root'
  code <<-EOS
cd /tmp
tar zxvf 2.4.9.tar.gz
mkdir /etc/opencv
cd /etc/opencv
cmake28 /tmp/opencv-2.4.9
make
make install
EOS
end

````


これから一つづつ解説していきます。


````ruby
for_opencv_pkgs = %w(
  gtk+extra
  gtk+extra-devel
  pkgconfig
  python
  python-devel
  numpy
  libavc1394
  libavc1394-devel
  libdc1394
  libdc1394-devel
  libjpeg-turbo
  libjpeg-turbo-devel
  libpng
  libpng-devel
  sqlite-devel
 )

for_opencv_pkgs.each do |pkg|
  package pkg do
    action :install
  end
end

````

ここではOpenCV2.4.9のインストールに必要なパッケージをインストールしています。
これらは[OpenCVのインストールドキュメント](http://docs.opencv.org/doc/tutorials/introduction/linux_install/linux_install.html) に記載されているものを yum list | grep パッケージ名 で検索して見つけたものをコツコツとリストアップしインストールしました。

OpenCVのコンパイルするにはcmakeというパッケージも必要なのですが、CentOS6.5のデフォルトのyumに入っているバージョンのcmakeを使うとエラーが発生するため、下記で2.8バージョンのcmakeをインストールします。

````ruby
remote_file '/tmp/epel-release-6-8.noarch.rpm' do
  source 'http://ftp-srv2.kddilabs.jp/Linux/packages/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm'
  action :create_if_missing
end

package 'epel-release-6-8.noarch.rpm' do
  provider Chef::Provider::Package::Rpm
  source '/tmp/epel-release-6-8.noarch.rpm'
  action :install
end

package 'cmake28' do
  action :install
end

````

まずremote_fileリソースでcmakeのバージョン2.8が入ったepelのrpmをダウンロードします。

その後、packageリソースでproviderをChef::Provider::Package::Rpmを指定してepel-release-6-8.noarch.rpmをyum installで使えるようにインストールします。

そしてpackage 'cmake28' でcmakeの2.8をインストールします。

これでOpenCVに必要なPackageのインストールは完了しました！

以下からはOpenCV2.4.9のインストールです。

````ruby
remote_file "/tmp/2.4.9.tar.gz" do
  source "https://github.com/Itseez/opencv/archive/2.4.9.tar.gz"
  action :create_if_missing
end

bash 'install opencv' do
  user 'root'
  code <<-EOS
cd /tmp
tar zxvf 2.4.9.tar.gz
mkdir /etc/opencv
cd /etc/opencv
cmake28 /tmp/opencv-2.4.9
make
make install
EOS
end

````

まずremote_fileリソースで、OpenCV2.4.9のソースをダウンロードします。

あとはbashリソースでコンパイル、インストールの手順を一気に行います!

これでOpenCVをインストールするレシピは終了ですが、これだけではVagrantで仮想環境を使っている場合にmakeの箇所でエラーが発生してしまいました。

理由は下記のVagrantの設定で、説明します。

## Vagrantの設定

上記で説明したレシピでインストールを行うと make をしている箇所で
````
c++: internal compiler error: Killed (program cc1plus)
````
というエラーが発生して失敗していました。

原因を調べてみるとどうやら仮想環境のメモリ不足が原因でKillされているっぽく、
Vagrantfileで以下のように設定してメモリを上げることでインストールに成功しました。

````ruby:Vagrantfile
  config.vm.provider :virtualbox do |v|
    v.customize ["modifyvm", :id, "--memory", 2048]
  end

````

メモリ単位はMBなんですが、512MBづつ上げて2048MBでやっと成功するようになりました。

top -M でコンパイル時の状況を見てみると、メモリが1600MB程使われていたことと他にmysqldが動いていたことを見ると他のプロセスを切ったり、いろいろするともう少し少ないメモリでも成功するかもしれないですが、とりあえずmakeでc++: internal compiler error: Killed (program cc1plus)というエラーが発生したらメモリを上げてみると上手くいくと思います(_ _;)