メモ:JpegoptimをWindowsでビルド

/ Windows

JpegoptimにはWindowsバイナリが用意されていないようなのでビルドした。いくつかコケたポイントをメモしておく。

使用したものなど

  • Build Tools for Visual Studio 2019
  • jpegoptim-RELEASE.1.4.6
  • libjpeg-turbo-2.0.4
  • msdirent.h

Build Tools for Visual Studio 2019

Windowsで何かのプログラムを始めてビルドする場合は

https://visualstudio.microsoft.com/ja/downloads/

からBuild Tools for Visual Studio 2019をインストールする。特に"Windows用 C++ CMakeツール"にチェックにチェックが入っていることに注意する。

"C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\Common7\Tools\VsDevCmd.bat"

を適当なコマンドから呼び出してコンパイラ・リンカなどが使える用にする。cl /?が動けばOK。

jpegoptimのソース

https://github.com/tjko/jpegoptim/releasesから最新をダウンロードして展開する。例としてCmderにバンドルされているtarコマンドで展開できる。

tar zxvf jpegoptim-RELEASE.1.4.6.tar.gz
cd jpegoptim-RELEASE.1.4.6

ここでは展開されたディレクトリに移動している。

libjpeg-turboのビルド

jpegoptimはlibjpeg-turboに依存している。正確にはlibjpegに依存しているがlibjpeg-turboはlibjpegを含んでいるのでこれを使う。

https://libjpeg-turbo.org/のDownloadsからソースをダウンロードして展開する。現時点の最新バージョンは2.0.4だった。

tar zxvf libjpeg-turbo-2.0.4.tar.gz
cd libjpeg-turbo-2.0.4

ここでは展開されたjpegoptim-RELEASE.1.4.6ディレクトリの中でlibjpeg-turbo-2.0.4を展開してさらに移動しているとする。次のコマンドでlibjpeg-turbo-2.0.4をビルドする。

cmake -G"NMake Makefiles" ^
-DCMAKE_BUILD_TYPE=Release ^
-DENABLE_STATIC=ON .
nmake

^は長いコマンドを複数行に分けるためのもの。Linuxだとバックスラッシュ\だがWindows/cmdだと^らしい。

cmakeしたときにSIMD extensions disabled: could not find nasm compiler. performance will suffer.というメッセージが出た場合はそれが気になるならnasmコンパイラにpathを通すことで解決する。

このビルドにはそこそこ時間がかかるが特に警告等出ずに終了する。この時点でmozjpeg系のコマンドは使用できるのでjpegoptimではなく直接cjpegやjpegtranを使っても良い。生成されたexeファイルをdirコマンドで表示すると以下

cjpeg-static.exe
cjpeg.exe
djpeg-static.exe
djpeg.exe
jcstest.exe
jpegtran-static.exe
jpegtran.exe
rdjpgcom.exe
tjbench-static.exe
tjbench.exe
tjexample.exe
tjunittest-static.exe
tjunittest.exe
wrjpgcom.exe

さらにjpegoptimのビルドに使うためのライブラリが生成される。

jpeg-static.lib
jpeg.lib
turbojpeg-static.lib
turbojpeg.lib

jpeg62.dll
turbojpeg.dll

例えばcjpegのバージョン情報を表示するとcmakeしたときに指定できるビルド情報が表示される。デフォルトでは単に日付となっている。

cjpeg -version
libjpeg-turbo version 2.0.4 (build 20200618)

-staticとついている方のexeは単体でどこにもっていっても動くが、そうでないものは同フォルダ内のdllと一緒にもっていかないと動かないことに注意する。同じくlibにもスタティックリンクライブラリと、dllに関連付けられたライブラリがあり、jpeg-staticを使ってビルドしたjpegoptimは単体でどこにもっていっても動くがjpeg.libを使ったものはjpeg62.dllと一緒にもっていかないと動かない。以下ではjpeg-static.libを使う。

jpegoptimのビルド

libjpeg-turboをビルドしたらもとのディレクトリに戻る。

cd ..

今jpegoptim-RELEASE.1.4.6ディレクトリにいる想定。ここで、普通にやるとdirent.hが見つからなくてコケるので予めここからmsdirent.hをダウンロードしてリネームしておく。もしくは

