OpenMP 無効の ImageMagick の RPM を作成する
CentOS の Yum で ImageMagick を入れると、以下のようにデフォルトで OpenMP が有効になっています。
# yum install -y ImageMagick # convert --version Version: ImageMagick 6.5.4-7 2012-05-07 Q16 OpenMP http://www.imagemagick.org Copyright: Copyright (C) 1999-2009 ImageMagick Studio LLC
OpenMP が有効だとマルチスレッドなどでの使用時に負荷的が高くなってしまう、という事なので、 OpenMP を無効にした RPM を作成してみました。
環境は CentOS 6.3 x86_64 です。
RPM 作成のための準備
まずは RPM 作成に必要な rpmbuild と rpmdevtools をインストールします。
# yum install -y rpm-build rpmdevtools
次に RPM 作成用のユーザを作成します。
ここでは rpmdevel というユーザを作成しました。
# useradd rpmdevel
作成したユーザに su し、 rpmdev-setuptree コマンドを実行します。
# su - rpmdevel
$ rpmdev-setuptree
rpmdev-setuptree コマンドを実行すると、以下のように RPM 作成に必要なディレクトリ構造を作成してくれます。
$ tree . └── rpmbuild ├── BUILD ├── RPMS ├── SOURCES ├── SPECS └── SRPMS 6 directories, 1 file
また、以下の .rpmmacros も同時に生成されます。
$ cat ~/.rpmmacros %_topdir %(echo $HOME)/rpmbuild %_smp_mflags -j3 %__arch_install_post /usr/lib/rpm/check-rpaths /usr/lib/rpm/check-buildroot
これで RPM 作成の為の準備は完了です。
依存ライブラリのインストール
ここで再度 root になり、ImageMagick のビルドに必要な依存ライブラリをインストールします。
手元の環境では以下のインストールが必要でした。
$ su - # yum install gcc \ gcc-c++ \ make \ bzip2-devel \ libjpeg-devel \ libpng-devel \ libtiff-devel \ giflib-devel \ perl-devel \ ghostscript-devel \ libwmf-devel \ jasper-devel \ libtool-ltdl-devel \ libXext-devel \ libXt-devel \ lcms-devel \ libxml2-devel \ librsvg2-devel \ OpenEXR-devel
djvulibre の RPM は標準のリポジトリにはなかったので、RepoForge からインストールしました。
# yum install http://pkgs.repoforge.org/djvulibre/djvulibre-3.5.22-1.el6.rf.x86_64.rpm \
http://pkgs.repoforge.org/djvulibre/djvulibre-devel-3.5.22-1.el6.rf.x86_64.rpm
RPM の作成
依存ライブラリのインストールが完了したら、改めて RPM 作成用ユーザに su し、SRPM ファイルをインストールします。
# su - rpmdevel $ wget http://ring.u-toyama.ac.jp/archives/graphics/ImageMagick/linux/SRPMS/ImageMagick.src.rpm $ rpm -ivh ImageMagick.src.rpm
インストールしたら SPEC ファイルを編集して行きます。
$ vi ~/rpmbuild/SPECS/ImageMagick.spec
SPEC ファイルの先頭付近を確認すると、この時の ImageMagick のバージョンは 6.8.5-10 でした。
%global VERSION 6.8.5 %global MAJOR_VERSION 6 %global Patchlevel 10
バージョンによっては以下の変更箇所が若干異なる可能性もあるので注意してください。
165 行目付近にある %build セクションの %configure に「--disable-openmp」と「--disable-opencl」を追加します。
%build %configure --enable-shared \ --disable-static \ --disable-openmp \ --disable-opencl \ --with-modules \ --with-perl \ --with-x \ --with-threads \ --with-magick_plus_plus \ --with-gslib \ --with-wmf \ --with-lcms \ --with-rsvg \ --with-xml \ --with-perl-options="INSTALLDIRS=vendor %{?perl_prefix} CC='%__cc -L$PWD/magick/.libs' LDDLFLAGS='-shared -L$PWD/magick/.libs'" \ --without-dps
また、devel の %package セクションに 「Requires: %{name}-libs」 があるため、このまま RPM を作成すると、ImageMagick-devel の RPM インストール時に、以下のように ImageMagick-libs が要求されます。
エラー: 依存性の欠如: ImageMagick-libs = 6.8.5-10 は ImageMagick-devel-6.8.5-10.x86_64 に必要とされています
しかし実際には何故か Libs 用の %files セクションは定義されていないために ImageMagick-libs の RPM ファイルは生成されません。
そのため、このままではインストールできない devel が出来上がってしまいます。
この問題を避けるため、53 行目付近から始まる devel の %package セクションから「Requires: %{name}-libs」の行を削除しておきます。
Requires: %{name}-libs = %{version}-%{release}
これで SPEC ファイルの修正は完了です。
以下を実行して RPM を作成します。
$ rpmbuild -bb ~/rpmbuild/SPECS/ImageMagick.spec
RPM の作成には少し時間がかかります。
完了したら RPM ファイルが無事生成されたことを確認します。
$ ll ~/rpmbuild/RPMS/x86_64/ 合計 17360 -rw-rw-r--. 1 rpmdevel rpmdevel 6389006 6月 7 05:07 2013 ImageMagick-6.8.5-10.x86_64.rpm -rw-rw-r--. 1 rpmdevel rpmdevel 729549 6月 7 05:07 2013 ImageMagick-c++-6.8.5-10.x86_64.rpm -rw-rw-r--. 1 rpmdevel rpmdevel 792007 6月 7 05:07 2013 ImageMagick-c++-devel-6.8.5-10.x86_64.rpm -rw-rw-r--. 1 rpmdevel rpmdevel 3220034 6月 7 05:07 2013 ImageMagick-devel-6.8.5-10.x86_64.rpm -rw-rw-r--. 1 rpmdevel rpmdevel 25369 6月 7 05:07 2013 ImageMagick-djvu-6.8.5-10.x86_64.rpm -rw-rw-r--. 1 rpmdevel rpmdevel 6303922 6月 7 05:07 2013 ImageMagick-doc-6.8.5-10.x86_64.rpm -rw-rw-r--. 1 rpmdevel rpmdevel 295303 6月 7 05:07 2013 ImageMagick-perl-6.8.5-10.x86_64.rpm
RPM のインストール
root になり、作成した RPM をインストールしてみます。
ここでは確認も含めて生成された RPM を全部入れてみました。
$ su - # yum install /home/rpmdevel/rpmbuild/RPMS/x86_64/ImageMagick-6.8.5-10.x86_64.rpm \ /home/rpmdevel/rpmbuild/RPMS/x86_64/ImageMagick-devel-6.8.5-10.x86_64.rpm \ /home/rpmdevel/rpmbuild/RPMS/x86_64/ImageMagick-c++-6.8.5-10.x86_64.rpm \ /home/rpmdevel/rpmbuild/RPMS/x86_64/ImageMagick-c++-devel-6.8.5-10.x86_64.rpm \ /home/rpmdevel/rpmbuild/RPMS/x86_64/ImageMagick-djvu-6.8.5-10.x86_64.rpm \ /home/rpmdevel/rpmbuild/RPMS/x86_64/ImageMagick-doc-6.8.5-10.x86_64.rpm \ /home/rpmdevel/rpmbuild/RPMS/x86_64/ImageMagick-perl-6.8.5-10.x86_64.rpm
他のマシンに持って行ってインストールする場合は、以下のように djvulibre のみ別途インストールが必要になります。
# yum install http://pkgs.repoforge.org/djvulibre/djvulibre-3.5.22-1.el6.rf.x86_64.rpm \ ImageMagick-6.8.5-10.x86_64.rpm \ ImageMagick-devel-6.8.5-10.x86_64.rpm \ ImageMagick-c++-6.8.5-10.x86_64.rpm \ ImageMagick-c++-devel-6.8.5-10.x86_64.rpm \ ImageMagick-djvu-6.8.5-10.x86_64.rpm \ ImageMagick-doc-6.8.5-10.x86_64.rpm \ ImageMagick-perl-6.8.5-10.x86_64.rpm
インストールしたらバージョンを確認し、OpenMP と表示されていないことを確認します。
# convert --version Version: ImageMagick 6.8.5-10 2013-06-08 Q16 http://www.imagemagick.org Copyright: Copyright (C) 1999-2013 ImageMagick Studio LLC Features: DPC Modules Delegates: bzlib djvu fontconfig freetype gslib jng jp2 jpeg lcms openexr pango png ps rsvg tiff wmf x xml zlib
これで OpenMP を無効にした ImageMagick の RPM ファイルの作成は完了です。
参考サイト
PerlMagick が OpenMP 有効だと高負荷になる件 :: drk7jp
http://www.drk7.jp/MT/archives/001841.html
ImageMagickのOpenMPは並列実行で悪影響するのは本当だった - treeのメモ帳
http://treeapps.hatenablog.com/entry/2013/03/30/170058
ImageMagickとOpenMPの件 - blog.nomadscafe.jp
http://blog.nomadscafe.jp/2011/12/imagemagickopenmp.html