試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

FuseCompressのMandriva Linux向け自作RPMパッケージのその後(2009/7/2現在)

  1. boostのバージョンの関係でディストリのバージョンをまたいで使い回せない
    1. .specファイル上の依存パッケージ記述を改善
  2. LZMAサポートは2009.0上でも有効にできず
  3. Mandriva Linux 2009.0向けパッケージを作成

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サポートを無効にして)ビルドしたFuseCompressRPMパッケージを別館の配布ページに公開した。
(2014/10/12)配布ページは削除済み。

使用したバージョン:

  • FuseCompress 2.5, 2.6
  • XZ Utils(liblzma) 4.999.3
  • boost 1.36.0

*1:最新のソース(バージョン2.6・2009/5/3付け)でも同じようになるが、XZ Utilsのバージョンは4.999.5以上を要求しているので、4.999.3では恐らくダメ

*2:XZ Utilsの2009年7月現在の最新版は4.999.8beta