MacPortsのバイナリダウンロードはビルドした時と違うファイルになる場合があるっぽい

MacPortsで入れたgroongaに依存するnodeのnroongaを入れようとしてはまっています。その中でMacPortsのバイナリダウンロードにちょっと問題点がある気がしたのでメモです。

バイナリをダウンロードするとリンクされないライブラリがあるっぽい

バイナリダウンロードport install -b groonga*1
$ otool -L /opt/local/bin/groonga
/opt/local/bin/groonga:
	/opt/local/lib/libgroonga.0.dylib (compatibility version 1.0.0, current version 1.0.0)
	/opt/local/lib/libmsgpack.3.dylib (compatibility version 4.0.0, current version 4.0.0)
	/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
ソースダウンロード & ビルドport install -s groonga
$ otool -L /opt/local/bin/groonga
/opt/local/bin/groonga:
	/opt/local/lib/libgroonga.0.dylib (compatibility version 1.0.0, current version 1.0.0)
	/opt/local/lib/libedit.0.dylib (compatibility version 1.0.0, current version 1.41.0)
	/opt/local/lib/libncurses.5.dylib (compatibility version 5.0.0, current version 5.0.0)
	/opt/local/lib/libmsgpack.3.dylib (compatibility version 4.0.0, current version 4.0.0)
	/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)

試行錯誤の最中だったので、色々とライブラリの有無はあったけど、ある時点においてライブラリ等の環境が同じ状態で、バイナリダウンロードとソースダウンロードで、リンクするライブラリに違いが出ました。

詳細な状況や疑問点など

MacPortsの仕組みのあまり詳しくないので、色々と推測の域を出ない部分が多いです。

$ port info groonga
groonga @2.0.8 (databases)
Variants:             universal

[Snip]

Build Dependencies:   pkgconfig
Library Dependencies: glib2, mecab-utf8, libevent, zmq22, msgpack
[Snip]

まず、インストールしようとしているportはgroongaです。groongaはBuild DependenciesとLibrary Dependenciesの2種類の依存関係を持っています。

groongaを入れても依存しているpkgconfigが入ってなかった。

Requirements:

  • groonga built with MessagePack support
  • pkg-config
GitHub - nroonga/nroonga: A library for building Groonga powered nodes

nroongaではまっているうちに、nroongaのRequirementsにpkg-configがある事に気がつきました。でも、MacPortsでも入れてないし、pkg-configコマンドが無かったので、別の方法ででも入ってなかったみたい。MacPortsのgroongaは、前述の通りBuild Dependenciesでpkgconfigに依存しているのに、入っていません。

以下はあるとよいツールです:

  • pkg-config (ライブラリを検出するため)
  • sudo (ビルドしたgroongaをインストールするため)

追加のライブラリを使いたい場合はこれらのツールを用意しておかなければいけません。

http://groonga.org/ja/docs/install/others.html#dependencies

groongaのドキュメントにはこの様に書いてあって、どうやら必須という訳じゃない様子。だとすると、pkgconfigが依存解決でインストールされないのは、動作としては間違ってない事になります。ただ、MacPortsの依存関係が、こういう形を許すものなのかどうか、あまり詳しくない事もあって疑問が残ります。

ちなみに、Build DependenciesとLibrary Dependenciesは、MacPortsのドキュメントにこんな説明がありました。

  • Build Dependencies

The list of dependencies to check before phases configure, build, destroot, install, and package. Build dependencies are needed when software is being built, but not needed at all once it is installed.

5.4. Dependencies
  • Library Dependencies

The list of dependencies to check before phases configure, build, destroot, install, and package. Library dependencies are needed both at build time (for headers and libraries to link against) and at run time.

5.4. Dependencies
バイナリダウンロードとソースダウンロード

もし依存関係が必須のものしかないなら、ビルド済みのものをダウンロードしても問題はなさそうです。でも、上で確認した様に、どうも依存関係はインストールしてあれば使うけど無ければ使わないし依存解決で入れたりもしないというのも、あり得る様子。そうすると、ライブラリのインストール状況によって、生成されるべきバイナリは違うものになるはず。

$ man port
[Snip]
     -s       source-only mode (build and install from source, do not attempt to fetch binary archives)

     -b       binary-only mode (build and install from binary archives, ignore source, abort if no archive available)
[Snip]

何度アンインストールとインストールを繰り返してもバイナリダウンロードになるので、試しに-sオプションで、ソースダウンロードを強制してみたところ、冒頭の通り同じライブラリのインストール状況で違うバイナリが生成されました。MacPortsのバイナリダウンロードという仕組みが良くないのか、groongaの必須ではなくあれば使うという依存関係が特殊なせいなのか、どちらなのか分からないけど、はまりそうな動きなので注意が必要です。

ちなみに、それぞれ何処からダウンロードされるかというと
$ sudo port install groonga
--->  Computing dependencies for groonga
--->  Fetching archive for groonga
--->  Attempting to fetch groonga-2.0.8_0.darwin_11.x86_64.tbz2 from http://packages.macports.org/groonga
--->  Attempting to fetch groonga-2.0.8_0.darwin_11.x86_64.tbz2.rmd160 from http://packages.macports.org/groonga
[Snip]

バイナリダウンロードの場合。

$ sudo port install -s groonga
--->  Computing dependencies for groonga
--->  Fetching distfiles for groonga
--->  Attempting to fetch groonga-2.0.8.tar.gz from http://packages.groonga.org/source/groonga/
[Snip]

ソースダウンロードの場合。

環境

Mac Mac OS X 10.5.8(Leopard
MacPorts 2.1.2
groonga 2.0.8

*1:自分の場合-bオプション無しでバイナリダウンロードした