動かざることバグの如し

近づきたいよ 君の理想に

Ubuntuで最新版libvipsをビルドする

環境

  • 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)'
  1. ビルドしてインストールする
cd build
meson compile
sudo meson install
sudo ldconfig

meson compileはCPUのコア数ぶん勝手に並列化してくれる。手元の環境では数分で終わった。

ldconfigを忘れると/usr/local/libに入った共有ライブラリがリンカのキャッシュに載らず、実行時にlibvips.so.42: cannot open shared object fileで落ちるので必ず実行する。

  1. 動作確認

まずバイナリとバージョンを見る。

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で別のパスが優先されている。

参考リンク