mozjpeg ビルド手順 on linux (新旧)

何番煎じかも分かりませんが、新しい方法と前の方法とでビルド方法が違うことに気付いたので執筆。

# mozjpeg について

mozjpeg は、mozilla によって開発されている JPEG エンコーダです。圧縮効率が良いことで知られています。

Web から利用することができ、これが最も手軽な方法ではあります。ただ、それだと都合が悪いこともあります。(オンラインに上げたくないとか、サイズ制限にかかるとか、スクリプトで大量処理したいとか。) そういった場合、自力でビルドする必要があります。

mozjpeg は、バージョン 3 以前と 4 以降とではビルド方法が異なりますので、それぞれのビルド方法をまとめておきます。

::: note warn
ここでは Linux (64bit) 環境でのビルド手順を示します。Linux Mint 20.3 で動作確認できたコマンドを記載しています。
:::

::: note
余談: ビルド方法の変更を知らずに最新バージョンがビルドできず、仕方なく旧バージョンを使っていた時期が、私にはありました。用意されているマニュアルにまともに向き合いましょう。英語と和解しましょう。
:::

基本的には、リポジトリの `BUILDING.md` に書かれているように進めていきます。他の環境でのビルド方法や、その他詳細なオプション等については、以下の原文を参照してください。

https://github.com/mozilla/mozjpeg/blob/master/BUILDING.md

# ビルド

## 3.3.1 以前

autotools を使う方法です。

```sh
# 必要なパッケージをインストール
# ※ パッケージマネージャに応じて "apt" は変更
sudo apt install autoconf automake libtool nasm make

# ソースをダウンロードして展開
## ここでは v3.3.1 を使用
## ブラウザで GitHub から DL して展開してもヨシ
wget -O - https://github.com/mozilla/mozjpeg/archive/refs/tags/v3.3.1.tar.gz | tar -xzv -C ./
cd mozjpeg-3.3.1

# 任意でビルド用ディレクトリを作成
mkdir build && cd build

# autotools でビルド
autoreconf -ifv ../
../configure
## ビルド用ディレクトリを作成していないときは
##   autoreconf -ifv ./
##   ./configure
make -j5 #注
```

:::note
`make` の引数 `-j5` は、ビルド処理の並列実行数の指定です。フルパワーでやるには、「スレッド数+1」を指定すると良いとか。
:::

## 4 以降

新バージョンでは、cmake を使う方法に変わっています。

```sh
# 必要なパッケージをインストール
# ※ パッケージマネージャに応じて "apt" は変更
sudo apt install cmake nasm make

# ソースをダウンロードして展開
## ここでは v4.1.1 を使用
## ブラウザで GitHub から DL して展開してもヨシ
wget -O - https://github.com/mozilla/mozjpeg/archive/refs/tags/v4.1.1.tar.gz | tar -xzv -C ./
cd mozjpeg-4.1.1

# 任意でビルド用ディレクトリを作成
mkdir build && cd build

# cmake でビルド
cmake -G"Unix Makefiles" ../
## ビルド用ディレクトリを作成していないときは
##   cmake -G"Unix Makefiles" ./
make -j5 #注 (同上)
```

## PNG サポートについて

cjpeg にて、PNG 画像を読み込めるようになるオプションがあるようです。

このオプションはデフォルトで ON になっていますが、環境によっては PNG ライブラリが無く、ビルドできない原因になることもあります。

対処としては、「PNG ライブラリのインストール」または「オプション OFF」になります。

### オプション ON (PNG ライブラリのインストール)

`cmake` 実行前に、以下のコマンドでライブラリをインストールします。

```sh
# PNG ライブラリをインストール
# ※ ディストリビューションによってパッケージ名が異なる可能性があるので注意
sudo apt install libpng-dev
```

### オプション OFF

`cmake` 実行時にオプションを追加します。

```sh
cmake -G"Unix Makefiles" -DPNG_SUPPORTED=0 ../
## ビルド用ディレクトリを作成していないときは
##   cmake -G"Unix Makefiles" -DPNG_SUPPORTED=0 ./
```

# インストール (新旧共通)

## APT (DEB パッケージ) を通す方法

```sh
# ※ 環境やバージョンにより、生成されるパッケージ名が異なる可能性があるので注意
make deb
sudo apt install ./mozjpeg_{version}_amd64.deb

# アンインストールするには
sudo apt remove mozjpeg
```

同様にして、`rpm` パッケージも可能。

## `/opt` に直接配置する方法

```sh
sudo make install/local
```

## パスを通す

上記の方法では、`/opt` ディレクトリに実行ファイルなどが収められます。

`/opt` ディレクトリはパスが通っていないため、標準コマンドのようにすぐ利用することができません。どこでもコマンドとして呼び出せるようにするには、追加で以下の手順を進めます。

```sh
# ビルドを行ったディレクトリをカレントにする

# パスを通す
cd /opt/mozjpeg/bin
for f in *; do
  ln -s /opt/mozjpeg/bin/$f /usr/local/bin/moz$f
done
```

以上の手順を行い、端末で以下を実行し、バージョンが出てくれば成功です。

```sh
mozcjpeg -version
```

::: note
mozjpeg には、`cjpeg` だけでなく、`jpegtran` や `djpeg` など、jpeg 処理に関するいくつかのプログラムがまとまっています。それら全部のパスを通すため、上ではループをまわして処理をしています。
:::

# mozjpeg 補足

(Linux Mint では) デフォルトで `cjpeg` や `jpegtran` といったコマンドがあります。これらは、libjpeg-turbo によって提供されているものです。

mozjpeg は libjpeg-turbo をベースに作成されたもので、ビルドで得られる実行ファイルも、`cjpeg` など同じ名前です。これをこのままパスに追加すると、libjpeg か mozjpeg か分からなくなってしまいます。

そこで、上ではリンクを `moz...` という名前にし、libjpeg-turbo と mozjpeg の実行ファイルを区別することにしています。

# 更新履歴

\[2022/12/12\]
PNG サポート, DEB パッケージ, mozjpeg 補足の項を追記