環境
- Ubuntu 24.04
やりたいこと
Railsで画像処理といえば長らくImageMagickだったが、最近はlibvipsのほうがいいらしい。メモリ使用量が桁違いに少なく、処理速度も速い。実際Rails 7以降はActive Storageのvariant processorのデフォルトが:vipsになっている。
というわけでUbuntu 24.04にaptで入れてみたのだが、降ってきたのは8.15系だった。本家のほうはとっくに先に進んでいる。Ubuntuのパッケージはリリース時点のバージョンで基本的に固定されるので、待っていても新しいものは降ってこない。
新しめのフォーマット対応やバグ修正が欲しいので、諦めて自分でビルドすることにした。以下その作業メモ。
手順
今回はJPEG/PNG/WEBP/HEICの画像フォーマットにのみ対応し、PDFやImageMagick連携は明示的に無効化してビルドする。
ビルドツールと依存ライブラリを入れる。libvipsのビルドはautotoolsではなくMesonを使う。ビルドツール一式と、対応させたいフォーマットのデコーダ/エンコーダをまとめて入れる。
sudo apt update sudo apt install -y \ meson ninja-build pkg-config \ libglib2.0-dev libexpat1-dev \ libjpeg-turbo8-dev libpng-dev libwebp-dev libheif-dev
ここで入れる-devパッケージがそのまま対応フォーマットになる。HEIC対応がいらないならlibheif-devを外せばいい(後述の-Dheifも合わせてdisabledにする)。
入ったかどうかはpkg-configで見るのが早い。
pkg-config --modversion glib-2.0 libjpeg libpng libwebp libheif
すべてバージョン番号が返ればOK。Package xxx was not foundが出たらそのライブラリの-devが入っていない。
ソースを取得する
cd /tmp git clone --depth 1 https://github.com/libvips/libvips.git cd libvips
--depth 1なのでmasterの最新が落ちてくる。安定版を狙うなら--branch v8.15.5のようにタグを指定したほうが無難。
ビルド設定を作る
冒頭に書いたとおり、使うフォーマットだけenabledにして残りは全部disabledにする。とくにmagickを有効のままにするとImageMagickを丸ごと引っ張ってきてlibvipsを使う意味が薄れるので、明示的に切っておく。
meson setup build \ --prefix=/usr/local \ --libdir=lib \ --buildtype=release \ -Djpeg=enabled \ -Dpng=enabled \ -Dnsgif=true \ -Dcgif=enabled \ -Dheif=enabled \ -Dwebp=enabled \ -Dmagick=disabled \ -Drsvg=disabled \ -Dpoppler=disabled \ -Dpdfium=disabled \ -Dtiff=disabled \ -Dopenexr=disabled \ -Dopenslide=disabled \ -Dmatio=disabled \ -Darchive=disabled \ -Dcfitsio=disabled \ -Dimagequant=disabled \ -Dlcms=disabled
enabledを指定した項目は、依存ライブラリが見つからないとその場でエラーになる(autoと違って黙って無効化されない)。なので、ここが通った時点で1.の依存関係は正しく揃っていることになる。
meson setupの最後に出るサマリで、意図した組み合わせになっているか確認しておく。
meson configure build | grep -E '^\s+(jpeg|png|webp|heif|magick|pdfium|poppler)'
- ビルドしてインストールする
cd build meson compile sudo meson install sudo ldconfig
meson compileはCPUのコア数ぶん勝手に並列化してくれる。手元の環境では数分で終わった。
ldconfigを忘れると/usr/local/libに入った共有ライブラリがリンカのキャッシュに載らず、実行時にlibvips.so.42: cannot open shared object fileで落ちるので必ず実行する。
- 動作確認
まずバイナリとバージョンを見る。
which vips vips --version
/usr/local/bin/vipsが返り、apt版より新しいバージョンが表示されていれば成功。/usr/bin/vipsが返る場合はapt版のlibvips-toolsが残って優先されているので、sudo apt remove libvips-toolsしておく。
共有ライブラリの解決先も確認しておく。
ldconfig -p | grep libvips
ビルドオプションが期待どおり効いているかは--vips-configで見られる。
vips --vips-config
対応フォーマットは、ローダ/セーバの一覧を引くのが確実。
vips -l | grep -E 'load|save' | grep -E 'jpeg|png|webp|heif'
JPEG/PNG/WebP/HEICそれぞれに*loadと*saveが並んでいればよい。ついでに実際に変換をかけてみる。
vips copy input.jpg output.webp vips copy input.jpg output.heic
最後にRails側から。ruby-vipsが新しいほうを掴んでいるか確認する。
ruby -e "require 'vips'; puts Vips::LIBRARY_VERSION"
ここでapt版のバージョンが出る場合は、ldconfigが効いていないか、LD_LIBRARY_PATHで別のパスが優先されている。