2007年11月21日水曜日

(FreeBSD) /usr/local/bin/libtool: /usr/local/bin/sed: not found というエラー

たぶん、このエラーメッセージを見る人はあまりいないんじゃないかと思うのですが、libtoolを実行したときに

/usr/local/bin/libtool: /usr/local/bin/sed: not found

というエラーが、状況によっては、確実に出ます。



not foundというように、/usr/local/bin/sedは存在しないのですが、なぜかlibtoolは、/usr/local/bin/sedを実行しようとします。



この現象は、以下のような状況が成立したときに、発生しています。



  1. あるホストAで、ports/devel/libtool15 にて、make packageして、バイナリパッケージを作成する。


  2. ホストAには、たまたま/usr/local/bin/sedが存在する。このsedは、ports/japanese/sedからインストールされたもの。


  3. すると、バイナリパッケージに入ってるlibtool(シェルスクリプトです)は、/usr/local/bin/sedを実行するようになっている。


  4. 別のホストBにて、バイナリパッケージでlibtoolをインストールする。


  5. ホストBでは、japanese/sedがたまたまインストールされていないとすると、/usr/local/bin/sedは存在しない。


  6. その結果、ホストBでlibtoolを実行すると、/usr/local/bin/libtool: /usr/local/bin/sed: not found となる。


libtoolのパッケージには、依存するパッケージとして、ja-sedが含まれていないんですよね。

# pkg_info -r /usr/ports/packages/All/libtool-1.5.24.tbz
Information for /usr/ports/packages/All/libtool-1.5.24.tbz:



Depends on:

もしもlibtoolが/usr/local/bin/sedを使うようにビルドされたのなら、依存するパッケージとして、ja-sedも入れば問題は起きないのですが、ちょっとportsの作り方がめんどくさくなっちゃいますね。



ホストBでも、ja-sedをインストールしてしまえば、とりあえずOKですかと。



ちなみに、なぜこんな状況がおきるかというと、



  • 複数のFreeBSDマシンがある環境にて、1台でのみportsからバイナリパッケージをビルドして、


  • そのほかのFreeBSDマシンでは、バイナリパッケージを使っている


からです。あまり知られていないかもれしないですけど、portupgrade -Pで、バイナリパッケージを利用してバージョンアップができるんです。でも・・・しばしばトラブルがおきるんですけど(笑)・・・
まれに、依存関係がうまく管理できていないらしくて、足りないものが出たりするんです。まさに、今回のlibtoolがその実例か?!





ふと手元にあるFreeBSDマシンで、libtoolを調べてみたら

# grep sed /usr/local/bin/libtool | head -3
# A sed program that does not truncate output.
SED="/usr/local/bin/gsed"
Xsed="/usr/local/bin/gsed -e 1s/^X//"

/usr/local/bin/sedではなくて、/usr/local/bin/gsedを呼んでました。



なんだこれ?と思ったら、

# pkg_which /usr/local/bin/gsed
gsed-4.1.5_1

という、ports/textproc/gsed/にあるもので、依存関係により自動的にインストールされてたみたいです。



たとえば、rpm4とかでインストールされてしまうみたいです。

# grep gsed archivers/rpm4/Makefile
BUILD_DEPENDS=  ${LOCALBASE}/bin/gsed:${PORTSDIR}/textproc/gsed



0 件のコメント:

コメントを投稿