OpenCVをVagrant + Chef + CentOS6.5の開発環境にインストールするのに結構なハマり所が多かったので、メモしておきます。
OpenCVをインストールするレシピ
以下がopencvをインストールするためのレシピです。
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
これから一つづつ解説していきます。
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のインストールドキュメント に記載されているものを yum list | grep パッケージ名 で検索して見つけたものをコツコツとリストアップしインストールしました。
OpenCVのコンパイルするにはcmakeというパッケージも必要なのですが、CentOS6.5のデフォルトのyumに入っているバージョンのcmakeを使うとエラーが発生するため、下記で2.8バージョンのcmakeをインストールします。
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のインストールです。
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で以下のように設定してメモリを上げることでインストールに成功しました。
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)というエラーが発生したらメモリを上げてみると上手くいくと思います(_ _;)