ttt

getttyent

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

2007-11-20 23:28:36 | デジタル・インターネット

たぶん、このエラーメッセージを見る人はあまりいないんじゃないかと思うのですが、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