curl -o dirent.h http://svn.apache.org/repos/asf/avro/trunk/lang/c/tests/msdirent.h

を直接入力してもよい。これでjpegoptim-RELEASE.1.4.6/dirent.hに上記URLの内容がダウンロードされた。

dirent.hはPOSIXシステム(LinuxとかUnix)にある関数のためのヘッダで、VS2019ビルドツールでは用意されていない。しかし同等の関数自体はWindows APIの中にあるようだ。だからこのmsdirent.hはうまくPOSIXのdirent.hを利用するコードをWindows APIの中の当該関数にJointしている。従ってリンク時に特に何かライブラリ(.lib)を追加で指定する必要は無いようだ。

あとは以下のコマンドでビルドできる。

cmake -G"NMake Makefiles" ^
-DCMAKE_BUILD_TYPE=Release ^
-DLIBJPEG_INCLUDE_DIR=libjpeg-turbo-2.0.4\ ^
-DLIBJPEG_LIBRARY_DIR=libjpeg-turbo-2.0.4\jpeg-static.lib .
nmake

今度はいろいろな警告がでるがビルド自体は成功する。以下のようにjpegoptim --versionで以下のように表示されれば成功だ。Windowsにおいて普通の方法でjpegoptimを使うことが出来る。

jpegoptim v1.4.6  Win32
Copyright (C) 1996-2018, Timo Kokkonen

This program comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistirbute it under certain conditions.
See the GNU General Public License for more details.

libjpeg version: 6b  27-Mar-1998
Copyright (C) 1991-2019 The libjpeg-turbo Project and many others

番外:Linuxにおけるビルド

Windowsにおけるビルドに何の役にも立たないけどやたらとネット上の情報が多いLinuxにおけるビルド方法もメモしておく。ディレクトリ構造はまったく同じ。違うところはcmakeのgeneratorにUnix Makefilesを使うところとjpegoptimのビルドでconfigureスクリプトを使えるところ。

今jpegoptim-RELEASE.1.4.6内にいるとする。

cd libjpeg-turbo-2.0.4
cmake -G"Unix Makefiles" \
-DCMAKE_BUILD_TYPE=Release \
-DENABLE_STATIC=ON \
-DASM_NASM=path-to-nasm .
make
cd ..
./configure --with-libjpeg=libjpeg-turbo-2.0.4
make

ここでのLinuxはVPS想定だ。何かをインストールする権限はない。従ってnasmコンパイラは自分で落としたバイナリを指定する。また--with-libjpegで自前のlibjpegを指定しているのも同じ理由だ。普通のLinuxではlibjpeg-devがインストールされていれば必要が無い。もともとLinux向きの方法なのでgccが入ってれば何の文句も無くビルド完了する。

番外2:Cannot find libjpeg or you have too old version.

Windowsの場合Cmderにバンドルされたshでconfigureスクリプトを動かしても何故か--with-libjpegを認識してもらえなかったのでやめた。CMakeLists.txt入っていたのでおとなしくcmakeでやった。

まず最初にchecking build system typeで失敗するのでtools/config.guessを最新のもので上書きする必要がある。これには警告メッセージにあるURLから普通に最新のものを落としてきて上書きすればよい。そのあと

Cannot find libjpeg or you have too old version (v6 or later required).

が出てどうやら--with-libjpegが認識されない。LIBSを指定すると先には進む。

sh ./configure LIBS=libjpeg-turbo-2.0.4\jpeg-static.lib
--中略--
Cannot find jpeglib.h  You need libjpeg v6 (or later).

そういうことなのでCFLAGSでインクルードディレクトリを指定してみる。

sh ./configure LIBS=libjpeg-turbo-2.0.4\jpeg-static.lib CFLAGS="-Ilibjpeg-turbo-2.0.4/ -I./"

これでMakefileは生成された。しかし失敗。深追いは禁物。

まとめ

Windowsで.tar.gzとかついてるやつをビルドするのはいばらの道です。

あとjpegoptimとmozjpegを比較しているのを見たことあるけどjpegoptimが普通のlibjpegでなくlibjpeg-turboをこんな風に使っていたらナンセンスだよなぁ。mozjpegもjpegoptimも中ではlibjpeg-turboを使っているから。というよりmozjpegはlibjpeg-turboそのもの。