トップ 検索 一覧 ヘルプ RSS ログイン

今更MinGW 2009.06(6) zlib,libjpeg,libpngの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!今更MinGW 2009.06(6) zlib,libjpeg,libpng

非常に良く使用されるライブラリのzlib, libjpeg, libpngをビルド・インストールする。

zlib, libjpeg, libpngは全て[mingwPORT|http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=233332](詳細は今更MinGW2008年春版の[[今更MinGW(2)]]を参照)という仕組みが用意されており、簡単にMinGW環境に組み込めるようになっている。しかし、猫研パックでは質問項目を省略するためzlibのパッチのみを使用し、通常の手順でビルドする。また、libjepgのmingwPORTはIJGのオリジナル向けのもので、libpngはバージョンが1.2.8と古いこともmingwPORTを使用しない理由である。
zlib, libjpeg, libpngは全て[mingwPORT|http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=233332](詳細は今更MinGW2008年春版の[[今更MinGW(2)]]を参照)という仕組みが用意されており、簡単にMinGW環境に組み込めるようになっている。しかし、猫研パックでは質問項目を省略するためzlibのパッチのみを使用し、通常の手順でビルドする。また、libjepgのmingwPORTはIJGのオリジナル(後述)向けのもので、libpngはバージョンが1.2.8と古いこともmingwPORTを使用しない理由である。

なお、ここではlibjpegにx86の''SIMDを利用して高速化されているバージョン''を使用する。当該サイトの説明を読めばわかるが、基本的にオリジナルのlibjpegと同様に扱え、かつ一部のケースでは精度が向上するなど、''機能的にも改良されている''。オリジナルのlibjpegは[Independent JPEG Group|http://www.ijg.org/]だ。

!!ソースの入手

以下のソースアーカイブを入手し、/src以下に展開しよう。

*[zlib Home Site|http://www.zlib.net/]
**http://www.zlib.net/zlib-1.2.3.tar.gz
*[User Contributed: mingwPORT|http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=233332] / [Current Releases|http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=233332&release_id=511579]
**[zlib-1.2.3-mingwPORT-1.tar.bz2|http://sourceforge.net/project/downloading.php?group_id=2435&filename=zlib-1.2.3-mingwPORT-1.tar.bz2]
*[Independent JPEG Group's JPEG software release 6b with x86 SIMD extension for IJG JPEG library version 1.02|http://cetus.sakura.ne.jp/softlab/jpeg-x86simd/jpegsimd.html]
**http://cetus.sakura.ne.jp/softlab/jpeg-x86simd/sources/jpegsrc-6b-x86simd-1.02.tar.bz2
*[libpng Home Page|http://www.libpng.org/pub/png/libpng.html]
**http://prdownloads.sourceforge.net/libpng/libpng-1.2.37.tar.bz2?download

''libpngはまだ枯れているとは言い難く''、よくセキュリティ関連で更新が行われるので、上記のバージョンにこだわらず''最新版を使用したほうがよい''。

各ソースアーカイブは/srcに展開しよう。

!パッケージの説明

簡単に。

::zlib
:::言わずと知れた、データの圧縮・展開ライブラリ。
:::''一見圧縮とは関係のないソフトウェアにも必要とされる''ので必須と言っていい。
::libjpeg
:::JPEGの圧縮・展開ライブラリ。
:::静止画を扱うソフトウェアでJPEGがサポートされないケースはほとんど無いので、
:::これも高頻度に利用される。
:::なお、オリジナルのlibjpegは[Independent JPEG Group|http://www.ijg.org/]であるが、ここではx86の''SIMDを利用して高速化されているバージョン''を使用する。
:::当該サイトの説明を読めばわかるが、基本的にオリジナルのlibjpegと同様に扱え、
:::かつ一部のケースでは精度が向上するなど、''機能的にも改良されている''。
::libpng
:::GIFのLZW特許問題が発生してから代替として開発されたPNG形式を扱うライブラリ。
:::その後Unisys社の特許は有効期限が切れたものと見なされているが、
:::単なるGIFのリプレースではなく''24bit色やαチャンネルが扱える''など、
:::可逆圧縮画像形式として優れているため、GIFと同様、広範に利用されている。

!!ビルド

いずれも、若干の特別な手順が入る。

!zlib

アセンブラ使用のバージョンでビルドするため、mingwPORTのパッチ当て後にcontrib/asm686/match.S(アセンブラソース)をトップディレクトリにコピーし、makeコマンドへのパラーメータをそれに応じたものとする。

 pushd /src/zlib-1.2.3
 patch -p1 -N < mingwPORT/mingwPORT.patch
 cp -f contrib/asm686/match.S .
 make -f win32/Makefile.gcc LOC=-DASMV OBJA=match.o CFLAGS="-O3 -s -mms-bitfields -march=i686"
 make -f win32/Makefile.gcc install prefix=/mingw
 popd

なお、このままではzlibを使用する際に、.DLLへのリンクが優先されるようになる。猫研パックではstaticリンクを是としているので、以下のように.DLL向けのライブラリをリネームし、待避させる。

 pushd /mingw/lib
 mv -f libz.dll.a libz.dll.a.esc
 mv -f libzdll.a libzdll.a.esc
 popd

もちろん好みで.DLL版を使用しても構わないが、猫科研究所の記事は全てstatic版で記載しているので注意。

!libjpeg

libjpegはSIMD命令による高速化版を使用するため、mingwPORTは使用できない。また、Windows上のビルドでは''MSYSではなくコマンドプロンプトでのビルドが想定されている''ため、MSYSで使用するためにはmakefile.mgwを変更する必要がある。

具体的には、まずnasm'''w'''を用意していない場合、25行目でnasmwを使用している箇所をnasmに変更する必要がある。そして49行目でRMをdelコマンドに割り当てているのでrmに変更する。そして179行目でmakecfg.exeの起動が.\makecfg.exeとWindows流の表記になっているので./makecfg.exeに書き換える。なお、猫研パックではこの修正はパッチを用意しており、そちらで行う。

ビルド手順は以下の通り。
 pushd jpeg-6bx
 cp -f jconfig.mgw jconfig.h
 cp -f makefile.mgw Makefile
 make
 cp -f libjpeg.a /mingw/lib
 cp -f jpeglib.h /mingw/include
 cp -f jerror.h /mingw/include
 cp -f jconfig.h /mingw/include
 cp -f jmorecfg.h /mingw/include
 popd

MSYSを使用しない前提であるためmake installもない。このため手動(cp)で導入している。

!libpng

インストール時のエラーを修正するためにperlで簡単なパッチを当てる以外は、普通にビルドできる。

 pushd libpng-1.2.37
 perl -pe 's:^\tinstall:\t/bin/install:' scripts/makefile.mingw > makefile
 make prefix=/mingw
 make install prefix=/mingw
 popd

また、zlibと同様に.DLLではなくstaticライブラリへのリンクを常用にするため以下のようにエスケープする。

 pushd /mingw/lib/
 mv -f libpng.dll.a libpng.dll.a.esc
 mv -f libpng12.dll.a libpng12.dll.a.esc
 popd

なお、libpngはzlibに依存しており、zlibより先にビルドを行うことはできないので注意。PNG形式は隣接ピクセルとの差分を取った上でDeflateをかけ、圧縮効率を高められるようになっている。