akishin999の日記

調べた事などを書いて行きます。

OpenMP 無効の ImageMagick の RPM を作成する

CentOSYumImageMagick を入れると、以下のようにデフォルトで 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  67 05:07 2013 ImageMagick-6.8.5-10.x86_64.rpm
-rw-rw-r--. 1 rpmdevel rpmdevel  729549  67 05:07 2013 ImageMagick-c++-6.8.5-10.x86_64.rpm
-rw-rw-r--. 1 rpmdevel rpmdevel  792007  67 05:07 2013 ImageMagick-c++-devel-6.8.5-10.x86_64.rpm
-rw-rw-r--. 1 rpmdevel rpmdevel 3220034  67 05:07 2013 ImageMagick-devel-6.8.5-10.x86_64.rpm
-rw-rw-r--. 1 rpmdevel rpmdevel   25369  67 05:07 2013 ImageMagick-djvu-6.8.5-10.x86_64.rpm
-rw-rw-r--. 1 rpmdevel rpmdevel 6303922  67 05:07 2013 ImageMagick-doc-6.8.5-10.x86_64.rpm
-rw-rw-r--. 1 rpmdevel rpmdevel  295303  67 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 を無効にした ImageMagickRPM ファイルの作成は完了です。

参考サイト

PerlMagick が OpenMP 有効だと高負荷になる件 :: drk7jp
http://www.drk7.jp/MT/archives/001841.html

ImageMagickOpenMPは並列実行で悪影響するのは本当だった - treeのメモ帳
http://treeapps.hatenablog.com/entry/2013/03/30/170058

ImageMagickOpenMPの件 - blog.nomadscafe.jp
http://blog.nomadscafe.jp/2011/12/imagemagickopenmp.html