FuseCompressのMandriva Linux向け自作RPMパッケージのその後(2009/7/2現在)
boostのバージョンの関係でディストリのバージョンをまたいで使い回せない
以前「透過的な圧縮機能を提供し複数の圧縮方式に対応したFuseCompressについて(概要とディストリのパッケージ)」で(Mandriva Linux 2009.1上で)作成したFuseCompressのパッケージを2009.0上でインストールしようとしたのだが$ sudo urpmi [fusecompress-2.5-1kkr2009.1.x86_64.rpmの場所] インストールできないパッケージがあります: fusecompress-2.5-1kkr2009.1.x86_64 (libboost_program_options-mt.so.1.38.0()(64bit) が依存を満たしていないために) このままインストールを続けますか? (Y/n)[デフォルトはY]
のようになった。ここの操作に関わらずインストールはできない。
2009.1向けのパッケージを作成したときに(2009.1上で用意されている)boostライブラリのバージョンが1.38.0だったのでそのバージョンを依存パッケージとして指定していたのだが、2009.0にあるバージョンは異なるためそのままでは入らず、逆に2009.0上でビルドしたものも2009.1上では使用できない。
.specファイル上の依存パッケージ記述を改善
以前、.specファイル上での依存パッケージに「%mklibname boost 1.38.0」のように指定していたが、これの代わりに「libboost」という名前で依存パッケージ名を記述することにより- lib64boost1.36.0
- lib64boost1.35.0
- lib64boost1.34.1
のように複数あるバージョンの内のいずれかが使用されることが分かった。
Requires: libboost >= 1.33.1 (中略) zlib1
しかし、実際の動的リンクは
$ ldd [fusecompressの場所] | grep boost libboost_serialization-mt.so.1.38.0 => not found libboost_iostreams-mt.so.1.38.0 => not found libboost_program_options-mt.so.1.38.0 => not found
バージョン番号を含んだ共有ライブラリに対して行われるため、この場合は1.38.0のバージョンがインストールされている必要がある。とは言え、.specファイル側で「%mklibname boost 1.38.0」のようなバージョン番号込みのパッケージ名を記述するよりも多少メンテナンスはしやすい。
しかし残念なことに、Mandriva Linux 2009.0と2009.1で共通のboostのバージョンは存在しないため、どちらかでビルドしたパッケージをもう一方で再利用することは結局のところできない。
(2009/11/17)動的リンクされるライブラリの依存関係は自動的にチェックされ、RPMパッケージに情報が書き込まれるため.specファイルにライブラリの依存を(Requiresに)記述する必要はないことが分かり、これまでに作成した他のパッケージも含め、不必要に書き込んでいた「Requires」の指定も削除した。
LZMAサポートは2009.0上でも有効にできず
LZMAサポートについては、LZMAのライブラリ(XZ Utils)は2009.0上の4.999.3-0.alpha3.3mdv2009.0というバージョンでmake all-recursive make[1]: Entering directory `/home/mandrake/rpm/BUILD/tex-fusecompress-ae67acae857c3948568505c362facc3c9c81edd4' Making all in src make[2]: Entering directory `/home/mandrake/rpm/BUILD/tex-fusecompress-ae67acae857c3948568505c362facc3c9c81edd4/src' g++ -DHAVE_CONFIG_H -I. -I.. -D_GNU_SOURCE -D_REENTRANT -D_POSIX_C_SOURCE=200112L -D_POSIX_SOURCE -D_SVID_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=500 -pedantic -Wno-long-long -Wall -fpermissive -D_FILE_OFFSET_BITS=64 -DFUSE_USE_VERSION=26 -DNDEBUG -DRLOG_COMPONENT="fusecompress" -O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -MT lzma.o -MD -MP -MF .deps/lzma.Tpo -c -o lzma.o `test -f 'boost/iostreams/filter/lzma.cpp' || echo './'`boost/iostreams/filter/lzma.cpp In file included from /usr/include/lzma.h:93, from ./boost/iostreams/filter/lzma.hpp:17, from boost/iostreams/filter/lzma.cpp:23: /usr/include/lzma/base.h:318: error: expected ‘;’ before ‘*’ token /usr/include/lzma/base.h:320: error: ‘uint64_t’ does not name a type /usr/include/lzma/base.h:322: error: expected ‘;’ before ‘*’ token /usr/include/lzma/base.h:324: error: ‘uint64_t’ does not name a type In file included from /usr/include/lzma.h:94, from ./boost/iostreams/filter/lzma.hpp:17, from boost/iostreams/filter/lzma.cpp:23: /usr/include/lzma/vli.h:58: error: ‘uint64_t’ does not name a type /usr/include/lzma/vli.h:179: error: ‘lzma_vli’ was not declared in this scope /usr/include/lzma/vli.h:179: error: expected primary-expression before ‘*’ token /usr/include/lzma/vli.h:179: error: expected primary-expression before ‘__restrict__’ /usr/include/lzma/vli.h:179: error: expected primary-expression before ‘vli_size’ /usr/include/lzma/vli.h:180: error: ‘uint8_t’ was not declared in this scope /usr/include/lzma/vli.h:180: error: expected primary-expression before ‘__restrict__’ /usr/include/lzma/vli.h:180: error: expected primary-expression before ‘*’ token /usr/include/lzma/vli.h:180: error: expected primary-expression before ‘__restrict__’ /usr/include/lzma/vli.h:181: error: expected primary-expression before ‘out_size’ /usr/include/lzma/vli.h:205: error: ‘lzma_vli’ was not declared in this scope (中略) boost/iostreams/filter/lzma.cpp:102: error: ‘struct lzma_stream’ has no member named ‘next_in’ boost/iostreams/filter/lzma.cpp:103: error: ‘struct lzma_stream’ has no member named ‘next_out’ boost/iostreams/filter/lzma.cpp: In member function ‘void boost::iostreams::detail::lzma_base::do_init(const boost::iostreams::lzma_params&, bool, void* (*)(void*, size_t, size_t), void (*)(void*, void*), void*)’: boost/iostreams/filter/lzma.cpp:138: error: ‘lzma_easy_encoder’ was not declared in this scope boost/iostreams/filter/lzma.cpp:139: warning: invalid conversion from ‘int’ to ‘lzma_extra**’ make[2]: *** [lzma.o] Error 1 make[2]: Leaving directory `/home/mandrake/rpm/BUILD/tex-fusecompress-ae67acae857c3948568505c362facc3c9c81edd4/src' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/home/mandrake/rpm/BUILD/tex-fusecompress-ae67acae857c3948568505c362facc3c9c81edd4' make: *** [all] Error 2
エラー内容は異なるものの、結果としてはビルドに失敗したため、LZMAサポートはいずれにしても無効にする必要があった。*1
また、LZMAライブラリのバージョン4.999.3と4.999.5の間にデータの互換性がなく、片方のバージョンで書き込んだデータはもう一方では読み込めないということが知られているため、仮にビルドができたとしても、少なくともライブラリのバージョンが正式版になるまではLZMAの使用はおすすめしない。*2
Mandriva Linux 2009.0向けパッケージを作成
というわけで、Mandriva Linux 2009.0上で(LZMAサポートを無効にして)ビルドしたFuseCompressのRPMパッケージを別館の配布ページに公開した。(2014/10/12)配布ページは削除済み。
使用したバージョン:
- FuseCompress 2.5, 2.6
- XZ Utils(liblzma) 4.999.3
- boost 1.36.0